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)
 
bool operator== (const SEG &aSeg) const
 
bool operator!= (const SEG &aSeg) const
 
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 ()
 
VECTOR2I Center () const
 

Returns the center point of the line

More...
 

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 36 of file seg.h.

Member Typedef Documentation

Definition at line 39 of file seg.h.

Constructor & Destructor Documentation

SEG::SEG ( )
inline

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

Definition at line 52 of file seg.h.

References m_index.

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

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

Definition at line 61 of file seg.h.

References m_index.

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

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

Definition at line 72 of file seg.h.

References m_index.

72  : A( aA ), B( aB )
73  {
74  m_index = -1;
75  }
VECTOR2I A
Definition: seg.h:46
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:334
VECTOR2I B
Definition: seg.h:47
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 84 of file seg.h.

References m_index.

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

Copy constructor.

Definition at line 92 of file seg.h.

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

Member Function Documentation

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

Definition at line 242 of file seg.h.

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

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

Definition at line 253 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().

254  {
255  ecoord p, q, r;
256  CanonicalCoefs( p, q, r );
257 
258  ecoord dist1 = ( p * aSeg.A.x + q * aSeg.A.y + r ) / sqrt( p * p + q * q );
259  ecoord dist2 = ( p * aSeg.B.x + q * aSeg.B.y + r ) / sqrt( p * p + q * q );
260 
261  return std::abs( dist1 - dist2 ) <= 1;
262  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:217
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
void SEG::CanonicalCoefs ( ecoord qA,
ecoord qB,
ecoord qC 
) const
inline

Definition at line 217 of file seg.h.

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

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

218  {
219  qA = A.y - B.y;
220  qB = B.x - A.x;
221  qC = -qA * A.x - qB * A.y;
222  }
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
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 Center(), and 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:39
VECTOR2I SEG::Center ( ) const
inline

Returns the center point of the line

Definition at line 325 of file seg.h.

References A, and ccw().

Referenced by SCH_EAGLE_PLUGIN::findNearestLinePoint().

326  {
327  return A + ( B - A ) / 2;
328  }
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
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(), IntersectLines(), 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:46
VECTOR2I B
Definition: seg.h:47
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 231 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().

232  {
233  ecoord qa, qb, qc;
234  CanonicalCoefs( qa, qb, qc );
235 
236  ecoord d1 = std::abs( aSeg.A.x * qa + aSeg.A.y * qb + qc );
237  ecoord d2 = std::abs( aSeg.B.x * qa + aSeg.B.y * qb + qc );
238 
239  return ( d1 <= 1 && d2 <= 1 );
240  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:217
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
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(), Index(), 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 VECTOR2I aP) const
inline

Function Distance()

Computes minimum Euclidean distance to point aP.

Parameters
aPthe point
Returns
minimum distance

Definition at line 212 of file seg.h.

References SquaredDistance().

213  {
214  return sqrt( SquaredDistance( aP ) );
215  }
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 310 of file seg.h.

References Contains(), m_index, and PointCloserThan().

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

311  {
312  return m_index;
313  }
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:334
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(), SHAPE_POLY_SET::Collide(), PNS::LINE::dragSegment45(), SHAPE_LINE_CHAIN::Intersect(), IntersectLines(), SCH_EAGLE_PLUGIN::loadSegments(), SHAPE_LINE_CHAIN::SelfIntersecting(), Side(), 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 }
OPT< VECTOR2I > OPT_VECTOR2I
Definition: seg.h:34
VECTOR2I::extended_type ecoord
int rescale(int aNumerator, int aValue, int aDenominator)
Definition: math_util.cpp:32
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
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 179 of file seg.h.

References Collide(), Intersect(), and SquaredDistance().

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

180  {
181  return Intersect( aSeg, false, true );
182  }
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 292 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().

293  {
294  return ( A - B ).EuclideanNorm();
295  }
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
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
aPthe point to test
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 353 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(), Side(), and PNS::LINE::snapToNeighbourSegments().

354 {
355  ecoord p = A.y - B.y;
356  ecoord q = B.x - A.x;
357  ecoord r = -p * A.x - q * A.y;
358 
359  ecoord dist = ( p * aP.x + q * aP.y + r ) / sqrt( p * p + q * q );
360 
361  return aDetermineSide ? dist : std::abs( dist );
362 }
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:46
VECTOR2I B
Definition: seg.h:47
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 337 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(), operator!=(), PNS::LINE_PLACER::rhStopAtNearestObstacle(), PNS::DIFF_PAIR_PLACER::routeHead(), and PNS::MEANDER_SHAPE::updateBaseSegment().

338 {
339  VECTOR2I d = B - A;
340  ecoord l_squared = d.Dot( d );
341 
342  if( l_squared == 0 )
343  return A;
344 
345  ecoord t = d.Dot( aP - A );
346 
347  int xp = rescale( t, (ecoord)d.x, l_squared );
348  int yp = rescale( t, (ecoord)d.y, l_squared );
349 
350  return A + VECTOR2I( xp, yp );
351 }
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:487
VECTOR2< int > VECTOR2I
Definition: vector2d.h:589
VECTOR2I::extended_type ecoord
int rescale(int aNumerator, int aValue, int aDenominator)
Definition: math_util.cpp:32
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
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
the nearest point

Definition at line 370 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(), Side(), SquaredDistance(), PNS::MEANDER_SKEW_PLACER::Start(), PNS::MEANDER_PLACER::Start(), and PNS::DP_MEANDER_PLACER::Start().

371 {
372  VECTOR2I d = B - A;
373  ecoord l_squared = d.Dot( d );
374 
375  if( l_squared == 0 )
376  return A;
377 
378  ecoord t = d.Dot( aP - A );
379 
380  if( t < 0 )
381  return A;
382  else if( t > l_squared )
383  return B;
384 
385  int xp = rescale( t, (ecoord)d.x, l_squared );
386  int yp = rescale( t, (ecoord)d.y, l_squared );
387 
388  return A + VECTOR2I( xp, yp );
389 }
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:487
VECTOR2< int > VECTOR2I
Definition: vector2d.h:589
VECTOR2I::extended_type ecoord
int rescale(int aNumerator, int aValue, int aDenominator)
Definition: math_util.cpp:32
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
bool SEG::operator!= ( const SEG aSeg) const
inline

Definition at line 110 of file seg.h.

References A, B, and LineProject().

111  {
112  return (A != aSeg.A || B != aSeg.B);
113  }
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
SEG& SEG::operator= ( const SEG aSeg)
inline

Definition at line 96 of file seg.h.

References A, B, and m_index.

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

Definition at line 105 of file seg.h.

References A, and B.

106  {
107  return (A == aSeg.A && B == aSeg.B) ;
108  }
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
bool SEG::Overlaps ( const SEG aSeg) const
inline

Definition at line 265 of file seg.h.

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

266  {
267  if( aSeg.A == aSeg.B ) // single point corner case
268  {
269  if( A == aSeg.A || B == aSeg.A )
270  return false;
271 
272  return Contains( aSeg.A );
273  }
274 
275  if( !Collinear( aSeg ) )
276  return false;
277 
278  if( Contains( aSeg.A ) || Contains( aSeg.B ) )
279  return true;
280  if( aSeg.Contains( A ) || aSeg.Contains( B ) )
281  return true;
282 
283  return false;
284  }
VECTOR2I A
Definition: seg.h:46
bool Collinear(const SEG &aSeg) const
Function Collinear()
Definition: seg.h:231
bool Contains(const VECTOR2I &aP) const
Definition: seg.cpp:155
VECTOR2I B
Definition: seg.h:47
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(), Index(), 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:487
#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:46
VECTOR2I::extended_type ecoord
Definition: seg.h:39
VECTOR2I B
Definition: seg.h:47
void SEG::Reverse ( )
inline

Definition at line 319 of file seg.h.

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

320  {
321  std::swap( A, B );
322  }
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
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 132 of file seg.h.

References A, p2t::Cross(), Intersect(), LineDistance(), and NearestPoint().

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

133  {
134  const ecoord det = ( B - A ).Cross( aP - A );
135 
136  return det < 0 ? -1 : ( det > 0 ? 1 : 0 );
137  }
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:46
double Cross(const Point &a, const Point &b)
Perform the cross product on two vectors. In 2D this produces a scalar.
Definition: shapes.h:269
VECTOR2I B
Definition: seg.h:47
SEG::ecoord SEG::SquaredDistance ( const SEG aSeg) const

Definition at line 76 of file seg.cpp.

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

