KiCad PCB EDA Suite
SEG Class Reference

#include <seg.h>

Public Member Functions

 SEG ()
 Default constructor Creates an empty (0, 0) segment. More...
 
 SEG (int aX1, int aY1, int aX2, int aY2)
 Constructor Creates a segment between (aX1, aY1) and (aX2, aY2) More...
 
 SEG (const VECTOR2I &aA, const VECTOR2I &aB)
 Constructor Creates a segment between (aA) and (aB) More...
 
 SEG (const VECTOR2I &aA, const VECTOR2I &aB, int aIndex)
 Constructor Creates a segment between (aA) and (aB), referenced to a multi-segment shape. More...
 
 SEG (const SEG &aSeg)
 Copy constructor. More...
 
SEGoperator= (const SEG &aSeg)
 
VECTOR2I LineProject (const VECTOR2I &aP) const
 Function LineProject() More...
 
int Side (const VECTOR2I &aP) const
 Function Side() More...
 
int LineDistance (const VECTOR2I &aP, bool aDetermineSide=false) const
 Function LineDistance() More...
 
const VECTOR2I NearestPoint (const VECTOR2I &aP) const
 Function NearestPoint() More...
 
OPT_VECTOR2I Intersect (const SEG &aSeg, bool aIgnoreEndpoints=false, bool aLines=false) const
 Function Intersect() More...
 
OPT_VECTOR2I IntersectLines (const SEG &aSeg) const
 Function IntersectLines() More...
 
bool Collide (const SEG &aSeg, int aClearance) const
 
ecoord SquaredDistance (const SEG &aSeg) const
 
int Distance (const SEG &aSeg) const
 Function Distance() More...
 
ecoord SquaredDistance (const VECTOR2I &aP) const
 
int Distance (const VECTOR2I &aP) const
 Function Distance() More...
 
void CanonicalCoefs (ecoord &qA, ecoord &qB, ecoord &qC) const
 
bool Collinear (const SEG &aSeg) const
 Function Collinear() More...
 
bool ApproxCollinear (const SEG &aSeg) const
 
bool ApproxParallel (const SEG &aSeg) const
 
bool Overlaps (const SEG &aSeg) const
 
int Length () const
 Function Length() More...
 
ecoord SquaredLength () const
 
ecoord TCoef (const VECTOR2I &aP) const
 
int Index () const
 Function Index() More...
 
bool Contains (const VECTOR2I &aP) const
 
bool PointCloserThan (const VECTOR2I &aP, int aDist) const
 
void Reverse ()
 

Public Attributes

VECTOR2I A
 
VECTOR2I B
 

Private Types

typedef VECTOR2I::extended_type ecoord
 

Private Member Functions

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

Private Attributes

int m_index
 

index withing the parent shape (used when m_is_local == false)

More...
 

Friends

std::ostream & operator<< (std::ostream &aStream, const SEG &aSeg)
 

Detailed Description

Definition at line 37 of file seg.h.

Member Typedef Documentation

Definition at line 40 of file seg.h.

Constructor & Destructor Documentation

SEG::SEG ( )
inline

Default constructor Creates an empty (0, 0) segment.

Definition at line 53 of file seg.h.

References m_index.

54  {
55  m_index = -1;
56  }
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:318
SEG::SEG ( int  aX1,
int  aY1,
int  aX2,
int  aY2 
)
inline

Constructor Creates a segment between (aX1, aY1) and (aX2, aY2)

Definition at line 62 of file seg.h.

References m_index.

62  :
63  A ( VECTOR2I( aX1, aY1 ) ),
64  B ( VECTOR2I( aX2, aY2 ) )
65  {
66  m_index = -1;
67  }
VECTOR2< int > VECTOR2I
Definition: vector2d.h:590
VECTOR2I A
Definition: seg.h:47
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:318
VECTOR2I B
Definition: seg.h:48
SEG::SEG ( const VECTOR2I aA,
const VECTOR2I aB 
)
inline

Constructor Creates a segment between (aA) and (aB)

Definition at line 73 of file seg.h.

References m_index.

73  : A( aA ), B( aB )
74  {
75  m_index = -1;
76  }
VECTOR2I A
Definition: seg.h:47
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:318
VECTOR2I B
Definition: seg.h:48
SEG::SEG ( const VECTOR2I aA,
const VECTOR2I aB,
int  aIndex 
)
inline

Constructor Creates a segment between (aA) and (aB), referenced to a multi-segment shape.

Parameters
aAreference to the start point in the parent shape
aBreference to the end point in the parent shape
aIndexindex of the segment within the parent shape

Definition at line 85 of file seg.h.

References m_index.

85  : A( aA ), B( aB )
86  {
87  m_index = aIndex;
88  }
VECTOR2I A
Definition: seg.h:47
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:318
VECTOR2I B
Definition: seg.h:48
SEG::SEG ( const SEG aSeg)
inline

Copy constructor.

Definition at line 93 of file seg.h.

93  : A( aSeg.A ), B( aSeg.B ), m_index( aSeg.m_index )
94  {
95  }
VECTOR2I A
Definition: seg.h:47
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:318
VECTOR2I B
Definition: seg.h:48

Member Function Documentation

bool SEG::ApproxCollinear ( const SEG aSeg) const
inline

Definition at line 232 of file seg.h.

References A, abs, B, CanonicalCoefs(), VECTOR2< T >::x, and VECTOR2< T >::y.

