KiCad PCB EDA Suite
SHAPE_ARC Class Reference

#include <shape_arc.h>

Inheritance diagram for SHAPE_ARC:
SHAPE SHAPE_BASE

Public Member Functions

 SHAPE_ARC ()
 
 SHAPE_ARC (const VECTOR2I &aArcCenter, const VECTOR2I &aArcStartPoint, double aCenterAngle, int aWidth=0)
 SHAPE_ARC ctor. More...
 
 SHAPE_ARC (const VECTOR2I &aArcStart, const VECTOR2I &aArcMid, const VECTOR2I &aArcEnd, int aWidth)
 SHAPE_ARC ctor. More...
 
 SHAPE_ARC (const SEG &aSegmentA, const SEG &aSegmentB, int aRadius, int aWidth=0)
 SHAPE_ARC ctor. More...
 
 SHAPE_ARC (const SHAPE_ARC &aOther)
 
virtual ~SHAPE_ARC ()
 
SHAPEClone () const override
 Function Clone() More...
 
const VECTOR2IGetP0 () const
 
const VECTOR2IGetP1 () const
 
const VECTOR2IGetArcMid () const
 
VECTOR2I GetCenter () const
 
const BOX2I BBox (int aClearance=0) const override
 Function BBox() More...
 
bool Collide (const SEG &aSeg, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
 Function Collide() More...
 
bool Collide (const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
 Function Collide() More...
 
void SetWidth (int aWidth)
 
int GetWidth () const
 
bool IsSolid () const override
 
void Move (const VECTOR2I &aVector) override
 
void Rotate (double aAngle, const VECTOR2I &aCenter) override
 Function Rotate rotates the arc by a given angle about a point. More...
 
void Mirror (bool aX=true, bool aY=false, const VECTOR2I &aVector={ 0, 0 })
 
double GetRadius () const
 
SEG GetChord () const
 
double GetCentralAngle () const
 
double GetStartAngle () const
 
double GetEndAngle () const
 
const SHAPE_LINE_CHAIN ConvertToPolyline (double aAccuracy=500.0) const
 Constructs a SHAPE_LINE_CHAIN of segments from a given arc. More...
 
bool IsNull () const
 Function IsNull() More...
 
virtual bool Collide (const SHAPE *aShape, int aClearance, VECTOR2I *aMTV) const
 Function Collide() More...
 
virtual bool Collide (const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const
 
virtual VECTOR2I Centre () const
 Function Centre() 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
 Function Type() More...
 
virtual bool HasIndexableSubshapes () const
 
virtual size_t GetIndexableSubshapeCount () const
 
virtual void GetIndexableSubshapes (std::vector< SHAPE * > &aSubshapes)
 

Static Public Attributes

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

Protected Types

typedef VECTOR2I::extended_type ecoord
 

Protected Attributes

SHAPE_TYPE m_type
 

type of our shape

More...
 

Private Member Functions

bool ccw (const VECTOR2I &aA, const VECTOR2I &aB, const VECTOR2I &aC) const
 
void update_bbox ()
 

Private Attributes

VECTOR2I m_start
 
VECTOR2I m_mid
 
VECTOR2I m_end
 
int m_width
 
BOX2I m_bbox
 

Detailed Description

Definition at line 34 of file shape_arc.h.

Member Typedef Documentation

◆ ecoord

typedef VECTOR2I::extended_type SHAPE::ecoord
protectedinherited

Definition at line 125 of file shape.h.

Constructor & Destructor Documentation

◆ SHAPE_ARC() [1/5]

SHAPE_ARC::SHAPE_ARC ( )
inline

Definition at line 42 of file shape_arc.h.

42  :
43  SHAPE( SH_ARC ), m_width( 0 ) {};
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:134
compound shape, consisting of multiple simple shapes
Definition: shape.h:50
int m_width
Definition: shape_arc.h:161

Referenced by Clone().

◆ SHAPE_ARC() [2/5]

SHAPE_ARC::SHAPE_ARC ( const VECTOR2I aArcCenter,
const VECTOR2I aArcStartPoint,
double  aCenterAngle,
int  aWidth = 0 
)

SHAPE_ARC ctor.

Parameters
aArcCenteris the arc center
aArcStartPointis the arc start point
aCenterAngleis the arc angle in degrees
aWidthis the arc line thickness

Definition at line 33 of file shape_arc.cpp.

34  :
35  SHAPE( SH_ARC ), m_width( aWidth )
36 {
37  m_start = aArcStartPoint;
38  m_mid = aArcStartPoint;
39  m_end = aArcStartPoint;
40 
41  RotatePoint( m_mid, aArcCenter, -aCenterAngle * 10.0 / 2.0 );
42  RotatePoint( m_end, aArcCenter, -aCenterAngle * 10.0 );
43 
44  update_bbox();
45 }
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:134
VECTOR2I m_end
Definition: shape_arc.h:159
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:208
VECTOR2I m_mid
Definition: shape_arc.h:158
compound shape, consisting of multiple simple shapes
Definition: shape.h:50
void update_bbox()
Definition: shape_arc.cpp:240
VECTOR2I m_start
Definition: shape_arc.h:157
int m_width
Definition: shape_arc.h:161

References m_end, m_mid, m_start, RotatePoint(), and update_bbox().

◆ SHAPE_ARC() [3/5]

SHAPE_ARC::SHAPE_ARC ( const VECTOR2I aArcStart,
const VECTOR2I aArcMid,
const VECTOR2I aArcEnd,
int  aWidth 
)

SHAPE_ARC ctor.

Parameters
aArcStartis the arc start point
aArcEndis the arc end point
aArcMidis the arc mid point
aWidthis the arc line thickness

Definition at line 48 of file shape_arc.cpp.

49  :
50  SHAPE( SH_ARC ), m_start( aArcStart ), m_mid( aArcMid ), m_end( aArcEnd ),
51  m_width( aWidth )
52 {
53  update_bbox();
54 }
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:134
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2I m_mid
Definition: shape_arc.h:158
compound shape, consisting of multiple simple shapes
Definition: shape.h:50
void update_bbox()
Definition: shape_arc.cpp:240
VECTOR2I m_start
Definition: shape_arc.h:157
int m_width
Definition: shape_arc.h:161

References update_bbox().

◆ SHAPE_ARC() [4/5]

SHAPE_ARC::SHAPE_ARC ( const SEG aSegmentA,
const SEG aSegmentB,
int  aRadius,
int  aWidth = 0 
)

SHAPE_ARC ctor.

Builds a SHAPE_ARC which is tangent to two segments and a given radius

Parameters
aSegmentAis the first segment
aSegmentBis the second segment
aRadiusis the arc radius
aWidthis the arc line thickness

Definition at line 57 of file shape_arc.cpp.

58  : SHAPE( SH_ARC )
59 {
60  /*
61  * Construct an arc that is tangent to two segments with a given radius.
62  *
63  * p
64  * A
65  * A \
66  * / \
67  * / , * , \ segB
68  * /* *\
69  * segA / c \
70  * / B
71  * /
72  * /
73  * B
74  *
75  *
76  * segA is the fist segment (with its points A and B)
77  * segB is the second segment (with its points A and B)
78  * p is the point at which segA and segB would intersect if they were projected
79  * c is the centre of the arc to be constructed
80  * rad is the radius of the arc to be constructed
81  *
82  * We can create two vectors, betweeen point p and segA /segB
83  * pToA = p - segA.B //< note that segA.A would also be valid as it is colinear
84  * pToB = p - segB.B //< note that segB.A would also be valid as it is colinear
85  *
86  * Let the angle formed by segA and segB be called 'alpha':
87  * alpha = angle( pToA ) - angle( pToB )
88  *
89  * The distance PC can be computed as
90  * distPC = rad / abs( sin( alpha / 2 ) )
91  *
92  * The polar angle of the vector PC can be computed as:
93  * anglePC = angle( pToA ) + alpha / 2
94  *
95  * Therefore:
96  * C.x = P.x + distPC*cos( anglePC )
97  * C.y = P.y + distPC*sin( anglePC )
98  */
99 
100  OPT_VECTOR2I p = aSegmentA.Intersect( aSegmentB, true, true );
101 
102  if( !p || aSegmentA.Length() == 0 || aSegmentB.Length() == 0 )
103  {
104  // Catch bugs in debug
105  wxASSERT_MSG( false, "The input segments do not intersect or one is zero length." );
106 
107  // Make a 180 degree arc around aSegmentA in case we end up here in release
108  m_start = aSegmentA.A;
109  m_end = aSegmentA.B;
110  m_mid = m_start;
111 
112  VECTOR2I arcCenter = aSegmentA.Center();
113  RotatePoint( m_mid, arcCenter, 900.0 ); // mid point at 90 degrees
114  }
115  else
116  {
117  VECTOR2I pToA = aSegmentA.B - p.get();
118  VECTOR2I pToB = aSegmentB.B - p.get();
119 
120  if( pToA.EuclideanNorm() == 0 )
121  pToA = aSegmentA.A - p.get();
122 
123  if( pToB.EuclideanNorm() == 0 )
124  pToB = aSegmentB.A - p.get();
125 
126  double pToAangle = ArcTangente( pToA.y, pToA.x );
127  double pToBangle = ArcTangente( pToB.y, pToB.x );
128 
129  double alpha = NormalizeAngle180( pToAangle - pToBangle );
130 
131  double distPC = (double) aRadius / abs( sin( DECIDEG2RAD( alpha / 2 ) ) );
132  double angPC = pToAangle - alpha / 2;
133 
134  VECTOR2I arcCenter;
135 
136  arcCenter.x = p.get().x + KiROUND( distPC * cos( DECIDEG2RAD( angPC ) ) );
137  arcCenter.y = p.get().y + KiROUND( distPC * sin( DECIDEG2RAD( angPC ) ) );
138 
139  // The end points of the arc are the orthogonal projected lines from the line segments
140  // to the center of the arc
141  m_start = aSegmentA.LineProject( arcCenter );
142  m_end = aSegmentB.LineProject( arcCenter );
143 
144  //The mid point is rotated start point around center, half the angle of the arc.
145  VECTOR2I startVector = m_start - arcCenter;
146  VECTOR2I endVector = m_end - arcCenter;
147 
148  double startAngle = ArcTangente( startVector.y, startVector.x );
149  double endAngle = ArcTangente( endVector.y, endVector.x );
150 
151  double midPointRotAngle = NormalizeAngle180( startAngle - endAngle ) / 2;
152  m_mid = m_start;
153  RotatePoint( m_mid, arcCenter, midPointRotAngle );
154  }
155 
156  update_bbox();
157 }
int Length() const
Function Length()
Definition: seg.h:319
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:134
OPT_VECTOR2I Intersect(const SEG &aSeg, bool aIgnoreEndpoints=false, bool aLines=false) const
Function Intersect()
Definition: seg.cpp:104
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2 defines a general 2D-vector/point.
Definition: vector2d.h:61
VECTOR2I Center() const
Returns the center point of the line
Definition: seg.h:350
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:208
T NormalizeAngle180(T Angle)
Normalize angle to be in the -180.0 .. 180.0 range.
Definition: trigo.h:365
VECTOR2I m_mid
Definition: shape_arc.h:158
VECTOR2I LineProject(const VECTOR2I &aP) const
Function LineProject()
Definition: seg.h:362
OPT< VECTOR2I > OPT_VECTOR2I
Definition: seg.h:37
compound shape, consisting of multiple simple shapes
Definition: shape.h:50
void update_bbox()
Definition: shape_arc.cpp:240
VECTOR2I m_start
Definition: shape_arc.h:157
VECTOR2I A
Definition: seg.h:47
double DECIDEG2RAD(double deg)
Definition: trigo.h:224
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:68
T EuclideanNorm() const
Destructor.
Definition: vector2d.h:299
double ArcTangente(int dy, int dx)
Definition: trigo.cpp:162
VECTOR2I B
Definition: seg.h:48

References SEG::A, ArcTangente(), SEG::B, SEG::Center(), DECIDEG2RAD(), VECTOR2< T >::EuclideanNorm(), SEG::Intersect(), KiROUND(), SEG::Length(), SEG::LineProject(), m_end, m_mid, m_start, NormalizeAngle180(), RotatePoint(), update_bbox(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ SHAPE_ARC() [5/5]

SHAPE_ARC::SHAPE_ARC ( const SHAPE_ARC aOther)

Definition at line 160 of file shape_arc.cpp.

161  : SHAPE( SH_ARC )
162 {
163  m_start = aOther.m_start;
164  m_end = aOther.m_end;
165  m_mid = aOther.m_mid;
166  m_width = aOther.m_width;
167  m_bbox = aOther.m_bbox;
168 }
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:134
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2I m_mid
Definition: shape_arc.h:158
compound shape, consisting of multiple simple shapes
Definition: shape.h:50
VECTOR2I m_start
Definition: shape_arc.h:157
int m_width
Definition: shape_arc.h:161
BOX2I m_bbox
Definition: shape_arc.h:162

References m_bbox, m_end, m_mid, m_start, and m_width.

◆ ~SHAPE_ARC()

virtual SHAPE_ARC::~SHAPE_ARC ( )
inlinevirtual

Definition at line 77 of file shape_arc.h.

77 {}

Member Function Documentation

◆ BBox()

const BOX2I SHAPE_ARC::BBox ( int  aClearance = 0) const
overridevirtual

Function BBox()

Computes 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 282 of file shape_arc.cpp.

283 {
284  BOX2I bbox( m_bbox );
285 
286  if( aClearance != 0 )
287  bbox.Inflate( aClearance );
288 
289  return bbox;
290 }
BOX2I m_bbox
Definition: shape_arc.h:162

References BOX2< Vec >::Inflate(), and m_bbox.

Referenced by CheckArcGeom(), Collide(), and GERBER_DRAW_ITEM::GetBoundingBox().

◆ CalcShape()

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

Definition at line 713 of file wrlfacet.cpp.

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

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

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

◆ ccw()

bool SHAPE_ARC::ccw ( const VECTOR2I aA,
const VECTOR2I aB,
const VECTOR2I aC 
) const
inlineprivate

Definition at line 148 of file shape_arc.h.

149  {
150  return ( ecoord{ aC.y } - aA.y ) * ( ecoord{ aB.x } - aA.x ) >
151  ( ecoord{ aB.y } - aA.y ) * ( ecoord{ aC.x } - aA.x );
152  }
VECTOR2I::extended_type ecoord

References VECTOR2< T >::x, and VECTOR2< T >::y.

◆ Centre()

virtual VECTOR2I SHAPE::Centre ( ) const
inlinevirtualinherited

Function Centre()

Computes a center-of-mass of the shape

Returns
the center-of-mass point

Definition at line 232 of file shape.h.

233  {
234  return BBox( 0 ).Centre(); // if nothing better is available....
235  }
virtual const BOX2I BBox(int aClearance=0) const =0
Function BBox()
Vec Centre() const
Definition: box2.h:79

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

Referenced by Collide(), and PNS_PCBNEW_RULE_RESOLVER::CollideHoles().

◆ Clone()

SHAPE* SHAPE_ARC::Clone ( ) const
inlineoverridevirtual

Function Clone()

Returns a dynamically allocated copy of the shape

Return values
copyof the shape

Reimplemented from SHAPE.

Definition at line 79 of file shape_arc.h.

80  {
81  return new SHAPE_ARC( *this );
82  }
SHAPE_ARC()
Definition: shape_arc.h:42

References SHAPE_ARC().

Referenced by CheckArc().

◆ Collide() [1/4]

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

Function Collide()

Checks if the boundary of shape (this) lies closer to the segment aSeg than aClearance, indicating a collision.

Parameters
aActual[out] an optional pointer to an int to be updated with the actual distance int 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.

Implements SHAPE.

Definition at line 171 of file shape_arc.cpp.

172 {
173  int minDist = aClearance + m_width / 2;
174  VECTOR2I center = GetCenter();
175  ecoord dist_sq;
176  ecoord closest_dist_sq = VECTOR2I::ECOORD_MAX;
177  VECTOR2I nearest;
178 
179  VECTOR2I ab = ( aSeg.B - aSeg.A );
180  VECTOR2I ac = ( center - aSeg.A );
181 
182  ecoord lenAbSq = ab.SquaredEuclideanNorm();
183  double lambda = (double) ac.Dot( ab ) / (double) lenAbSq;
184 
185  if( lambda >= 0.0 && lambda <= 1.0 )
186  {
187  VECTOR2I p;
188 
189  p.x = (double) aSeg.A.x * lambda + (double) aSeg.B.x * (1.0 - lambda);
190  p.y = (double) aSeg.A.y * lambda + (double) aSeg.B.y * (1.0 - lambda);
191 
192  dist_sq = ( m_start - p ).SquaredEuclideanNorm();
193 
194  if( dist_sq < closest_dist_sq )
195  {
196  closest_dist_sq = dist_sq;
197  nearest = p;
198  }
199 
200  dist_sq = ( m_end - p ).SquaredEuclideanNorm();
201 
202  if( dist_sq < closest_dist_sq )
203  {
204  closest_dist_sq = dist_sq;
205  nearest = p;
206  }
207  }
208 
209  dist_sq = aSeg.SquaredDistance( m_start );
210 
211  if( dist_sq < closest_dist_sq )
212  {
213  closest_dist_sq = dist_sq;
214  nearest = m_start;
215  }
216 
217  dist_sq = aSeg.SquaredDistance( m_end );
218 
219  if( dist_sq < closest_dist_sq )
220  {
221  closest_dist_sq = dist_sq;
222  nearest = m_end;
223  }
224 
225  if( closest_dist_sq == 0 || closest_dist_sq < SEG::Square( minDist ) )
226  {
227  if( aLocation )
228  *aLocation = nearest;
229 
230  if( aActual )
231  *aActual = std::max( 0, (int) sqrt( closest_dist_sq ) - m_width / 2 );
232 
233  return true;
234  }
235 
236  return false;
237 }
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2 defines a general 2D-vector/point.
Definition: vector2d.h:61
extended_type SquaredEuclideanNorm() const
Function Squared Euclidean Norm computes the squared euclidean norm of the vector,...
Definition: vector2d.h:306
ecoord SquaredDistance(const SEG &aSeg) const
Definition: seg.cpp:37
static SEG::ecoord Square(int a)
Definition: seg.h:116
static constexpr extended_type ECOORD_MAX
Definition: vector2d.h:80
VECTOR2I::extended_type ecoord
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:492
VECTOR2I m_start
Definition: shape_arc.h:157
VECTOR2I A
Definition: seg.h:47
int m_width
Definition: shape_arc.h:161
VECTOR2I GetCenter() const
Definition: shape_arc.cpp:343
VECTOR2I B
Definition: seg.h:48

References SEG::A, SEG::B, VECTOR2< T >::Dot(), VECTOR2< T >::ECOORD_MAX, GetCenter(), m_end, m_start, m_width, SEG::Square(), SEG::SquaredDistance(), VECTOR2< T >::SquaredEuclideanNorm(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ Collide() [2/4]

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

Function Collide()

Checks if the boundary of shape (this) lies closer to the point aP than aClearance, indicating a collision.

Parameters
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 from SHAPE.

Definition at line 293 of file shape_arc.cpp.

295 {
296  int minDist = aClearance + m_width / 2;
297  auto bbox = BBox( minDist );
298 
299  if( !bbox.Contains( aP ) )
300  return false;
301 
302  ecoord min_dist_sq = SEG::Square( minDist );
303  ecoord r_sq = SEG::Square( GetRadius() );
304 
305  ecoord dist_sq = ( aP - GetCenter() ).SquaredEuclideanNorm();
306  ecoord dist_to_edge_sq = abs( dist_sq - r_sq );
307 
308  if( dist_to_edge_sq == 0 || dist_to_edge_sq < min_dist_sq )
309  {
310  if( aLocation )
311  *aLocation = ( aP + GetCenter() ) / 2;
312 
313  if( aActual )
314  *aActual = std::max( 0, (int) sqrt( dist_to_edge_sq ) - m_width / 2 );
315 
316  return true;
317  }
318 
319  return false;
320 }
double GetRadius() const
Definition: shape_arc.cpp:362
static SEG::ecoord Square(int a)
Definition: seg.h:116
VECTOR2I::extended_type ecoord
const BOX2I BBox(int aClearance=0) const override
Function BBox()
Definition: shape_arc.cpp:282
int m_width
Definition: shape_arc.h:161
VECTOR2I GetCenter() const
Definition: shape_arc.cpp:343

References BBox(), GetCenter(), GetRadius(), m_width, and SEG::Square().

◆ Collide() [3/4]

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

Function Collide()

Checks 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_RECT, SHAPE_SEGMENT, and SHAPE_COMPOUND.

Definition at line 824 of file shape_collisions.cpp.

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

References collideShapes().

◆ Collide() [4/4]

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

Reimplemented in SHAPE_RECT, SHAPE_SEGMENT, and SHAPE_COMPOUND.

Definition at line 830 of file shape_collisions.cpp.

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

References collideShapes().

◆ ConvertToPolyline()

const SHAPE_LINE_CHAIN SHAPE_ARC::ConvertToPolyline ( double  aAccuracy = 500.0) const

Constructs a SHAPE_LINE_CHAIN of segments from a given arc.

Parameters
aAccuracymaximum divergence from true arc given in internal units ** Note that the default of 500.0 here is given using ARC_DEF_HIGH_ACCURACY for pcbnew units. This is to allow common geometry collision functions Other programs should call this using explicit accuracy values TODO: unify KiCad internal units
Returns
a SHAPE_LINE_CHAIN

Definition at line 368 of file shape_arc.cpp.

369 {
370  SHAPE_LINE_CHAIN rv;
371  double r = GetRadius();
372  double sa = GetStartAngle();
373  auto c = GetCenter();
374  double ca = GetCentralAngle();
375 
376  int n;
377 
378  if( r == 0.0 )
379  {
380  n = 0;
381  }
382  else
383  {
384  n = GetArcToSegmentCount( r, aAccuracy, ca );
385  }
386 
387  for( int i = 0; i <= n ; i++ )
388  {
389  double a = sa;
390 
391  if( n != 0 )
392  a += ( ca * i ) / n;
393 
394  double x = c.x + r * cos( a * M_PI / 180.0 );
395  double y = c.y + r * sin( a * M_PI / 180.0 );
396 
397  rv.Append( KiROUND( x ), KiROUND( y ) );
398  }
399 
400  return rv;
401 }
double GetRadius() const
Definition: shape_arc.cpp:362
double GetStartAngle() const
Definition: shape_arc.cpp:323
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
SHAPE_LINE_CHAIN.
double GetCentralAngle() const
Definition: shape_arc.cpp:349
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:68
int GetArcToSegmentCount(int aRadius, int aErrorMax, double aArcAngleDegree)
VECTOR2I GetCenter() const
Definition: shape_arc.cpp:343

References SHAPE_LINE_CHAIN::Append(), GetArcToSegmentCount(), GetCenter(), GetCentralAngle(), GetRadius(), GetStartAngle(), and KiROUND().

Referenced by SHAPE_LINE_CHAIN::Append(), PNS::ArcHull(), Collide(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::doTrackDrc(), SHAPE_LINE_CHAIN::Insert(), PCB_SHAPE::MakeEffectiveShapes(), and SHAPE_LINE_CHAIN::SHAPE_LINE_CHAIN().

◆ Format()

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

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

Definition at line 35 of file shape.cpp.

36 {
37  assert( false );
38  return std::string( "" );
39 }

Referenced by SHAPE_FILE_IO::Write().

◆ GetArcMid()

const VECTOR2I& SHAPE_ARC::GetArcMid ( ) const
inline

Definition at line 86 of file shape_arc.h.

86 { return m_mid; }
VECTOR2I m_mid
Definition: shape_arc.h:158

References m_mid.

Referenced by ARC::ARC(), and GRID_HELPER::computeAnchors().

◆ GetCenter()

VECTOR2I SHAPE_ARC::GetCenter ( ) const

Definition at line 343 of file shape_arc.cpp.

344 {
345  return GetArcCenter( m_start, m_mid, m_end );
346 }
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2I m_mid
Definition: shape_arc.h:158
VECTOR2I m_start
Definition: shape_arc.h:157
const VECTOR2I GetArcCenter(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Determine the center of an arc or circle given three points on its circumference.
Definition: trigo.cpp:430

References GetArcCenter(), m_end, m_mid, and m_start.

Referenced by CheckArcGeom(), Collide(), ConvertToPolyline(), ROUTER_PREVIEW_ITEM::drawLineChain(), ROUTER_PREVIEW_ITEM::drawShape(), GetCentralAngle(), GetEndAngle(), GetRadius(), GetStartAngle(), and update_bbox().

◆ GetCentralAngle()

double SHAPE_ARC::GetCentralAngle ( ) const

Definition at line 349 of file shape_arc.cpp.

350 {
351  VECTOR2I center = GetCenter();
352  VECTOR2I p0 = m_start - center;
353  VECTOR2I p1 = m_mid - center;
354  VECTOR2I p2 = m_end - center;
355  double angle1 = ArcTangente( p1.y, p1.x ) - ArcTangente( p0.y, p0.x );
356  double angle2 = ArcTangente( p2.y, p2.x ) - ArcTangente( p1.y, p1.x );
357 
358  return ( NormalizeAngle180( angle1 ) + NormalizeAngle180( angle2 ) ) / 10.0;
359 }
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2 defines a general 2D-vector/point.
Definition: vector2d.h:61
T NormalizeAngle180(T Angle)
Normalize angle to be in the -180.0 .. 180.0 range.
Definition: trigo.h:365
VECTOR2I m_mid
Definition: shape_arc.h:158
VECTOR2I m_start
Definition: shape_arc.h:157
double ArcTangente(int dy, int dx)
Definition: trigo.cpp:162
VECTOR2I GetCenter() const
Definition: shape_arc.cpp:343

References ArcTangente(), GetCenter(), m_end, m_mid, m_start, NormalizeAngle180(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by CheckArcGeom(), ConvertToPolyline(), ROUTER_PREVIEW_ITEM::drawLineChain(), ROUTER_PREVIEW_ITEM::drawShape(), and update_bbox().

◆ GetChord()

SEG SHAPE_ARC::GetChord ( ) const
inline

Definition at line 125 of file shape_arc.h.

126  {
127  return SEG( m_start, m_end );
128  }
VECTOR2I m_end
Definition: shape_arc.h:159
Definition: seg.h:39
VECTOR2I m_start
Definition: shape_arc.h:157

References m_end, and m_start.

Referenced by CheckArcGeom().

◆ GetEndAngle()

double SHAPE_ARC::GetEndAngle ( ) const

Definition at line 333 of file shape_arc.cpp.

334 {
335  VECTOR2D d( m_end - GetCenter() );
336 
337  auto ang = 180.0 / M_PI * atan2( d.y, d.x );
338 
339  return NormalizeAngleDegrees( ang, 0.0, 360.0 );
340 }
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2 defines a general 2D-vector/point.
Definition: vector2d.h:61
double NormalizeAngleDegrees(double Angle, double aMin, double aMax)
Normalize angle to be aMin < angle <= aMax angle is in degrees.
Definition: trigo.h:312
VECTOR2I GetCenter() const
Definition: shape_arc.cpp:343

References GetCenter(), m_end, NormalizeAngleDegrees(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by CheckArcGeom().

◆ GetIndexableSubshapeCount()

virtual size_t SHAPE_BASE::GetIndexableSubshapeCount ( ) const
inlinevirtualinherited

Reimplemented in SHAPE_POLY_SET, and SHAPE_COMPOUND.

Definition at line 108 of file shape.h.

108 { return 0; }

◆ GetIndexableSubshapes()

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

Reimplemented in SHAPE_POLY_SET, and SHAPE_COMPOUND.

Definition at line 110 of file shape.h.

110 { }

Referenced by ROUTER_PREVIEW_ITEM::ViewDraw().

◆ GetP0()

const VECTOR2I& SHAPE_ARC::GetP0 ( ) const
inline

Definition at line 84 of file shape_arc.h.

84 { return m_start; }
VECTOR2I m_start
Definition: shape_arc.h:157

References m_start.

Referenced by GRID_HELPER::AlignToArc(), PNS::ARC::Anchor(), ARC::ARC(), GRID_HELPER::computeAnchors(), and EDIT_TOOL::FilletTracks().

◆ GetP1()

const VECTOR2I& SHAPE_ARC::GetP1 ( ) const
inline

Definition at line 85 of file shape_arc.h.

85 { return m_end; }
VECTOR2I m_end
Definition: shape_arc.h:159

References m_end.

Referenced by GRID_HELPER::AlignToArc(), PNS::ARC::Anchor(), ARC::ARC(), CheckArcGeom(), GRID_HELPER::computeAnchors(), and EDIT_TOOL::FilletTracks().

◆ GetRadius()

double SHAPE_ARC::GetRadius ( ) const

Definition at line 362 of file shape_arc.cpp.

363 {
364  return ( m_start - GetCenter() ).EuclideanNorm();
365 }
VECTOR2I m_start
Definition: shape_arc.h:157
VECTOR2I GetCenter() const
Definition: shape_arc.cpp:343

References GetCenter(), and m_start.

Referenced by CheckArcGeom(), Collide(), ConvertToPolyline(), ROUTER_PREVIEW_ITEM::drawLineChain(), ROUTER_PREVIEW_ITEM::drawShape(), and update_bbox().

◆ GetStartAngle()

double SHAPE_ARC::GetStartAngle ( ) const

Definition at line 323 of file shape_arc.cpp.

324 {
325  VECTOR2D d( m_start - GetCenter() );
326 
327  auto ang = 180.0 / M_PI * atan2( d.y, d.x );
328 
329  return NormalizeAngleDegrees( ang, 0.0, 360.0 );
330 }
VECTOR2 defines a general 2D-vector/point.
Definition: vector2d.h:61
VECTOR2I m_start
Definition: shape_arc.h:157
double NormalizeAngleDegrees(double Angle, double aMin, double aMax)
Normalize angle to be aMin < angle <= aMax angle is in degrees.
Definition: trigo.h:312
VECTOR2I GetCenter() const
Definition: shape_arc.cpp:343

References GetCenter(), m_start, NormalizeAngleDegrees(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by CheckArcGeom(), ConvertToPolyline(), ROUTER_PREVIEW_ITEM::drawLineChain(), ROUTER_PREVIEW_ITEM::drawShape(), and update_bbox().

◆ GetWidth()

int SHAPE_ARC::GetWidth ( ) const
inline

Definition at line 101 of file shape_arc.h.

102  {
103  return m_width;
104  }
int m_width
Definition: shape_arc.h:161

References m_width.

Referenced by PNS::ArcHull(), ROUTER_PREVIEW_ITEM::drawShape(), and PNS::ARC::Width().

◆ HasIndexableSubshapes()

virtual bool SHAPE_BASE::HasIndexableSubshapes ( ) const
inlinevirtualinherited

Reimplemented in SHAPE_POLY_SET, and SHAPE_COMPOUND.

Definition at line 103 of file shape.h.

104  {
105  return false;
106  }

Referenced by ROUTER_PREVIEW_ITEM::ViewDraw().

◆ IsNull()

bool SHAPE::IsNull ( ) const
inlineinherited

Function IsNull()

Returns true if the shape is a null shape.

Return values
trueif null :-)

Definition at line 160 of file shape.h.

161  {
162  return m_type == SH_NULL;
163  }
SHAPE_TYPE m_type
type of our shape
Definition: shape.h:114
circular arc
Definition: shape.h:51

References SHAPE_BASE::m_type, and SH_NULL.

◆ IsSolid()

bool SHAPE_ARC::IsSolid ( ) const
inlineoverridevirtual

Implements SHAPE.

Definition at line 106 of file shape_arc.h.

107  {
108  return true;
109  }

Referenced by CheckArcGeom().

◆ Mirror()

void SHAPE_ARC::Mirror ( bool  aX = true,
bool  aY = false,
const VECTOR2I aVector = { 0, 0 } 
)

Definition at line 431 of file shape_arc.cpp.

432 {
433  if( aX )
434  {
435  m_start.x = -m_start.x + 2 * aVector.x;
436  m_end.x = -m_end.x + 2 * aVector.x;
437  m_mid.x = -m_mid.x + 2 * aVector.x;
438  }
439 
440  if( aY )
441  {
442  m_start.y = -m_start.y + 2 * aVector.y;
443  m_end.y = -m_end.y + 2 * aVector.y;
444  m_mid.y = -m_mid.y + 2 * aVector.y;
445  }
446 
447  update_bbox();
448 }
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2I m_mid
Definition: shape_arc.h:158
void update_bbox()
Definition: shape_arc.cpp:240
VECTOR2I m_start
Definition: shape_arc.h:157

References m_end, m_mid, m_start, update_bbox(), VECTOR2< T >::x, and VECTOR2< T >::y.

◆ Move()

void SHAPE_ARC::Move ( const VECTOR2I aVector)
overridevirtual

Implements SHAPE.

Definition at line 404 of file shape_arc.cpp.

405 {
406  m_start += aVector;
407  m_end += aVector;
408  m_mid += aVector;
409  update_bbox();
410 }
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2I m_mid
Definition: shape_arc.h:158
void update_bbox()
Definition: shape_arc.cpp:240
VECTOR2I m_start
Definition: shape_arc.h:157

References m_end, m_mid, m_start, and update_bbox().

◆ NewFacet()

FACET * SHAPE::NewFacet ( )
inherited

Definition at line 705 of file wrlfacet.cpp.

706 {
707  FACET* fp = new FACET;
708  facets.push_back( fp );
709  return fp;
710 }
Definition: wrlfacet.h:41
std::list< FACET * > facets
Definition: wrlfacet.h:143

References SHAPE::facets.

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

◆ Parse()

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

Reimplemented in SHAPE_POLY_SET, and SHAPE_LINE_CHAIN.

Definition at line 28 of file shape.cpp.

29 {
30  assert( false );
31  return false;
32 }

◆ Rotate()

void SHAPE_ARC::Rotate ( double  aAngle,
const VECTOR2I aCenter 
)
overridevirtual

Function Rotate rotates the arc by a given angle about a point.

Parameters
aCenteris the rotation center
aAnglerotation angle in radians

Implements SHAPE.

Definition at line 413 of file shape_arc.cpp.

414 {
415  m_start -= aCenter;
416  m_end -= aCenter;
417  m_mid -= aCenter;
418 
419  m_start = m_start.Rotate( aAngle );
420  m_end = m_end.Rotate( aAngle );
421  m_mid = m_mid.Rotate( aAngle );
422 
423  m_start += aCenter;
424  m_end += aCenter;
425  m_mid += aCenter;
426 
427  update_bbox();
428 }
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2I m_mid
Definition: shape_arc.h:158
void update_bbox()
Definition: shape_arc.cpp:240
VECTOR2< T > Rotate(double aAngle) const
Function Rotate rotates the vector by a given angle.
Definition: vector2d.h:377
VECTOR2I m_start
Definition: shape_arc.h:157

References m_end, m_mid, m_start, VECTOR2< T >::Rotate(), and update_bbox().

◆ SetWidth()

void SHAPE_ARC::SetWidth ( int  aWidth)
inline

Definition at line 96 of file shape_arc.h.

97  {
98  m_width = aWidth;
99  }
int m_width
Definition: shape_arc.h:161

References m_width.

Referenced by PNS::ARC::SetWidth().

◆ Type()

SHAPE_TYPE SHAPE_BASE::Type ( ) const
inlineinherited

Function Type()

Returns the type of the shape.

Return values
thetype

Definition at line 98 of file shape.h.

99  {
100  return m_type;
101  }
SHAPE_TYPE m_type
type of our shape
Definition: shape.h:114

References SHAPE_BASE::m_type.

Referenced by PNS::DP_GATEWAYS::BuildFromPrimitivePair(), PNS::buildHullForPrimitiveShape(), collideShapes(), collideSingleShapes(), PNS::OPTIMIZER::computeBreakouts(), ROUTER_PREVIEW_ITEM::drawShape(), PNS::SOLID::Hull(), and SHAPE_FILE_IO::Write().

◆ update_bbox()

void SHAPE_ARC::update_bbox ( )
private

Definition at line 240 of file shape_arc.cpp.

241 {
242  std::vector<VECTOR2I> points;
243  // Put start and end points in the point list
244  points.push_back( m_start );
245  points.push_back( m_end );
246 
247  double start_angle = GetStartAngle();
248  double end_angle = start_angle + GetCentralAngle();
249 
250  // we always count quadrants clockwise (increasing angle)
251  if( start_angle > end_angle )
252  std::swap( start_angle, end_angle );
253 
254  int quad_angle_start = std::ceil( start_angle / 90.0 );
255  int quad_angle_end = std::floor( end_angle / 90.0 );
256 
257  // count through quadrants included in arc
258  for( int quad_angle = quad_angle_start; quad_angle <= quad_angle_end; ++quad_angle )
259  {
260  const int radius = KiROUND( GetRadius() );
261  VECTOR2I quad_pt = GetCenter();
262 
263  switch( quad_angle % 4 )
264  {
265  case 0: quad_pt += { radius, 0 }; break;
266  case 1:
267  case -3: quad_pt += { 0, radius }; break;
268  case 2:
269  case -2: quad_pt += { -radius, 0 }; break;
270  case 3:
271  case -1: quad_pt += { 0, -radius }; break;
272  default: assert( false );
273  }
274 
275  points.push_back( quad_pt );
276  }
277 
278  m_bbox.Compute( points );
279 }
double GetRadius() const
Definition: shape_arc.cpp:362
VECTOR2I m_end
Definition: shape_arc.h:159
VECTOR2 defines a general 2D-vector/point.
Definition: vector2d.h:61
void Compute(const Container &aPointList)
Compute the bounding box from a given list of points.
Definition: box2.h:91
double GetStartAngle() const
Definition: shape_arc.cpp:323
VECTOR2I m_start
Definition: shape_arc.h:157
double GetCentralAngle() const
Definition: shape_arc.cpp:349
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:68
BOX2I m_bbox
Definition: shape_arc.h:162
VECTOR2I GetCenter() const
Definition: shape_arc.cpp:343

References BOX2< Vec >::Compute(), GetCenter(), GetCentralAngle(), GetRadius(), GetStartAngle(), KiROUND(), m_bbox, m_end, and m_start.

Referenced by Mirror(), Move(), Rotate(), and SHAPE_ARC().

Member Data Documentation

◆ m_bbox

BOX2I SHAPE_ARC::m_bbox
private

Definition at line 162 of file shape_arc.h.

Referenced by BBox(), SHAPE_ARC(), and update_bbox().

◆ m_end

VECTOR2I SHAPE_ARC::m_end
private

◆ m_mid

VECTOR2I SHAPE_ARC::m_mid
private

Definition at line 158 of file shape_arc.h.

Referenced by GetArcMid(), GetCenter(), GetCentralAngle(), Mirror(), Move(), Rotate(), and SHAPE_ARC().

◆ m_start

VECTOR2I SHAPE_ARC::m_start
private

◆ m_type

SHAPE_TYPE SHAPE_BASE::m_type
protectedinherited

type of our shape

Definition at line 114 of file shape.h.

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

◆ m_width

int SHAPE_ARC::m_width
private

Definition at line 161 of file shape_arc.h.

Referenced by BOOST_AUTO_TEST_CASE(), Collide(), GetWidth(), SetWidth(), and SHAPE_ARC().

◆ MIN_PRECISION_IU

const int SHAPE_ARC::MIN_PRECISION_IU = 4
static

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

Definition at line 40 of file shape_arc.h.

Referenced by BOOST_AUTO_TEST_CASE(), and EDIT_TOOL::FilletTracks().


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