KiCad PCB EDA Suite
SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI Struct Reference

#include <shape_poly_set.h>

Inheritance diagram for SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI:
SHAPE_LINE_CHAIN_BASE SHAPE SHAPE_BASE

Public Member Functions

 TRI (int _a=0, int _b=0, int _c=0, TRIANGULATED_POLYGON *aParent=nullptr)
 
virtual void Rotate (const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
 
virtual void Move (const VECTOR2I &aVector) override
 
virtual bool IsSolid () const override
 
virtual bool IsClosed () const override
 
virtual const BOX2I BBox (int aClearance=0) const override
 Compute a bounding box of the shape, with a margin of aClearance a collision. More...
 
virtual const VECTOR2I GetPoint (int aIndex) const override
 
virtual const SEG GetSegment (int aIndex) const override
 
virtual size_t GetPointCount () const override
 
virtual size_t GetSegmentCount () const override
 
virtual bool Collide (const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
 Check if point aP lies closer to us than aClearance. More...
 
virtual bool Collide (const SEG &aSeg, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
 Check if segment aSeg lies closer to us than aClearance. More...
 
virtual bool Collide (const SHAPE *aShape, int aClearance, VECTOR2I *aMTV) const
 Check if the boundary of shape (this) lies closer to the shape aShape than aClearance, indicating a collision. More...
 
virtual bool Collide (const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const
 
SEG::ecoord SquaredDistance (const VECTOR2I &aP, bool aOutlineOnly=false) const
 
bool PointInside (const VECTOR2I &aPt, int aAccuracy=0, bool aUseBBoxCache=false) const
 Check if point aP lies inside a polygon (any type) defined by the line chain. More...
 
bool PointOnEdge (const VECTOR2I &aP, int aAccuracy=0) const
 Check if point aP lies on an edge or vertex of the line chain. More...
 
int EdgeContainingPoint (const VECTOR2I &aP, int aAccuracy=0) const
 Check if point aP lies on an edge or vertex of the line chain. More...
 
virtual BOX2IGetCachedBBox () const
 
virtual SHAPEClone () const
 Return a dynamically allocated copy of the shape. More...
 
int GetClearance (const SHAPE *aOther) const
 Return the actual minimum distance between two shapes. More...
 
bool IsNull () const
 Return true if the shape is a null shape. More...
 
virtual VECTOR2I Centre () const
 Compute a center-of-mass of the shape. More...
 
virtual bool Parse (std::stringstream &aStream)
 
virtual const std::string Format () const
 
FACETNewFacet ()
 
SGNODECalcShape (SGNODE *aParent, SGNODE *aColor, WRL1_ORDER aVertexOrder, float aCreaseLimit=0.74317, bool isVRML2=false)
 
SHAPE_TYPE Type () const
 Return the type of the shape. More...
 
wxString TypeName () const
 
virtual bool HasIndexableSubshapes () const
 
virtual size_t GetIndexableSubshapeCount () const
 
virtual void GetIndexableSubshapes (std::vector< const SHAPE * > &aSubshapes) const
 

Public Attributes

int a
 
int b
 
int c
 
TRIANGULATED_POLYGONparent
 

Static Public Attributes

static const int MIN_PRECISION_IU = 4
 This is the minimum precision for all the points in a shape. More...
 

Protected Types

typedef VECTOR2I::extended_type ecoord
 

Protected Attributes

SHAPE_TYPE m_type
 < type of our shape More...
 

Private Attributes

std::list< FACET * > facets
 

Detailed Description

Definition at line 75 of file shape_poly_set.h.

Member Typedef Documentation

◆ ecoord

typedef VECTOR2I::extended_type SHAPE::ecoord
protectedinherited

Definition at line 249 of file shape.h.

Constructor & Destructor Documentation

◆ TRI()

SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::TRI ( int  _a = 0,
int  _b = 0,
int  _c = 0,
TRIANGULATED_POLYGON aParent = nullptr 
)
inline

Definition at line 77 of file shape_poly_set.h.

77 :
79 a( _a ),
80 b( _b ),
81 c( _c ),
82 parent( aParent )
83 {
84 }
SHAPE_LINE_CHAIN_BASE(SHAPE_TYPE aType)
Definition: shape.h:256
@ SH_POLY_SET_TRIANGLE
a single triangle belonging to a POLY_SET triangulation
Definition: shape.h:53

Member Function Documentation

◆ BBox()

const BOX2I SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::BBox ( int  aClearance = 0) const
overridevirtual

Compute a bounding box of the shape, with a margin of aClearance a collision.

Parameters
aClearancehow much the bounding box is expanded wrs to the minimum enclosing rectangle for the shape.
Returns
the bounding box.

Implements SHAPE.

Definition at line 2541 of file shape_poly_set.cpp.

2542{
2543 BOX2I bbox( parent->m_vertices[a] );
2544 bbox.Merge( parent->m_vertices[b] );
2545 bbox.Merge( parent->m_vertices[c] );
2546
2547 if( aClearance != 0 )
2548 bbox.Inflate( aClearance );
2549
2550 return bbox;
2551}

References a, b, c, BOX2< Vec >::Inflate(), SHAPE_POLY_SET::TRIANGULATED_POLYGON::m_vertices, BOX2< Vec >::Merge(), and parent.

◆ CalcShape()

SGNODE * SHAPE::CalcShape ( SGNODE aParent,
SGNODE aColor,
WRL1_ORDER  aVertexOrder,
float  aCreaseLimit = 0.74317,
bool  isVRML2 = false 
)
inherited

Definition at line 703 of file wrlfacet.cpp.

705{
706 if( facets.empty() || !facets.front()->HasMinPoints() )
707 return nullptr;
708
709 std::vector< std::list< FACET* > > flist;
710
711 // determine the max. index and size flist as appropriate
712 std::list< FACET* >::iterator sF = facets.begin();
713 std::list< FACET* >::iterator eF = facets.end();
714
715 int maxIdx = 0;
716 int tmi;
717 float maxV = 0.0;
718 float tV = 0.0;
719
720 while( sF != eF )
721 {
722 tV = ( *sF )->CalcFaceNormal();
723 tmi = ( *sF )->GetMaxIndex();
724
725 if( tmi > maxIdx )
726 maxIdx = tmi;
727
728 if( tV > maxV )
729 maxV = tV;
730
731 ++sF;
732 }
733
734 ++maxIdx;
735
736 if( maxIdx < 3 )
737 return nullptr;
738
739 flist.resize( maxIdx );
740
741 // create the lists of facets common to indices
742 sF = facets.begin();
743
744 while( sF != eF )
745 {
746 ( *sF )->Renormalize( tV );
747 ( *sF )->CollectVertices( flist );
748 ++sF;
749 }
750
751 // calculate the normals
752 size_t vs = flist.size();
753
754 for( size_t i = 0; i < vs; ++i )
755 {
756 sF = flist[i].begin();
757 eF = flist[i].end();
758
759 while( sF != eF )
760 {
761 ( *sF )->CalcVertexNormal( static_cast<int>( i ), flist[i], aCreaseLimit );
762 ++sF;
763 }
764 }
765
766 std::vector< WRLVEC3F > vertices;
767 std::vector< WRLVEC3F > normals;
768 std::vector< SGCOLOR > colors;
769
770 // push the facet data to the final output list
771 sF = facets.begin();
772 eF = facets.end();
773
774 while( sF != eF )
775 {
776 ( *sF )->GetData( vertices, normals, colors, aVertexOrder );
777 ++sF;
778 }
779
780 flist.clear();
781
782 if( vertices.size() < 3 )
783 return nullptr;
784
785 IFSG_SHAPE shapeNode( false );
786
787 if( !isVRML2 )
788 {
789 shapeNode.NewNode( aParent );
790
791 if( aColor )
792 {
793 if( nullptr == S3D::GetSGNodeParent( aColor ) )
794 shapeNode.AddChildNode( aColor );
795 else
796 shapeNode.AddRefNode( aColor );
797 }
798 }
799
800 std::vector< SGPOINT > lCPts; // vertex points in SGPOINT (double) format
801 std::vector< SGVECTOR > lCNorm; // per-vertex normals
802 vs = vertices.size();
803
804 for( size_t i = 0; i < vs; ++i )
805 {
806 SGPOINT pt;
807 pt.x = vertices[i].x;
808 pt.y = vertices[i].y;
809 pt.z = vertices[i].z;
810 lCPts.push_back( pt );
811 lCNorm.emplace_back( normals[i].x, normals[i].y, normals[i].z );
812 }
813
814 vertices.clear();
815 normals.clear();
816
817 IFSG_FACESET fsNode( false );
818
819 if( !isVRML2 )
820 fsNode.NewNode( shapeNode );
821 else
822 fsNode.NewNode( aParent );
823
824 IFSG_COORDS cpNode( fsNode );
825 cpNode.SetCoordsList( lCPts.size(), &lCPts[0] );
826 IFSG_COORDINDEX ciNode( fsNode );
827
828 for( int i = 0; i < (int)lCPts.size(); ++i )
829 ciNode.AddIndex( i );
830
831 IFSG_NORMALS nmNode( fsNode );
832 nmNode.SetNormalList( lCNorm.size(), &lCNorm[0] );
833
834 if( !colors.empty() )
835 {
836 IFSG_COLORS nmColor( fsNode );
837 nmColor.SetColorList( colors.size(), &colors[0] );
838 colors.clear();
839 }
840
841 if( !isVRML2 )
842 return shapeNode.GetRawPtr();
843
844 return fsNode.GetRawPtr();
845}
IFSG_COLORS is the wrapper for SGCOLORS.
Definition: ifsg_colors.h:42
IFSG_COORDINDEX is the wrapper for SGCOORDINDEX.
IFSG_COORDS is the wrapper for SGCOORDS.
Definition: ifsg_coords.h:41
IFSG_FACESET is the wrapper for the SGFACESET class.
Definition: ifsg_faceset.h:41
IFSG_NORMALS is the wrapper for the SGNORMALS class.
Definition: ifsg_normals.h:41
IFSG_SHAPE is the wrapper for the SGSHAPE class.
Definition: ifsg_shape.h:41
double z
Definition: sg_base.h:72
double x
Definition: sg_base.h:70
double y
Definition: sg_base.h:71
std::list< FACET * > facets
Definition: wrlfacet.h:143
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
Definition: ifsg_api.cpp:494

References IFSG_NODE::AddChildNode(), IFSG_INDEX::AddIndex(), IFSG_NODE::AddRefNode(), SHAPE::facets, IFSG_NODE::GetRawPtr(), S3D::GetSGNodeParent(), IFSG_FACESET::NewNode(), IFSG_SHAPE::NewNode(), IFSG_COLORS::SetColorList(), IFSG_COORDS::SetCoordsList(), IFSG_NORMALS::SetNormalList(), SGPOINT::x, SGPOINT::y, and SGPOINT::z.

Referenced by WRL2FACESET::TranslateToSG(), X3DIFACESET::TranslateToSG(), and WRL1FACESET::TranslateToSG().

◆ Centre()

virtual VECTOR2I SHAPE::Centre ( ) const
inlinevirtualinherited

Compute a center-of-mass of the shape.

Returns
the center-of-mass point

Definition at line 229 of file shape.h.

230 {
231 return BBox( 0 ).Centre(); // if nothing better is available....
232 }
Vec Centre() const
Definition: box2.h:63
virtual const BOX2I BBox(int aClearance=0) const =0
Compute a bounding box of the shape, with a margin of aClearance a collision.

References SHAPE::BBox(), and BOX2< Vec >::Centre().

Referenced by Collide().

◆ Clone()

virtual SHAPE * SHAPE::Clone ( ) const
inlinevirtualinherited

Return a dynamically allocated copy of the shape.

Return values
copyof the shape

Reimplemented in SHAPE_ARC, SHAPE_CIRCLE, SHAPE_COMPOUND, SHAPE_LINE_CHAIN, SHAPE_NULL, SHAPE_POLY_SET, SHAPE_RECT, SHAPE_SEGMENT, and SHAPE_SIMPLE.

Definition at line 145 of file shape.h.

146 {
147 assert( false );
148 return nullptr;
149 };

Referenced by PNS_TEST_DEBUG_DECORATOR::AddItem(), PNS_TEST_DEBUG_DECORATOR::AddShape(), PNS::ROUTER::markViolations(), ROUTER_PREVIEW_ITEM::ROUTER_PREVIEW_ITEM(), PNS::SOLID::SOLID(), and ROUTER_PREVIEW_ITEM::Update().

◆ Collide() [1/4]

bool SHAPE_LINE_CHAIN_BASE::Collide ( const SEG aSeg,
int  aClearance = 0,
int *  aActual = nullptr,
VECTOR2I aLocation = nullptr 
) const
overridevirtualinherited

Check if segment aSeg lies closer to us than aClearance.

Parameters
aSegthe segment to check for collisions with
aClearanceminimum distance that does not qualify as a collision.
aActualan optional pointer to an int to store the actual distance in the event of a collision.
Returns
true, when a collision has been found

Implements SHAPE.

Reimplemented in SHAPE_LINE_CHAIN, and SHAPE_SIMPLE.

Definition at line 433 of file shape_line_chain.cpp.

435{
436 if( IsClosed() && PointInside( aSeg.A ) )
437 {
438 if( aLocation )
439 *aLocation = aSeg.A;
440
441 if( aActual )
442 *aActual = 0;
443
444 return true;
445 }
446
447 SEG::ecoord closest_dist_sq = VECTOR2I::ECOORD_MAX;
448 SEG::ecoord clearance_sq = SEG::Square( aClearance );
449 VECTOR2I nearest;
450
451 for( size_t i = 0; i < GetSegmentCount(); i++ )
452 {
453 const SEG& s = GetSegment( i );
454 SEG::ecoord dist_sq = s.SquaredDistance( aSeg );
455
456 if( dist_sq < closest_dist_sq )
457 {
458 if( aLocation )
459 nearest = s.NearestPoint( aSeg );
460
461 closest_dist_sq = dist_sq;
462
463 if( closest_dist_sq == 0)
464 break;
465
466 // If we're not looking for aActual then any collision will do
467 if( closest_dist_sq < clearance_sq && !aActual )
468 break;
469 }
470 }
471
472 if( closest_dist_sq == 0 || closest_dist_sq < clearance_sq )
473 {
474 if( aLocation )
475 *aLocation = nearest;
476
477 if( aActual )
478 *aActual = sqrt( closest_dist_sq );
479
480 return true;
481 }
482
483 return false;
484}
Definition: seg.h:42
VECTOR2I A
Definition: seg.h:49
ecoord SquaredDistance(const SEG &aSeg) const
Definition: seg.cpp:75
VECTOR2I::extended_type ecoord
Definition: seg.h:44
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Compute a point on the segment (this) that is closest to point aP.
Definition: seg.cpp:261
static SEG::ecoord Square(int a)
Definition: seg.h:123
bool PointInside(const VECTOR2I &aPt, int aAccuracy=0, bool aUseBBoxCache=false) const
Check if point aP lies inside a polygon (any type) defined by the line chain.
virtual size_t GetSegmentCount() const =0
virtual bool IsClosed() const =0
virtual const SEG GetSegment(int aIndex) const =0
static constexpr extended_type ECOORD_MAX
Definition: vector2d.h:79

References SEG::A, VECTOR2< int >::ECOORD_MAX, SHAPE_LINE_CHAIN_BASE::GetSegment(), SHAPE_LINE_CHAIN_BASE::GetSegmentCount(), SHAPE_LINE_CHAIN_BASE::IsClosed(), SEG::NearestPoint(), SHAPE_LINE_CHAIN_BASE::PointInside(), SEG::Square(), and SEG::SquaredDistance().

◆ Collide() [2/4]

bool SHAPE::Collide ( const SHAPE aShape,
int  aClearance,
VECTOR2I aMTV 
) const
virtualinherited

Check if the boundary of shape (this) lies closer to the shape aShape than aClearance, indicating a collision.

Parameters
aShapeshape to check collision against
aClearanceminimum clearance
aMTVminimum translation vector
aActual[out] an optional pointer to an int to store the actual distance in the event of a collision.
aLocation[out] an option pointer to a point to store a nearby location in the event of a collision.
Returns
true, if there is a collision.

Reimplemented in SHAPE_COMPOUND, SHAPE_RECT, and SHAPE_SEGMENT.

Definition at line 1109 of file shape_collisions.cpp.

1110{
1111 return collideShapes( this, aShape, aClearance, nullptr, nullptr, aMTV );
1112}
static bool collideShapes(const SHAPE *aA, const SHAPE *aB, int aClearance, int *aActual, VECTOR2I *aLocation, VECTOR2I *aMTV)

References collideShapes().

◆ Collide() [3/4]

bool SHAPE::Collide ( const SHAPE aShape,
int  aClearance = 0,
int *  aActual = nullptr,
VECTOR2I aLocation = nullptr 
) const
virtualinherited

Reimplemented in SHAPE_ARC, SHAPE_COMPOUND, SHAPE_POLY_SET, SHAPE_RECT, and SHAPE_SEGMENT.

Definition at line 1115 of file shape_collisions.cpp.

1116{
1117 return collideShapes( this, aShape, aClearance, aActual, aLocation, nullptr );
1118}

References collideShapes().

◆ Collide() [4/4]

bool SHAPE_LINE_CHAIN_BASE::Collide ( const VECTOR2I aP,
int  aClearance = 0,
int *  aActual = nullptr,
VECTOR2I aLocation = nullptr 
) const
overridevirtualinherited

Check if point aP lies closer to us than aClearance.

Parameters
aPthe point to check for collisions with
aClearanceminimum distance that does not qualify as a collision.
aActualan optional pointer to an int to store the actual distance in the event of a collision.
Returns
true, when a collision has been found

Reimplemented from SHAPE.

Reimplemented in SHAPE_LINE_CHAIN.

Definition at line 301 of file shape_line_chain.cpp.

303{
304 if( IsClosed() && PointInside( aP, aClearance ) )
305 {
306 if( aLocation )
307 *aLocation = aP;
308
309 if( aActual )
310 *aActual = 0;
311
312 return true;
313 }
314
315 SEG::ecoord closest_dist_sq = VECTOR2I::ECOORD_MAX;
316 SEG::ecoord clearance_sq = SEG::Square( aClearance );
317 VECTOR2I nearest;
318
319 for( size_t i = 0; i < GetSegmentCount(); i++ )
320 {
321 const SEG& s = GetSegment( i );
322 VECTOR2I pn = s.NearestPoint( aP );
323 SEG::ecoord dist_sq = ( pn - aP ).SquaredEuclideanNorm();
324
325 if( dist_sq < closest_dist_sq )
326 {
327 nearest = pn;
328 closest_dist_sq = dist_sq;
329
330 if( closest_dist_sq == 0 )
331 break;
332
333 // If we're not looking for aActual then any collision will do
334 if( closest_dist_sq < clearance_sq && !aActual )
335 break;
336 }
337 }
338
339 if( closest_dist_sq == 0 || closest_dist_sq < clearance_sq )
340 {
341 if( aLocation )
342 *aLocation = nearest;
343
344 if( aActual )
345 *aActual = sqrt( closest_dist_sq );
346
347 return true;
348 }
349
350 return false;
351}

References VECTOR2< int >::ECOORD_MAX, SHAPE_LINE_CHAIN_BASE::GetSegment(), SHAPE_LINE_CHAIN_BASE::GetSegmentCount(), SHAPE_LINE_CHAIN_BASE::IsClosed(), SEG::NearestPoint(), SHAPE_LINE_CHAIN_BASE::PointInside(), and SEG::Square().

Referenced by Collide().

◆ EdgeContainingPoint()

int SHAPE_LINE_CHAIN_BASE::EdgeContainingPoint ( const VECTOR2I aP,
int  aAccuracy = 0 
) const
inherited

Check if point aP lies on an edge or vertex of the line chain.

Parameters
aPpoint to check
Returns
index of the first edge containing the point, otherwise negative

Definition at line 1589 of file shape_line_chain.cpp.

1590{
1591 if( !GetPointCount() )
1592 {
1593 return -1;
1594 }
1595 else if( GetPointCount() == 1 )
1596 {
1597 VECTOR2I dist = GetPoint(0) - aPt;
1598 return ( hypot( dist.x, dist.y ) <= aAccuracy + 1 ) ? 0 : -1;
1599 }
1600
1601 for( size_t i = 0; i < GetSegmentCount(); i++ )
1602 {
1603 const SEG s = GetSegment( i );
1604
1605 if( s.A == aPt || s.B == aPt )
1606 return i;
1607
1608 if( s.Distance( aPt ) <= aAccuracy + 1 )
1609 return i;
1610 }
1611
1612 return -1;
1613}
VECTOR2I B
Definition: seg.h:50
int Distance(const SEG &aSeg) const
Compute minimum Euclidean distance to segment aSeg.
Definition: seg.cpp:319
virtual size_t GetPointCount() const =0
virtual const VECTOR2I GetPoint(int aIndex) const =0

References SEG::A, SEG::B, SEG::Distance(), SHAPE_LINE_CHAIN_BASE::GetPoint(), SHAPE_LINE_CHAIN_BASE::GetPointCount(), SHAPE_LINE_CHAIN_BASE::GetSegment(), SHAPE_LINE_CHAIN_BASE::GetSegmentCount(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by SHAPE_LINE_CHAIN_BASE::PointOnEdge().

◆ Format()

const std::string SHAPE::Format ( ) const
virtualinherited

Reimplemented in SHAPE_COMPOUND, SHAPE_LINE_CHAIN, SHAPE_POLY_SET, SHAPE_RECT, and SHAPE_SEGMENT.

Definition at line 41 of file shape.cpp.

42{
43 assert( false );
44 return std::string( "" );
45}

Referenced by SHAPE_FILE_IO::Write().

◆ GetCachedBBox()

virtual BOX2I * SHAPE_LINE_CHAIN_BASE::GetCachedBBox ( ) const
inlinevirtualinherited

Reimplemented in SHAPE_LINE_CHAIN.

Definition at line 325 of file shape.h.

325{ return nullptr; }

Referenced by SHAPE_LINE_CHAIN_BASE::PointInside().

◆ GetClearance()

int SHAPE::GetClearance ( const SHAPE aOther) const
inherited

Return the actual minimum distance between two shapes.

Return values
distancein IU

Definition at line 48 of file shape.cpp.

49{
50 int actual_clearance = std::numeric_limits<int>::max();
51 std::vector<const SHAPE*> a_shapes;
52 std::vector<const SHAPE*> b_shapes;
53
54 GetIndexableSubshapes( a_shapes );
55 aOther->GetIndexableSubshapes( b_shapes );
56
57 if( GetIndexableSubshapeCount() == 0 )
58 a_shapes.push_back( this );
59
60 if( aOther->GetIndexableSubshapeCount() == 0 )
61 b_shapes.push_back( aOther );
62
63 for( const SHAPE* a : a_shapes )
64 {
65 for( const SHAPE* b : b_shapes )
66 {
67 int temp_dist = 0;
68 a->Collide( b, std::numeric_limits<int>::max() / 2, &temp_dist );
69
70 if( temp_dist < actual_clearance )
71 actual_clearance = temp_dist;
72 }
73 }
74
75 return actual_clearance;
76}
virtual size_t GetIndexableSubshapeCount() const
Definition: shape.h:110
virtual void GetIndexableSubshapes(std::vector< const SHAPE * > &aSubshapes) const
Definition: shape.h:112
An abstract shape on 2D plane.
Definition: shape.h:123

References SHAPE_BASE::GetIndexableSubshapeCount(), and SHAPE_BASE::GetIndexableSubshapes().

◆ GetIndexableSubshapeCount()

virtual size_t SHAPE_BASE::GetIndexableSubshapeCount ( ) const
inlinevirtualinherited

Reimplemented in SHAPE_COMPOUND, and SHAPE_POLY_SET.

Definition at line 110 of file shape.h.

110{ return 0; }

Referenced by SHAPE::GetClearance().

◆ GetIndexableSubshapes()

virtual void SHAPE_BASE::GetIndexableSubshapes ( std::vector< const SHAPE * > &  aSubshapes) const
inlinevirtualinherited

Reimplemented in SHAPE_COMPOUND, and SHAPE_POLY_SET.

Definition at line 112 of file shape.h.

112{ }

Referenced by SHAPE_COMPOUND::AddShape(), SHAPE::GetClearance(), and ROUTER_PREVIEW_ITEM::ViewDraw().

◆ GetPoint()

virtual const VECTOR2I SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::GetPoint ( int  aIndex) const
inlineoverridevirtual

Implements SHAPE_LINE_CHAIN_BASE.

Definition at line 97 of file shape_poly_set.h.

98 {
99 switch(aIndex)
100 {
101 case 0: return parent->m_vertices[a];
102 case 1: return parent->m_vertices[b];
103 case 2: return parent->m_vertices[c];
104 default: wxCHECK( false, VECTOR2I() );
105 }
106 }
VECTOR2< int > VECTOR2I
Definition: vector2d.h:607

References a, b, c, SHAPE_POLY_SET::TRIANGULATED_POLYGON::m_vertices, and parent.

◆ GetPointCount()

virtual size_t SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::GetPointCount ( ) const
inlineoverridevirtual

Implements SHAPE_LINE_CHAIN_BASE.

Definition at line 119 of file shape_poly_set.h.

119{ return 3; }

◆ GetSegment()

virtual const SEG SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::GetSegment ( int  aIndex) const
inlineoverridevirtual

Implements SHAPE_LINE_CHAIN_BASE.

Definition at line 108 of file shape_poly_set.h.

109 {
110 switch(aIndex)
111 {
112 case 0: return SEG( parent->m_vertices[a], parent->m_vertices[b] );
113 case 1: return SEG( parent->m_vertices[b], parent->m_vertices[c] );
114 case 2: return SEG( parent->m_vertices[c], parent->m_vertices[a] );
115 default: wxCHECK( false, SEG() );
116 }
117 }

References a, b, c, SHAPE_POLY_SET::TRIANGULATED_POLYGON::m_vertices, and parent.

◆ GetSegmentCount()

virtual size_t SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::GetSegmentCount ( ) const
inlineoverridevirtual

Implements SHAPE_LINE_CHAIN_BASE.

Definition at line 120 of file shape_poly_set.h.

120{ return 3; }

◆ HasIndexableSubshapes()

virtual bool SHAPE_BASE::HasIndexableSubshapes ( ) const
inlinevirtualinherited

Reimplemented in SHAPE_COMPOUND, and SHAPE_POLY_SET.

Definition at line 105 of file shape.h.

106 {
107 return false;
108 }

Referenced by SHAPE_COMPOUND::AddShape(), and ROUTER_PREVIEW_ITEM::ViewDraw().

◆ IsClosed()

virtual bool SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::IsClosed ( ) const
inlineoverridevirtual

Implements SHAPE_LINE_CHAIN_BASE.

Definition at line 93 of file shape_poly_set.h.

93{ return true; }

◆ IsNull()

bool SHAPE::IsNull ( ) const
inlineinherited

Return true if the shape is a null shape.

Return values
trueif null :-)

Definition at line 163 of file shape.h.

164 {
165 return m_type == SH_NULL;
166 }
SHAPE_TYPE m_type
< type of our shape
Definition: shape.h:116
@ SH_NULL
empty shape (no shape...),
Definition: shape.h:52

References SHAPE_BASE::m_type, and SH_NULL.

◆ IsSolid()

virtual bool SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::IsSolid ( ) const
inlineoverridevirtual

Implements SHAPE.

Definition at line 91 of file shape_poly_set.h.

91{ return true; }

◆ Move()

virtual void SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::Move ( const VECTOR2I aVector)
inlineoverridevirtual

Implements SHAPE.

Definition at line 89 of file shape_poly_set.h.

89{};

◆ NewFacet()

FACET * SHAPE::NewFacet ( )
inherited

Definition at line 695 of file wrlfacet.cpp.

696{
697 FACET* fp = new FACET;
698 facets.push_back( fp );
699 return fp;
700}
Definition: wrlfacet.h:43

References SHAPE::facets.

Referenced by WRL2FACESET::TranslateToSG(), X3DIFACESET::TranslateToSG(), and WRL1FACESET::TranslateToSG().

◆ Parse()

bool SHAPE::Parse ( std::stringstream &  aStream)
virtualinherited

Reimplemented in SHAPE_LINE_CHAIN, and SHAPE_POLY_SET.

Definition at line 34 of file shape.cpp.

35{
36 assert( false );
37 return false;
38}

◆ PointInside()

bool SHAPE_LINE_CHAIN_BASE::PointInside ( const VECTOR2I aPt,
int  aAccuracy = 0,
bool  aUseBBoxCache = false 
) const
inherited

Check if point aP lies inside a polygon (any type) defined by the line chain.

For closed shapes only.

Parameters
aPtpoint to check
aUseBBoxCachegives better performance if the bounding box caches have been generated.
Returns
true if the point is inside the shape (edge is not treated as being inside).

Definition at line 1531 of file shape_line_chain.cpp.

1533{
1534 /*
1535 * Don't check the bounding box unless it's cached. Building it is about the same speed as
1536 * the rigorous test below and so just slows things down by doing potentially two tests.
1537 */
1538 if( aUseBBoxCache && GetCachedBBox() && !GetCachedBBox()->Contains( aPt ) )
1539 return false;
1540
1541 if( !IsClosed() || GetPointCount() < 3 )
1542 return false;
1543
1544 bool inside = false;
1545
1546 /*
1547 * To check for interior points, we draw a line in the positive x direction from
1548 * the point. If it intersects an even number of segments, the point is outside the
1549 * line chain (it had to first enter and then exit). Otherwise, it is inside the chain.
1550 *
1551 * Note: slope might be denormal here in the case of a horizontal line but we require our
1552 * y to move from above to below the point (or vice versa)
1553 *
1554 * Note: we open-code CPoint() here so that we don't end up calculating the size of the
1555 * vector number-of-points times. This has a non-trivial impact on zone fill times.
1556 */
1557 int pointCount = GetPointCount();
1558
1559 for( int i = 0; i < pointCount; )
1560 {
1561 const auto p1 = GetPoint( i++ );
1562 const auto p2 = GetPoint( i == pointCount ? 0 : i );
1563 const auto diff = p2 - p1;
1564
1565 if( diff.y != 0 )
1566 {
1567 const int d = rescale( diff.x, ( aPt.y - p1.y ), diff.y );
1568
1569 if( ( ( p1.y > aPt.y ) != ( p2.y > aPt.y ) ) && ( aPt.x - p1.x < d ) )
1570 inside = !inside;
1571 }
1572 }
1573
1574 // If accuracy is <= 1 (nm) then we skip the accuracy test for performance. Otherwise
1575 // we use "OnEdge(accuracy)" as a proxy for "Inside(accuracy)".
1576 if( aAccuracy <= 1 )
1577 return inside;
1578 else
1579 return inside || PointOnEdge( aPt, aAccuracy );
1580}
bool PointOnEdge(const VECTOR2I &aP, int aAccuracy=0) const
Check if point aP lies on an edge or vertex of the line chain.
virtual BOX2I * GetCachedBBox() const
Definition: shape.h:325
T rescale(T aNumerator, T aValue, T aDenominator)
Scale a number (value) by rational (numerator/denominator).
Definition: util.h:105

References SHAPE_LINE_CHAIN_BASE::GetCachedBBox(), SHAPE_LINE_CHAIN_BASE::GetPoint(), SHAPE_LINE_CHAIN_BASE::GetPointCount(), SHAPE_LINE_CHAIN_BASE::IsClosed(), SHAPE_LINE_CHAIN_BASE::PointOnEdge(), rescale(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Collide(), SHAPE_LINE_CHAIN_BASE::Collide(), SHAPE_LINE_CHAIN::Collide(), SHAPE_POLY_SET::containsSingle(), ZONE::HitTestCutout(), MARKER_BASE::HitTestMarker(), CONNECTIVITY_DATA::IsConnectedOnLayer(), DRC_RTREE::QueryColliding(), SHAPE_LINE_CHAIN_BASE::SquaredDistance(), DRC_TEST_PROVIDER_ZONE_CONNECTIONS::testZoneLayer(), and PNS::LINE::Walkaround().

◆ PointOnEdge()

bool SHAPE_LINE_CHAIN_BASE::PointOnEdge ( const VECTOR2I aP,
int  aAccuracy = 0 
) const
inherited

Check if point aP lies on an edge or vertex of the line chain.

Parameters
aPpoint to check
Returns
true if the point lies on the edge.

Definition at line 1583 of file shape_line_chain.cpp.

1584{
1585 return EdgeContainingPoint( aPt, aAccuracy ) >= 0;
1586}
int EdgeContainingPoint(const VECTOR2I &aP, int aAccuracy=0) const
Check if point aP lies on an edge or vertex of the line chain.

References SHAPE_LINE_CHAIN_BASE::EdgeContainingPoint().

Referenced by FABMASTER::loadZones(), SHAPE_LINE_CHAIN_BASE::PointInside(), and PNS::LINE::Walkaround().

◆ Rotate()

virtual void SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::Rotate ( const EDA_ANGLE aAngle,
const VECTOR2I aCenter = { 0, 0 } 
)
inlineoverridevirtual
Parameters
aCenteris the rotation center.
aAnglerotation angle.

Implements SHAPE.

Definition at line 86 of file shape_poly_set.h.

87 { 0, 0 } ) override {};

◆ SquaredDistance()

SEG::ecoord SHAPE_LINE_CHAIN_BASE::SquaredDistance ( const VECTOR2I aP,
bool  aOutlineOnly = false 
) const
inherited

Definition at line 800 of file shape_line_chain.cpp.

801{
803
804 if( IsClosed() && PointInside( aP ) && !aOutlineOnly )
805 return 0;
806
807 for( size_t s = 0; s < GetSegmentCount(); s++ )
808 d = std::min( d, GetSegment( s ).SquaredDistance( aP ) );
809
810 return d;
811}
VECTOR2I::extended_type ecoord

References VECTOR2< int >::ECOORD_MAX, SHAPE_LINE_CHAIN_BASE::GetSegment(), SHAPE_LINE_CHAIN_BASE::GetSegmentCount(), SHAPE_LINE_CHAIN_BASE::IsClosed(), SHAPE_LINE_CHAIN_BASE::PointInside(), and SEG::SquaredDistance().

Referenced by SHAPE_LINE_CHAIN::Distance().

◆ Type()

◆ TypeName()

wxString SHAPE_BASE::TypeName ( ) const
inlineinherited

Definition at line 100 of file shape.h.

101 {
102 return SHAPE_TYPE_asString( m_type );
103 }
static wxString SHAPE_TYPE_asString(SHAPE_TYPE a)
Definition: shape.h:56

References SHAPE_BASE::m_type, and SHAPE_TYPE_asString().

Referenced by Collide().

Member Data Documentation

◆ a

int SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::a

Definition at line 122 of file shape_poly_set.h.

Referenced by BBox(), GetPoint(), and GetSegment().

◆ b

int SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::b

Definition at line 123 of file shape_poly_set.h.

Referenced by BBox(), GetPoint(), and GetSegment().

◆ c

int SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::c

Definition at line 124 of file shape_poly_set.h.

Referenced by BBox(), GetPoint(), and GetSegment().

◆ facets

std::list< FACET* > SHAPE::facets
privateinherited

Definition at line 143 of file wrlfacet.h.

Referenced by SHAPE::CalcShape(), and SHAPE::NewFacet().

◆ m_type

SHAPE_TYPE SHAPE_BASE::m_type
protectedinherited

< type of our shape

Definition at line 116 of file shape.h.

Referenced by SHAPE::IsNull(), SHAPE_BASE::Type(), and SHAPE_BASE::TypeName().

◆ MIN_PRECISION_IU

const int SHAPE::MIN_PRECISION_IU = 4
staticinherited

This is the minimum precision for all the points in a shape.

Definition at line 128 of file shape.h.

Referenced by BOOST_AUTO_TEST_CASE(), DIRECTION_45::BuildInitialTrace(), CompareLength(), CIRCLE::Contains(), EDIT_TOOL::FilletTracks(), and CIRCLE::IntersectLine().

◆ parent

TRIANGULATED_POLYGON* SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::parent

Definition at line 125 of file shape_poly_set.h.

Referenced by BBox(), GetPoint(), and GetSegment().


The documentation for this struct was generated from the following files: