KiCad PCB EDA Suite
SEG Class Reference

#include <seg.h>

Public Types

using ecoord = VECTOR2I::extended_type
 

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...
 
const VECTOR2I NearestPoint (const SEG &aSeg) const
 Computes a point on the segment (this) that is closest to any point on aSeg. 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 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

◆ ecoord

Definition at line 39 of file seg.h.

Constructor & Destructor Documentation

◆ SEG() [1/5]

SEG::SEG ( )
inline

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

Definition at line 50 of file seg.h.

51  {
52  m_index = -1;
53  }
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:338

References m_index.

◆ SEG() [2/5]

SEG::SEG ( int  aX1,
int  aY1,
int  aX2,
int  aY2 
)
inline

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

Definition at line 59 of file seg.h.

59  :
60  A ( VECTOR2I( aX1, aY1 ) ),
61  B ( VECTOR2I( aX2, aY2 ) )
62  {
63  m_index = -1;
64  }
VECTOR2< int > VECTOR2I
Definition: vector2d.h:587
VECTOR2I A
Definition: seg.h:44
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:338
VECTOR2I B
Definition: seg.h:45

References m_index.

◆ SEG() [3/5]

SEG::SEG ( const VECTOR2I aA,
const VECTOR2I aB 
)
inline

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

Definition at line 70 of file seg.h.

70  : A( aA ), B( aB )
71  {
72  m_index = -1;
73  }
VECTOR2I A
Definition: seg.h:44
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:338
VECTOR2I B
Definition: seg.h:45

References m_index.

◆ SEG() [4/5]

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

82  : A( aA ), B( aB )
83  {
84  m_index = aIndex;
85  }
VECTOR2I A
Definition: seg.h:44
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:338
VECTOR2I B
Definition: seg.h:45

References m_index.

◆ SEG() [5/5]

SEG::SEG ( const SEG aSeg)
inline

Copy constructor.

Definition at line 90 of file seg.h.

90  : A( aSeg.A ), B( aSeg.B ), m_index( aSeg.m_index )
91  {
92  }
VECTOR2I A
Definition: seg.h:44
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:338
VECTOR2I B
Definition: seg.h:45

Member Function Documentation

◆ ApproxCollinear()

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

Definition at line 246 of file seg.h.

247  {
248  ecoord p, q, r;
249  CanonicalCoefs( p, q, r );
250 
251  ecoord dist1 = ( p * aSeg.A.x + q * aSeg.A.y + r ) / sqrt( p * p + q * q );
252  ecoord dist2 = ( p * aSeg.B.x + q * aSeg.B.y + r ) / sqrt( p * p + q * q );
253 
254  return std::abs( dist1 ) <= 1 && std::abs( dist2 ) <= 1;
255  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:221
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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

◆ ApproxParallel()

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

Definition at line 257 of file seg.h.

258  {
259  ecoord p, q, r;
260  CanonicalCoefs( p, q, r );
261 
262  ecoord dist1 = ( p * aSeg.A.x + q * aSeg.A.y + r ) / sqrt( p * p + q * q );
263  ecoord dist2 = ( p * aSeg.B.x + q * aSeg.B.y + r ) / sqrt( p * p + q * q );
264 
265  return std::abs( dist1 - dist2 ) <= 1;
266  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:221
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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().

◆ CanonicalCoefs()

void SEG::CanonicalCoefs ( ecoord qA,
ecoord qB,
ecoord qC 
) const
inline

Definition at line 221 of file seg.h.

222  {
223  qA = A.y - B.y;
224  qB = B.x - A.x;
225  qC = -qA * A.x - qB * A.y;
226  }
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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

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

◆ ccw()

bool SEG::ccw ( const VECTOR2I aA,
const VECTOR2I aB,
const VECTOR2I aC 
) const
private

Definition at line 161 of file seg.cpp.

162 {
163  return (ecoord) ( aC.y - aA.y ) * ( aB.x - aA.x ) > (ecoord) ( aB.y - aA.y ) * ( aC.x - aA.x );
164 }
VECTOR2I::extended_type ecoord
Definition: seg.h:39
VECTOR2I::extended_type ecoord

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

Referenced by Collide().

◆ Center()

VECTOR2I SEG::Center ( ) const
inline

Returns the center point of the line

Definition at line 329 of file seg.h.

330  {
331  return A + ( B - A ) / 2;
332  }
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, and B.

Referenced by SCH_EAGLE_PLUGIN::findNearestLinePoint().

◆ Collide()

bool SEG::Collide ( const SEG aSeg,
int  aClearance 
) const

Definition at line 167 of file seg.cpp.

168 {
169  // check for intersection
170  // fixme: move to a method
171  if( ccw( A, aSeg.A, aSeg.B ) != ccw( B, aSeg.A, aSeg.B ) &&
172  ccw( A, B, aSeg.A ) != ccw( A, B, aSeg.B ) )
173  return true;
174 
175 #define CHK( _seg, _pt ) \
176  if( (_seg).PointCloserThan( _pt, aClearance ) ) return true;
177 
178  CHK( *this, aSeg.A );
179  CHK( *this, aSeg.B );
180  CHK( aSeg, A );
181  CHK( aSeg, B );
182 #undef CHK
183 
184  return false;
185 }
bool ccw(const VECTOR2I &aA, const VECTOR2I &aB, const VECTOR2I &aC) const
Definition: seg.cpp:161
#define CHK(_seg, _pt)
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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

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

◆ Collinear()

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

236  {
237  ecoord qa, qb, qc;
238  CanonicalCoefs( qa, qb, qc );
239 
240  ecoord d1 = std::abs( aSeg.A.x * qa + aSeg.A.y * qb + qc );
241  ecoord d2 = std::abs( aSeg.B.x * qa + aSeg.B.y * qb + qc );
242 
243  return ( d1 <= 1 && d2 <= 1 );
244  }
void CanonicalCoefs(ecoord &qA, ecoord &qB, ecoord &qC) const
Definition: seg.h:221
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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

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

◆ Contains()

bool SEG::Contains ( const VECTOR2I aP) const

Definition at line 188 of file seg.cpp.

189 {
190  return PointCloserThan( aP, 1 );
191 }
bool PointCloserThan(const VECTOR2I &aP, int aDist) const
Definition: seg.cpp:34

References PointCloserThan().

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

◆ Distance() [1/2]

◆ Distance() [2/2]

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

217  {
218  return sqrt( SquaredDistance( aP ) );
219  }
ecoord SquaredDistance(const SEG &aSeg) const
Definition: seg.cpp:76

References SquaredDistance().

◆ Index()

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

315  {
316  return m_index;
317  }
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:338

References m_index.

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

◆ Intersect()

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 132 of file seg.cpp.

133 {
134  const VECTOR2I e( B - A );
135  const VECTOR2I f( aSeg.B - aSeg.A );
136  const VECTOR2I ac( aSeg.A - A );
137 
138  ecoord d = f.Cross( e );
139  ecoord p = f.Cross( ac );
140  ecoord q = e.Cross( ac );
141 
142  if( d == 0 )
143  return OPT_VECTOR2I();
144 
145  if( !aLines && d > 0 && ( q < 0 || q > d || p < 0 || p > d ) )
146  return OPT_VECTOR2I();
147 
148  if( !aLines && d < 0 && ( q < d || p < d || p > 0 || q > 0 ) )
149  return OPT_VECTOR2I();
150 
151  if( !aLines && aIgnoreEndpoints && ( q == 0 || q == d ) && ( p == 0 || p == d ) )
152  return OPT_VECTOR2I();
153 
154  VECTOR2I ip( aSeg.A.x + rescale( q, (ecoord) f.x, d ),
155  aSeg.A.y + rescale( q, (ecoord) f.y, d ) );
156 
157  return ip;
158 }
OPT< VECTOR2I > OPT_VECTOR2I
Definition: seg.h:34
VECTOR2I::extended_type ecoord
T rescale(T aNumerator, T aValue, T aDenominator)
Function rescale()
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, B, VECTOR2< T >::Cross(), numEval::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(), NearestPoint(), SHAPE_LINE_CHAIN::SelfIntersecting(), and SquaredDistance().

◆ IntersectLines()

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

184  {
185  return Intersect( aSeg, false, true );
186  }
OPT_VECTOR2I Intersect(const SEG &aSeg, bool aIgnoreEndpoints=false, bool aLines=false) const
Function Intersect()
Definition: seg.cpp:132

References Intersect().

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

◆ Length()

int SEG::Length ( ) const
inline

Function Length()

Returns the length (this)

Returns
length

Definition at line 296 of file seg.h.

297  {
298  return ( A - B ).EuclideanNorm();
299  }
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, and B.

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().

◆ LineDistance()

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

358 {
359  ecoord p = A.y - B.y;
360  ecoord q = B.x - A.x;
361  ecoord r = -p * A.x - q * A.y;
362 
363  ecoord dist = ( p * aP.x + q * aP.y + r ) / sqrt( p * p + q * q );
364 
365  return aDetermineSide ? dist : std::abs( dist );
366 }
static const int dist[10][10]
Definition: ar_matrix.cpp:320
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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().

◆ LineProject()

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

342 {
343  VECTOR2I d = B - A;
344  ecoord l_squared = d.Dot( d );
345 
346  if( l_squared == 0 )
347  return A;
348 
349  ecoord t = d.Dot( aP - A );
350 
351  int xp = rescale( t, (ecoord)d.x, l_squared );
352  int yp = rescale( t, (ecoord)d.y, l_squared );
353 
354  return A + VECTOR2I( xp, yp );
355 }
VECTOR2< int > VECTOR2I
Definition: vector2d.h:587
VECTOR2I::extended_type ecoord
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:485
T rescale(T aNumerator, T aValue, T aDenominator)
Function rescale()
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, B, VECTOR2< T >::Dot(), numEval::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().

◆ NearestPoint() [1/2]

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

375 {
376  VECTOR2I d = B - A;
377  ecoord l_squared = d.Dot( d );
378 
379  if( l_squared == 0 )
380  return A;
381 
382  ecoord t = d.Dot( aP - A );
383 
384  if( t < 0 )
385  return A;
386  else if( t > l_squared )
387  return B;
388 
389  int xp = rescale( t, (ecoord)d.x, l_squared );
390  int yp = rescale( t, (ecoord)d.y, l_squared );
391 
392  return A + VECTOR2I( xp, yp );
393 }
VECTOR2< int > VECTOR2I
Definition: vector2d.h:587
VECTOR2I::extended_type ecoord
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:485
T rescale(T aNumerator, T aValue, T aDenominator)
Function rescale()
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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

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

◆ NearestPoint() [2/2]

const VECTOR2I SEG::NearestPoint ( const SEG aSeg) const

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

Returns
the nearest point

Definition at line 99 of file seg.cpp.

100 {
101  if( auto p = Intersect( aSeg ) )
102  return *p;
103 
104  const VECTOR2I pts_origin[4] =
105  {
106  aSeg.NearestPoint( A ),
107  aSeg.NearestPoint( B ),
108  NearestPoint( aSeg.A ),
109  NearestPoint( aSeg.B )
110  };
111 
112  const ecoord pts_dist[4] =
113  {
114  ( pts_origin[0] - A ).SquaredEuclideanNorm(),
115  ( pts_origin[1] - B ).SquaredEuclideanNorm(),
116  ( pts_origin[2] - aSeg.A ).SquaredEuclideanNorm(),
117  ( pts_origin[3] - aSeg.B ).SquaredEuclideanNorm()
118  };
119 
120  int min_i = 0;
121 
122  for( int i = 0; i < 4; i++ )
123  {
124  if( pts_dist[i] < pts_dist[min_i] )
125  min_i = i;
126  }
127 
128  return pts_origin[min_i];
129 }
OPT_VECTOR2I Intersect(const SEG &aSeg, bool aIgnoreEndpoints=false, bool aLines=false) const
Function Intersect()
Definition: seg.cpp:132
VECTOR2I::extended_type ecoord
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Function NearestPoint()
Definition: seg.h:374
size_t i
Definition: json11.cpp:597
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, B, i, Intersect(), and NearestPoint().

◆ operator!=()

bool SEG::operator!= ( const SEG aSeg) const
inline

Definition at line 108 of file seg.h.

109  {
110  return (A != aSeg.A || B != aSeg.B);
111  }
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, and B.

◆ operator=()

SEG& SEG::operator= ( const SEG aSeg)
inline

Definition at line 94 of file seg.h.

95  {
96  A = aSeg.A;
97  B = aSeg.B;
98  m_index = aSeg.m_index;
99 
100  return *this;
101  }
VECTOR2I A
Definition: seg.h:44
int m_index
index withing the parent shape (used when m_is_local == false)
Definition: seg.h:338
VECTOR2I B
Definition: seg.h:45

References A, B, and m_index.

◆ operator==()

bool SEG::operator== ( const SEG aSeg) const
inline

Definition at line 103 of file seg.h.

104  {
105  return (A == aSeg.A && B == aSeg.B) ;
106  }
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, and B.

◆ Overlaps()

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

Definition at line 269 of file seg.h.

270  {
271  if( aSeg.A == aSeg.B ) // single point corner case
272  {
273  if( A == aSeg.A || B == aSeg.A )
274  return false;
275 
276  return Contains( aSeg.A );
277  }
278 
279  if( !Collinear( aSeg ) )
280  return false;
281 
282  if( Contains( aSeg.A ) || Contains( aSeg.B ) )
283  return true;
284  if( aSeg.Contains( A ) || aSeg.Contains( B ) )
285  return true;
286 
287  return false;
288  }
bool Contains(const VECTOR2I &aP) const
Definition: seg.cpp:188
bool Collinear(const SEG &aSeg) const
Function Collinear()
Definition: seg.h:235
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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

◆ PointCloserThan()

bool SEG::PointCloserThan ( const VECTOR2I aP,
int  aDist 
) const

Definition at line 34 of file seg.cpp.

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 }
VECTOR2I::extended_type ecoord
Definition: seg.h:39
#define abs(a)
Definition: auxiliary.h:84
VECTOR2I::extended_type ecoord
int sgn(T aVal)
Definition: seg.cpp:28
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:485
T rescale(T aNumerator, T aValue, T aDenominator)
Function rescale()
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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

Referenced by Contains().

◆ Reverse()

void SEG::Reverse ( )
inline

Definition at line 323 of file seg.h.

324  {
325  std::swap( A, B );
326  }
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, and B.

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

◆ Side()

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

131  {
132  const ecoord det = ( B - A ).Cross( aP - A );
133 
134  return det < 0 ? -1 : ( det > 0 ? 1 : 0 );
135  }
VECTOR2I::extended_type ecoord
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, and B.

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

◆ SquaredDistance() [1/2]

SEG::ecoord SEG::SquaredDistance ( const SEG aSeg) const

Definition at line 76 of file seg.cpp.

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:132
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:374
size_t i
Definition: json11.cpp:597
VECTOR2I A
Definition: seg.h:44
#define min(a, b)
Definition: auxiliary.h:85
VECTOR2I B
Definition: seg.h:45

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

Referenced by Distance().

◆ SquaredDistance() [2/2]

ecoord SEG::SquaredDistance ( const VECTOR2I aP) const
inline

Definition at line 204 of file seg.h.

205  {
206  return ( NearestPoint( aP ) - aP ).SquaredEuclideanNorm();
207  }
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Function NearestPoint()
Definition: seg.h:374

References NearestPoint().

◆ SquaredLength()

ecoord SEG::SquaredLength ( ) const
inline

Definition at line 301 of file seg.h.

302  {
303  return ( A - B ).SquaredEuclideanNorm();
304  }
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

References A, and B.

Referenced by PNS::commonParallelProjection().

◆ TCoef()

SEG::ecoord SEG::TCoef ( const VECTOR2I aP) const
inline

Definition at line 368 of file seg.h.

369 {
370  VECTOR2I d = B - A;
371  return d.Dot( aP - A);
372 }
extended_type Dot(const VECTOR2< T > &aVector) const
Function Dot() computes dot product of self with aVector.
Definition: vector2d.h:485
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

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

Referenced by PNS::commonParallelProjection().

Friends And Related Function Documentation

◆ operator<<

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

Definition at line 395 of file seg.h.

396 {
397  aStream << "[ " << aSeg.A << " - " << aSeg.B << " ]";
398 
399  return aStream;
400 }
VECTOR2I A
Definition: seg.h:44
VECTOR2I B
Definition: seg.h:45

Member Data Documentation

◆ A

VECTOR2I SEG::A

Definition at line 44 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(), CanonicalCoefs(), 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(), SHAPE_LINE_CHAIN::EdgeContainingPoint(), 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(), Length(), KIGFX::VIEW_OVERLAY::Line(), 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::DP_MEANDER_PLACER::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(), Reverse(), 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(), SquaredLength(), PNS::DRAGGER::startDragSegment(), PNS::SEGMENT::SwapEnds(), TCoef(), DRC::TestZoneToZoneOutline(), SHAPE_POLY_SET::unfractureSingle(), PNS::MEANDER_SHAPE::updateBaseSegment(), and ROUTER_PREVIEW_ITEM::ViewDraw().

◆ B

VECTOR2I SEG::B

Definition at line 45 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(), CanonicalCoefs(), Center(), 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(), SHAPE_LINE_CHAIN::EdgeContainingPoint(), PNS::MEANDER_SHAPE::End(), 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(), Length(), KIGFX::VIEW_OVERLAY::Line(), 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(), Reverse(), PNS::WALKAROUND::Route(), POLY_GRID_PARTITION::scanCell(), PNS::SegmentHull(), SHAPE_LINE_CHAIN::SelfIntersecting(), Side(), PNS::TOOL_BASE::snapToItem(), SHAPE_LINE_CHAIN::Split(), PNS::LINE_PLACER::SplitAdjacentSegments(), SquaredDistance(), SquaredLength(), PNS::DRAGGER::startDragSegment(), PNS::SEGMENT::SwapEnds(), TCoef(), DRC::TestZoneToZoneOutline(), SHAPE_POLY_SET::unfractureSingle(), PNS::MEANDER_SHAPE::updateBaseSegment(), and ROUTER_PREVIEW_ITEM::ViewDraw().

◆ m_index

int SEG::m_index
private

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

Definition at line 338 of file seg.h.

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


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