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:319
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:319
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:319
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:319
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:319
VECTOR2I B
Definition: seg.h:48

Member Function Documentation

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

Definition at line 233 of file seg.h.

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

234  {
235  ecoord p, q, r;
236  CanonicalCoefs( p, q, r );
237 
238  ecoord dist1 = ( p * aSeg.A.x + q * aSeg.A.y + r ) / sqrt( p * p + q * q );
239  ecoord dist2 = ( p * aSeg.B.x + q * aSeg.B.y + r ) / sqrt( p * p + q * q );
240 
241  return std::abs( dist1 ) <= 1 && std::abs( dist2 ) <= 1;
242  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:208
#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 244 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().

245  {
246  ecoord p, q, r;
247  CanonicalCoefs( p, q, r );
248 
249  ecoord dist1 = ( p * aSeg.A.x + q * aSeg.A.y + r ) / sqrt( p * p + q * q );
250  ecoord dist2 = ( p * aSeg.B.x + q * aSeg.B.y + r ) / sqrt( p * p + q * q );
251 
252  return std::abs( dist1 - dist2 ) <= 1;
253  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:208
#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 208 of file seg.h.

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

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

209  {
210  qA = A.y - B.y;
211  qB = B.x - A.x;
212  qC = -qA * A.x - qB * A.y;
213  }
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 222 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().

223  {
224  ecoord qa, qb, qc;
225  CanonicalCoefs( qa, qb, qc );
226 
227  ecoord d1 = std::abs( aSeg.A.x * qa + aSeg.A.y * qb + qc );
228  ecoord d2 = std::abs( aSeg.B.x * qa + aSeg.B.y * qb + qc );
229 
230  return ( d1 <= 1 && d2 <= 1 );
231  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:208
#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 203 of file seg.h.

References SquaredDistance().

204  {
205  return sqrt( SquaredDistance( aP ) );
206  }
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 301 of file seg.h.

References m_index.

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

302  {
303  return m_index;
304  }
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:319
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 170 of file seg.h.

References Intersect().

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

171  {
172  return Intersect( aSeg, false, true );
173  }
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 283 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().

284  {
285  return ( A - B ).EuclideanNorm();
286  }
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
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 338 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().

339 {
340  ecoord p = A.y - B.y;
341  ecoord q = B.x - A.x;
342  ecoord r = -p * A.x - q * A.y;
343 
344  ecoord dist = ( p * aP.x + q * aP.y + r ) / sqrt( p * p + q * q );
345 
346  return aDetermineSide ? dist : std::abs( dist );
347 }
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 322 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().

323 {
324  VECTOR2I d = B - A;
325  ecoord l_squared = d.Dot( d );
326 
327  if( l_squared == 0 )
328  return A;
329 
330  ecoord t = d.Dot( aP - A );
331 
332  int xp = rescale( t, (ecoord)d.x, l_squared );
333  int yp = rescale( t, (ecoord)d.y, l_squared );
334 
335  return A + VECTOR2I( xp, yp );
336 }
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
the nearest point

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

356 {
357  VECTOR2I d = B - A;
358  ecoord l_squared = d.Dot( d );
359 
360  if( l_squared == 0 )
361  return A;
362 
363  ecoord t = d.Dot( aP - A );
364 
365  if( t < 0 )
366  return A;
367  else if( t > l_squared )
368  return B;
369 
370  int xp = rescale( t, (ecoord)d.x, l_squared );
371  int yp = rescale( t, (ecoord)d.y, l_squared );
372 
373  return A + VECTOR2I( xp, yp );
374 }
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:319
VECTOR2I B
Definition: seg.h:48
bool SEG::Overlaps ( const SEG aSeg) const
inline

Definition at line 256 of file seg.h.

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

257  {
258  if( aSeg.A == aSeg.B ) // single point corner case
259  {
260  if( A == aSeg.A || B == aSeg.A )
261  return false;
262 
263  return Contains( aSeg.A );
264  }
265 
266  if( !Collinear( aSeg ) )
267  return false;
268 
269  if( Contains( aSeg.A ) || Contains( aSeg.B ) )
270  return true;
271  if( aSeg.Contains( A ) || aSeg.Contains( B ) )
272  return true;
273 
274  return false;
275  }
VECTOR2I A
Definition: seg.h:47
bool Collinear(const SEG &aSeg) const
Function Collinear()
Definition: seg.h:222
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 310 of file seg.h.

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

311  {
312  std::swap( A, B );
313  }
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:355
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 191 of file seg.h.

References NearestPoint().

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

Definition at line 288 of file seg.h.

Referenced by PNS::commonParallelProjection().

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

Definition at line 349 of file seg.h.

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

Referenced by PNS::commonParallelProjection().

350 {
351  VECTOR2I d = B - A;
352  return d.Dot( aP - A);
353 }
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 376 of file seg.h.

377 {
378  aStream << "[ " << aSeg.A << " - " << aSeg.B << " ]";
379 
380  return aStream;
381 }
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(), POLY_GRID_PARTITION::segsEqual::operator()(), POLY_GRID_PARTITION::segHash::operator()(), 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(), 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(), 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(), POLY_GRID_PARTITION::build(), 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(), POLY_GRID_PARTITION::segsEqual::operator()(), POLY_GRID_PARTITION::segHash::operator()(), 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(), 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(), 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 319 of file seg.h.

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


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