233  {
234  ecoord p, q, r;
235  CanonicalCoefs( p, q, r );
236 
237  ecoord dist1 = ( p * aSeg.A.x + q * aSeg.A.y + r ) / sqrt( p * p + q * q );
238  ecoord dist2 = ( p * aSeg.B.x + q * aSeg.B.y + r ) / sqrt( p * p + q * q );
239 
240  return std::abs( dist1 ) <= 1 && std::abs( dist2 ) <= 1;
241  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:207
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
bool SEG::ApproxParallel ( const SEG aSeg) const
inline

Definition at line 243 of file seg.h.

References A, abs, B, CanonicalCoefs(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by PNS::MEANDERED_LINE::CheckSelfIntersections(), PNS::DIFF_PAIR::CoupledLength(), PNS::DIFF_PAIR::CoupledSegmentPairs(), and PNS::findCoupledVertices().

244  {
245  ecoord p, q, r;
246  CanonicalCoefs( p, q, r );
247 
248  ecoord dist1 = ( p * aSeg.A.x + q * aSeg.A.y + r ) / sqrt( p * p + q * q );
249  ecoord dist2 = ( p * aSeg.B.x + q * aSeg.B.y + r ) / sqrt( p * p + q * q );
250 
251  return std::abs( dist1 - dist2 ) <= 1;
252  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:207
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
void SEG::CanonicalCoefs ( ecoord qA,
ecoord qB,
ecoord qC 
) const
inline

Definition at line 207 of file seg.h.

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

Referenced by ApproxCollinear(), ApproxParallel(), and Collinear().

208  {
209  qA = A.y - B.y;
210  qB = B.x - A.x;
211  qC = -qA * A.x - qB * A.y;
212  }
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
bool SEG::ccw ( const VECTOR2I aA,
const VECTOR2I aB,
const VECTOR2I aC 
) const
private

Definition at line 128 of file seg.cpp.

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

Referenced by Collide().

129 {
130  return (ecoord) ( aC.y - aA.y ) * ( aB.x - aA.x ) > (ecoord) ( aB.y - aA.y ) * ( aC.x - aA.x );
131 }
VECTOR2I::extended_type ecoord
VECTOR2I::extended_type ecoord
Definition: seg.h:40
bool SEG::Collide ( const SEG aSeg,
int  aClearance 
) const

Definition at line 134 of file seg.cpp.

References A, B, ccw(), and CHK.

Referenced by SHAPE_LINE_CHAIN::Collide(), SHAPE_POLY_SET::IsPolygonSelfIntersecting(), and BOARD::TestAreaIntersection().

135 {
136  // check for intersection
137  // fixme: move to a method
138  if( ccw( A, aSeg.A, aSeg.B ) != ccw( B, aSeg.A, aSeg.B ) &&
139  ccw( A, B, aSeg.A ) != ccw( A, B, aSeg.B ) )
140  return true;
141 
142 #define CHK( _seg, _pt ) \
143  if( (_seg).PointCloserThan( _pt, aClearance ) ) return true;
144 
145  CHK( *this, aSeg.A );
146  CHK( *this, aSeg.B );
147  CHK( aSeg, A );
148  CHK( aSeg, B );
149 #undef CHK
150 
151  return false;
152 }
bool ccw(const VECTOR2I &aA, const VECTOR2I &aB, const VECTOR2I &aC) const
Definition: seg.cpp:128
#define CHK(_seg, _pt)
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
bool SEG::Collinear ( const SEG aSeg) const
inline

Function Collinear()

Checks if segment aSeg lies on the same line as (this).

Parameters
aSegthe segment to chech colinearity with
Returns
true, when segments are collinear.

Definition at line 221 of file seg.h.

References A, abs, B, CanonicalCoefs(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by PNS::DP_GATEWAYS::BuildGeneric(), SHAPE_LINE_CHAIN::Intersect(), and Overlaps().

222  {
223  ecoord qa, qb, qc;
224  CanonicalCoefs( qa, qb, qc );
225 
226  ecoord d1 = std::abs( aSeg.A.x * qa + aSeg.A.y * qb + qc );
227  ecoord d2 = std::abs( aSeg.B.x * qa + aSeg.B.y * qb + qc );
228 
229  return ( d1 <= 1 && d2 <= 1 );
230  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:207
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
bool SEG::Contains ( const VECTOR2I aP) const

Definition at line 155 of file seg.cpp.

References PointCloserThan().

Referenced by GRID_HELPER::AlignToSegment(), PNS::LINE::ChangedArea(), SHAPE_LINE_CHAIN::Intersect(), PNS::MEANDERED_LINE::MeanderSegment(), and Overlaps().

156 {
157  return PointCloserThan( aP, 1 );
158 }
bool PointCloserThan(const VECTOR2I &aP, int aDist) const
Definition: seg.cpp:34
int SEG::Distance ( const SEG aSeg) const
inline
int SEG::Distance ( const VECTOR2I aP) const
inline

Function Distance()

Computes minimum Euclidean distance to point aP.

Parameters
aPthe point
Returns
minimum distance

Definition at line 202 of file seg.h.

References SquaredDistance().

203  {
204  return sqrt( SquaredDistance( aP ) );
205  }
ecoord SquaredDistance(const SEG &aSeg) const
Definition: seg.cpp:76
int SEG::Index ( ) const
inline

Function Index()

Return the index of this segment in its parent shape (applicable only to non-local segments)

Returns
index value

Definition at line 300 of file seg.h.

References m_index.

Referenced by PNS::OPTIMIZER::mergeDpStep(), PNS::OPTIMIZER::mergeObtuse(), PNS::OPTIMIZER::mergeStep(), and PNS::LINE::Walkaround().

301  {
302  return m_index;
303  }
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:318
OPT_VECTOR2I SEG::Intersect ( const SEG aSeg,
bool  aIgnoreEndpoints = false,
bool  aLines = false 
) const

Function Intersect()

Computes intersection point of segment (this) with segment aSeg.

Parameters
aSegsegment to intersect with
aIgnoreEndpointsdon't treat corner cases (i.e. end of one segment touching the other) as intersections.
aLinestreat segments as infinite lines
Returns
intersection point, if exists

Definition at line 99 of file seg.cpp.

References A, B, VECTOR2< T >::Cross(), rescale(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by EC_CONVERGING::Apply(), PNS::LINE::DragSegment(), SHAPE_LINE_CHAIN::Intersect(), IntersectLines(), SHAPE_LINE_CHAIN::SelfIntersecting(), and SquaredDistance().

100 {
101  const VECTOR2I e( B - A );
102  const VECTOR2I f( aSeg.B - aSeg.A );
103  const VECTOR2I ac( aSeg.A - A );
104 
105  ecoord d = f.Cross( e );
106  ecoord p = f.Cross( ac );
107  ecoord q = e.Cross( ac );
108 
109  if( d == 0 )
110  return OPT_VECTOR2I();
111 
112  if( !aLines && d > 0 && ( q < 0 || q > d || p < 0 || p > d ) )
113  return OPT_VECTOR2I();
114 
115  if( !aLines && d < 0 && ( q < d || p < d || p > 0 || q > 0 ) )
116  return OPT_VECTOR2I();
117 
118  if( !aLines && aIgnoreEndpoints && ( q == 0 || q == d ) && ( p == 0 || p == d ) )
119  return OPT_VECTOR2I();
120 
121  VECTOR2I ip( aSeg.A.x + rescale( q, (ecoord) f.x, d ),
122  aSeg.A.y + rescale( q, (ecoord) f.y, d ) );
123 
124  return ip;
125 }
VECTOR2I::extended_type ecoord
boost::optional< VECTOR2I > OPT_VECTOR2I
Definition: seg.h:35
int rescale(int aNumerator, int aValue, int aDenominator)
Definition: math_util.cpp:32
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
OPT_VECTOR2I SEG::IntersectLines ( const SEG aSeg) const
inline

Function IntersectLines()

Computes the intersection point of lines passing through ends of (this) and aSeg

Parameters
aSegsegment defining the line to intersect with
Returns
intersection point, if exists

Definition at line 169 of file seg.h.

References Intersect().

Referenced by GRID_HELPER::AlignToSegment(), PNS::DP_GATEWAYS::BuildGeneric(), PNS::ConvexHull(), PNS::OPTIMIZER::mergeObtuse(), and PNS::LINE::snapDraggedCorner().

170  {
171  return Intersect( aSeg, false, true );
172  }
OPT_VECTOR2I Intersect(const SEG &aSeg, bool aIgnoreEndpoints=false, bool aLines=false) const
Function Intersect()
Definition: seg.cpp:99
int SEG::Length ( ) const
inline

Function Length()

Returns the length (this)

Returns
length

Definition at line 282 of file seg.h.

Referenced by PNS::MEANDER_SHAPE::BaselineLength(), PNS::DIFF_PAIR::CoupledLength(), PNS::dragCornerInternal(), PNS::LINE::Is45Degree(), SHAPE_LINE_CHAIN::Length(), PNS::MEANDERED_LINE::MeanderSegment(), SHAPE_LINE_CHAIN::PathLength(), and SHAPE_LINE_CHAIN::PointAlong().

283  {
284  return ( A - B ).EuclideanNorm();
285  }
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
int SEG::LineDistance ( const VECTOR2I aP,
bool  aDetermineSide = false 
) const
inline

Function LineDistance()

Returns the closest Euclidean distance between point aP and the line defined by the ends of segment (this).

Parameters
aDetermineSidewhen true, the sign of the returned value indicates the side of the line at which we are (negative = left)
Returns
the distance

Definition at line 337 of file seg.h.

References A, abs, B, dist, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by GERBER_PLOTTER::FlashPadTrapez(), SHAPE_LINE_CHAIN::NearestPoint(), and PNS::LINE::snapToNeighbourSegments().

338 {
339  ecoord p = A.y - B.y;
340  ecoord q = B.x - A.x;
341  ecoord r = -p * A.x - q * A.y;
342 
343  ecoord dist = ( p * aP.x + q * aP.y + r ) / sqrt( p * p + q * q );
344 
345  return aDetermineSide ? dist : std::abs( dist );
346 }
static const int dist[10][10]
Definition: dist.cpp:57
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
VECTOR2I SEG::LineProject ( const VECTOR2I aP) const
inline

Function LineProject()

Computes the perpendicular projection point of aP on a line passing through ends of the segment.

Parameters
aPpoint to project
Returns
projected point

Definition at line 321 of file seg.h.

References A, B, VECTOR2< T >::Dot(), rescale(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by PNS::LINE_PLACER::buildInitialLine(), PNS::DP_GATEWAYS::BuildOrthoProjections(), PNS::commonParallelProjection(), PNS::findCoupledVertices(), PNS::LINE_PLACER::rhStopAtNearestObstacle(), PNS::DIFF_PAIR_PLACER::routeHead(), and PNS::MEANDER_SHAPE::updateBaseSegment().

322 {
323  VECTOR2I d = B - A;
324  ecoord l_squared = d.Dot( d );
325 
326  if( l_squared == 0 )
327  return A;
328 
329  ecoord t = d.Dot( aP - A );
330 
331  int xp = rescale( t, (ecoord)d.x, l_squared );
332  int yp = rescale( t, (ecoord)d.y, l_squared );
333 
334  return A + VECTOR2I( xp, yp );
335 }
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:488
VECTOR2< int > VECTOR2I
Definition: vector2d.h:590
VECTOR2I::extended_type ecoord
int rescale(int aNumerator, int aValue, int aDenominator)
Definition: math_util.cpp:32
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
const VECTOR2I SEG::NearestPoint ( const VECTOR2I aP) const
inline

Function NearestPoint()

Computes a point on the segment (this) that is closest to point aP.

Returns
: nearest point

Definition at line 354 of file seg.h.

References A, B, VECTOR2< T >::Dot(), rescale(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by POINT_EDITOR::addCorner(), Collide(), SHAPE_LINE_CHAIN::NearestPoint(), pushoutForce(), PNS::WALKAROUND::Route(), SquaredDistance(), PNS::MEANDER_SKEW_PLACER::Start(), PNS::MEANDER_PLACER::Start(), and PNS::DP_MEANDER_PLACER::Start().

355 {
356  VECTOR2I d = B - A;
357  ecoord l_squared = d.Dot( d );
358 
359  if( l_squared == 0 )
360  return A;
361 
362  ecoord t = d.Dot( aP - A );
363 
364  if( t < 0 )
365  return A;
366  else if( t > l_squared )
367  return B;
368 
369  int xp = rescale( t, (ecoord)d.x, l_squared );
370  int yp = rescale( t, (ecoord)d.y, l_squared );
371 
372  return A + VECTOR2I( xp, yp );
373 }
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:488
VECTOR2< int > VECTOR2I
Definition: vector2d.h:590
VECTOR2I::extended_type ecoord
int rescale(int aNumerator, int aValue, int aDenominator)
Definition: math_util.cpp:32
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
SEG& SEG::operator= ( const SEG aSeg)
inline

Definition at line 97 of file seg.h.

References A, B, and m_index.

98  {
99  A = aSeg.A;
100  B = aSeg.B;
101  m_index = aSeg.m_index;
102 
103  return *this;
104  }
VECTOR2I A
Definition: seg.h:47
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:318
VECTOR2I B
Definition: seg.h:48
bool SEG::Overlaps ( const SEG aSeg) const
inline

Definition at line 255 of file seg.h.

References A, B, Collinear(), and Contains().

256  {
257  if( aSeg.A == aSeg.B ) // single point corner case
258  {
259  if( A == aSeg.A || B == aSeg.A )
260  return false;
261 
262  return Contains( aSeg.A );
263  }
264 
265  if( !Collinear( aSeg ) )
266  return false;
267 
268  if( Contains( aSeg.A ) || Contains( aSeg.B ) )
269  return true;
270  if( aSeg.Contains( A ) || aSeg.Contains( B ) )
271  return true;
272 
273  return false;
274  }
VECTOR2I A
Definition: seg.h:47
bool Collinear(const SEG &aSeg) const
Function Collinear()
Definition: seg.h:221
bool Contains(const VECTOR2I &aP) const
Definition: seg.cpp:155
VECTOR2I B
Definition: seg.h:48
bool SEG::PointCloserThan ( const VECTOR2I aP,
int  aDist 
) const

Definition at line 34 of file seg.cpp.

References A, abs, B, VECTOR2< T >::Dot(), rescale(), sgn(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Contains(), and DRC::testTexts().

35 {
36  VECTOR2I d = B - A;
37  ecoord dist_sq = (ecoord) aDist * aDist;
38 
39  SEG::ecoord l_squared = d.Dot( d );
40  SEG::ecoord t = d.Dot( aP - A );
41 
42  if( t <= 0 || !l_squared )
43  return ( aP - A ).SquaredEuclideanNorm() < dist_sq;
44  else if( t >= l_squared )
45  return ( aP - B ).SquaredEuclideanNorm() < dist_sq;
46 
47  int dxdy = abs( d.x ) - abs( d.y );
48 
49  if( ( dxdy >= -1 && dxdy <= 1 ) || abs( d.x ) <= 1 || abs( d.y ) <= 1 )
50  {
51  int ca = -sgn( d.y );
52  int cb = sgn( d.x );
53  int cc = -ca * A.x - cb * A.y;
54 
55  ecoord num = (ecoord) ca * aP.x + (ecoord) cb * aP.y + cc;
56  num *= num;
57 
58  if( ca && cb )
59  num >>= 1;
60 
61  if( num > ( dist_sq + 100 ) )
62  return false;
63 
64  else if( num < ( dist_sq - 100 ) )
65  return true;
66  }
67 
68  VECTOR2I nearest;
69  nearest.x = A.x + rescale( t, (ecoord) d.x, l_squared );
70  nearest.y = A.y + rescale( t, (ecoord) d.y, l_squared );
71 
72  return ( nearest - aP ).SquaredEuclideanNorm() <= dist_sq;
73 }
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:488
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
int sgn(T aVal)
Definition: seg.cpp:28
int rescale(int aNumerator, int aValue, int aDenominator)
Definition: math_util.cpp:32
VECTOR2I A
Definition: seg.h:47
VECTOR2I::extended_type ecoord
Definition: seg.h:40
VECTOR2I B
Definition: seg.h:48
void SEG::Reverse ( )
inline

Definition at line 309 of file seg.h.

Referenced by PNS::LINE_RESTRICTIONS::allowedAngles().

310  {
311  std::swap( A, B );
312  }
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
int SEG::Side ( const VECTOR2I aP) const
inline

Function Side()

Determines on which side of directed line passing via segment ends point aP lies.

Parameters
aPpoint to determine the orientation wrs to self
Returns
: < 0: left, 0 : on the line, > 0 : right

Definition at line 123 of file seg.h.

References A, and p2t::Cross().

Referenced by PNS::DP_GATEWAYS::buildDpContinuation(), PNS::pairOrientation(), SHAPE_LINE_CHAIN::PointInside(), and PNS::SegmentHull().

124  {
125  const ecoord det = ( B - A ).Cross( aP - A );
126 
127  return det < 0 ? -1 : ( det > 0 ? 1 : 0 );
128  }
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:47
double Cross(const Point &a, const Point &b)
Perform the cross product on two vectors. In 2D this produces a scalar.
Definition: shapes.h:287
VECTOR2I B
Definition: seg.h:48
SEG::ecoord SEG::SquaredDistance ( const SEG aSeg) const

Definition at line 76 of file seg.cpp.

References A, B, VECTOR2_TRAITS< int >::ECOORD_MAX, Intersect(), min, and NearestPoint().

Referenced by Distance().

77 {
78  // fixme: rather inefficient....
79  if( Intersect( aSeg ) )
80  return 0;
81 
82  const VECTOR2I pts[4] =
83  {
84  aSeg.NearestPoint( A ) - A,
85  aSeg.NearestPoint( B ) - B,
86  NearestPoint( aSeg.A ) - aSeg.A,
87  NearestPoint( aSeg.B ) - aSeg.B
88  };
89 
91 
92  for( int i = 0; i < 4; i++ )
93  m = std::min( m, pts[i].SquaredEuclideanNorm() );
94 
95  return m;
96 }
OPT_VECTOR2I Intersect(const SEG &aSeg, bool aIgnoreEndpoints=false, bool aLines=false) const
Function Intersect()
Definition: seg.cpp:99
static const extended_type ECOORD_MAX
Definition: vector2d.h:59
VECTOR2I::extended_type ecoord
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Function NearestPoint()
Definition: seg.h:354
VECTOR2I A
Definition: seg.h:47
#define min(a, b)
Definition: auxiliary.h:85
VECTOR2I B
Definition: seg.h:48
ecoord SEG::SquaredDistance ( const VECTOR2I aP) const
inline

Definition at line 190 of file seg.h.

References NearestPoint().

191  {
192  return ( NearestPoint( aP ) - aP ).SquaredEuclideanNorm();
193  }
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Function NearestPoint()
Definition: seg.h:354
ecoord SEG::SquaredLength ( ) const
inline

Definition at line 287 of file seg.h.

Referenced by PNS::commonParallelProjection().

288  {
289  return ( A - B ).SquaredEuclideanNorm();
290  }
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48
SEG::ecoord SEG::TCoef ( const VECTOR2I aP) const
inline

Definition at line 348 of file seg.h.

References A, B, and VECTOR2< T >::Dot().

Referenced by PNS::commonParallelProjection().

349 {
350  VECTOR2I d = B - A;
351  return d.Dot( aP - A);
352 }
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:488
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48

Friends And Related Function Documentation

std::ostream& operator<< ( std::ostream &  aStream,
const SEG aSeg 
)
friend

Definition at line 375 of file seg.h.

376 {
377  aStream << "[ " << aSeg.A << " - " << aSeg.B << " ]";
378 
379  return aStream;
380 }
VECTOR2I A
Definition: seg.h:47
VECTOR2I B
Definition: seg.h:48

Member Data Documentation

VECTOR2I SEG::A

Definition at line 47 of file seg.h.

Referenced by PNS::NODE::Add(), PNS_KICAD_IFACE::AddItem(), PNS_PCBNEW_DEBUG_DECORATOR::AddSegment(), PNS::NODE::addSegment(), GRID_HELPER::AlignToSegment(), PNS::LINE_RESTRICTIONS::allowedAngles(), PNS::SEGMENT::Anchor(), PNS::DP_PRIMITIVE_PAIR::anchorDirection(), ApproxCollinear(), PNS::ApproximateSegmentAsRect(), ApproxParallel(), PNS::DP_MEANDER_PLACER::baselineSegment(), SHAPE_SEGMENT::BBox(), PNS::DP_GATEWAYS::BuildFromPrimitivePair(), PNS::SHOVE::checkBumpDirection(), PNS::SEGMENT::CLine(), SHAPE_RECT::Collide(), Collide(), SHAPE_LINE_CHAIN::Collide(), Collinear(), PNS::commonParallelProjection(), PNS::TOPOLOGY::ConnectedJoints(), PNS::DP_PRIMITIVE_PAIR::CursorOrientation(), PNS::MEANDER_PLACER_BASE::cutTunedLine(), DIRECTION_45::DIRECTION_45(), SHAPE_POLY_SET::DistanceToPolygon(), DRC::doEdgeZoneDrc(), PNS::MEANDER_PLACER::doMove(), PNS::LINE::DragSegment(), ZONE_CONTAINER::Draw(), ROUTER_PREVIEW_ITEM::drawLineChain(), PNS::LOGGER::dumpShape(), PNS::NODE::findRedundantSegment(), PNS::MEANDER_SHAPE::Fit(), PNS::NODE::followLine(), PNS::DIFF_PAIR_PLACER::getDanglingAnchor(), PNS::LINE_PLACER::handlePullback(), PNS::LINE_PLACER::handleSelfIntersections(), ZONE_CONTAINER::Hatch(), Intersect(), SHAPE_LINE_CHAIN::Intersect(), PNS::LINE::Is45Degree(), LineDistance(), LineProject(), PNS::LOGGER::Log(), PNS::MEANDER_SHAPE::MakeCorner(), PNS::MEANDER_SHAPE::MakeEmpty(), PNS::MEANDERED_LINE::MeanderSegment(), PNS::OPTIMIZER::mergeDpStep(), PNS::LINE_PLACER::mergeHead(), PNS::OPTIMIZER::mergeObtuse(), PNS::OPTIMIZER::mergeStep(), SHAPE_SEGMENT::Move(), PNS::MoveDiagonal(), NearestPoint(), operator<<(), operator=(), Overlaps(), PNS::pairOrientation(), SHAPE_LINE_CHAIN::PathLength(), SHAPE_LINE_CHAIN::PointAlong(), PointCloserThan(), SHAPE_LINE_CHAIN::PointInside(), SHAPE_LINE_CHAIN::PointOnEdge(), PNS::MEANDER_SHAPE::Recalculate(), PNS::LINE_PLACER::reduceTail(), PNS::MEANDER_SHAPE::reflect(), PNS::NODE::removeSegmentIndex(), PNS::WALKAROUND::Route(), PNS::SegmentHull(), SHAPE_LINE_CHAIN::SelfIntersecting(), Side(), PNS::TOOL_BASE::snapToItem(), PNS::LINE::snapToNeighbourSegments(), SHAPE_LINE_CHAIN::Split(), PNS::LINE_PLACER::splitAdjacentSegments(), SquaredDistance(), PNS::DRAGGER::startDragSegment(), PNS::SEGMENT::SwapEnds(), TCoef(), BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines(), PNS::MEANDER_SHAPE::updateBaseSegment(), and ROUTER_PREVIEW_ITEM::ViewDraw().

VECTOR2I SEG::B

Definition at line 48 of file seg.h.

Referenced by PNS::NODE::Add(), PNS_KICAD_IFACE::AddItem(), PNS::MEANDERED_LINE::AddMeander(), PNS_PCBNEW_DEBUG_DECORATOR::AddSegment(), PNS::NODE::addSegment(), GRID_HELPER::AlignToSegment(), PNS::SEGMENT::Anchor(), PNS::DP_PRIMITIVE_PAIR::anchorDirection(), ApproxCollinear(), PNS::ApproximateSegmentAsRect(), ApproxParallel(), PNS::DP_MEANDER_PLACER::baselineSegment(), SHAPE_SEGMENT::BBox(), PNS::DP_GATEWAYS::BuildFromPrimitivePair(), PNS::SHOVE::checkBumpDirection(), PNS::SEGMENT::CLine(), SHAPE_RECT::Collide(), Collide(), SHAPE_LINE_CHAIN::Collide(), Collinear(), PNS::commonParallelProjection(), PNS::TOPOLOGY::ConnectedJoints(), PNS::DP_PRIMITIVE_PAIR::CursorOrientation(), PNS::MEANDER_PLACER_BASE::cutTunedLine(), DIRECTION_45::DIRECTION_45(), DRC::doEdgeZoneDrc(), PNS::MEANDER_PLACER::doMove(), PNS::LINE::DragSegment(), ZONE_CONTAINER::Draw(), ROUTER_PREVIEW_ITEM::drawLineChain(), PNS::LOGGER::dumpShape(), PNS::MEANDER_SHAPE::End(), PNS::NODE::findRedundantSegment(), PNS::MEANDER_SHAPE::Fit(), PNS::NODE::followLine(), PNS::DIFF_PAIR_PLACER::getDanglingAnchor(), ZONE_CONTAINER::Hatch(), Intersect(), SHAPE_LINE_CHAIN::Intersect(), PNS::LINE::Is45Degree(), LineDistance(), LineProject(), PNS::LOGGER::Log(), PNS::MEANDER_SHAPE::MakeCorner(), PNS::MEANDER_SHAPE::MakeEmpty(), PNS::MEANDERED_LINE::MeanderSegment(), PNS::OPTIMIZER::mergeDpStep(), PNS::LINE_PLACER::mergeHead(), PNS::OPTIMIZER::mergeObtuse(), PNS::OPTIMIZER::mergeStep(), SHAPE_SEGMENT::Move(), PNS::MoveDiagonal(), NearestPoint(), operator<<(), operator=(), Overlaps(), SHAPE_LINE_CHAIN::PointAlong(), PointCloserThan(), SHAPE_LINE_CHAIN::PointInside(), SHAPE_LINE_CHAIN::PointOnEdge(), PNS::MEANDER_SHAPE::Recalculate(), PNS::MEANDER_SHAPE::reflect(), PNS::NODE::removeSegmentIndex(), PNS::WALKAROUND::Route(), PNS::SegmentHull(), SHAPE_LINE_CHAIN::SelfIntersecting(), PNS::TOOL_BASE::snapToItem(), SHAPE_LINE_CHAIN::Split(), PNS::LINE_PLACER::splitAdjacentSegments(), SquaredDistance(), PNS::DRAGGER::startDragSegment(), PNS::SEGMENT::SwapEnds(), TCoef(), BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines(), PNS::MEANDER_SHAPE::updateBaseSegment(), and ROUTER_PREVIEW_ITEM::ViewDraw().

int SEG::m_index
private

index withing the parent shape (used when m_is_local == false)

Definition at line 318 of file seg.h.

Referenced by Index(), operator=(), and SEG().


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