Referenced by Distance(), and IntersectLines().

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 constexpr extended_type ECOORD_MAX
Definition: vector2d.h:80
VECTOR2I::extended_type ecoord
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Function NearestPoint()
Definition: seg.h:370
size_t i
Definition: json11.cpp:597
VECTOR2I A
Definition: seg.h:46
#define min(a, b)
Definition: auxiliary.h:85
VECTOR2I B
Definition: seg.h:47
ecoord SEG::SquaredDistance ( const VECTOR2I aP) const
inline

Definition at line 200 of file seg.h.

References NearestPoint().

201  {
202  return ( NearestPoint( aP ) - aP ).SquaredEuclideanNorm();
203  }
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Function NearestPoint()
Definition: seg.h:370
ecoord SEG::SquaredLength ( ) const
inline

Definition at line 297 of file seg.h.

References TCoef().

Referenced by PNS::commonParallelProjection().

298  {
299  return ( A - B ).SquaredEuclideanNorm();
300  }
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47
SEG::ecoord SEG::TCoef ( const VECTOR2I aP) const
inline

Definition at line 364 of file seg.h.

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

Referenced by PNS::commonParallelProjection(), and SquaredLength().

365 {
366  VECTOR2I d = B - A;
367  return d.Dot( aP - A);
368 }
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:487
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47

Friends And Related Function Documentation

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

Definition at line 391 of file seg.h.

392 {
393  aStream << "[ " << aSeg.A << " - " << aSeg.B << " ]";
394 
395  return aStream;
396 }
VECTOR2I A
Definition: seg.h:46
VECTOR2I B
Definition: seg.h:47

Member Data Documentation

VECTOR2I SEG::A

Definition at line 46 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(), Center(), PNS::SHOVE::checkBumpDirection(), SHAPE_LINE_CHAIN::CheckClearance(), PNS::SEGMENT::CLine(), SHAPE_ARC::Collide(), SHAPE_RECT::Collide(), Collide(), SHAPE_LINE_CHAIN::Collide(), SHAPE_POLY_SET::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::dragSegment45(), ZONE_CONTAINER::Draw(), ROUTER_PREVIEW_ITEM::drawLineChain(), PNS::LOGGER::dumpShape(), ZONE_FILLER::fillZoneWithSegments(), PNS::NODE::FindLineEnds(), 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!=(), POLY_GRID_PARTITION::segsEqual::operator()(), POLY_GRID_PARTITION::segHash::operator()(), operator<<(), operator=(), operator==(), Overlaps(), PNS::pairOrientation(), SHAPE_LINE_CHAIN::PathLength(), SHAPE_LINE_CHAIN::PointAlong(), PointCloserThan(), PNS::MEANDER_SHAPE::Recalculate(), PNS::LINE_PLACER::reduceTail(), PNS::MEANDER_SHAPE::reflect(), PNS::NODE::removeSegmentIndex(), PNS::WALKAROUND::Route(), POLY_GRID_PARTITION::scanCell(), 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(), DRC::TestZoneToZoneOutline(), SHAPE_POLY_SET::unfractureSingle(), PNS::MEANDER_SHAPE::updateBaseSegment(), and ROUTER_PREVIEW_ITEM::ViewDraw().

VECTOR2I SEG::B

Definition at line 47 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(), POLY_GRID_PARTITION::build(), PNS::DP_GATEWAYS::BuildFromPrimitivePair(), PNS::SHOVE::checkBumpDirection(), SHAPE_LINE_CHAIN::CheckClearance(), PNS::SEGMENT::CLine(), SHAPE_ARC::Collide(), 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::dragSegment45(), ZONE_CONTAINER::Draw(), ROUTER_PREVIEW_ITEM::drawLineChain(), PNS::LOGGER::dumpShape(), ZONE_FILLER::fillZoneWithSegments(), PNS::NODE::FindLineEnds(), SCH_EAGLE_PLUGIN::findNearestLinePoint(), 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!=(), POLY_GRID_PARTITION::segsEqual::operator()(), POLY_GRID_PARTITION::segHash::operator()(), operator<<(), operator=(), operator==(), Overlaps(), SHAPE_LINE_CHAIN::PointAlong(), PointCloserThan(), PNS::MEANDER_SHAPE::Recalculate(), PNS::MEANDER_SHAPE::reflect(), PNS::NODE::removeSegmentIndex(), PNS::WALKAROUND::Route(), POLY_GRID_PARTITION::scanCell(), 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(), DRC::TestZoneToZoneOutline(), SHAPE_POLY_SET::unfractureSingle(), 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 334 of file seg.h.

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


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