KiCad PCB EDA Suite
Loading...
Searching...
No Matches
shape_line_chain.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2013 CERN
5 * @author Tomasz Wlostowski <[email protected]>
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#ifndef __SHAPE_LINE_CHAIN
27#define __SHAPE_LINE_CHAIN
28
29
30#include <clipper2/clipper.h>
31#include <geometry/seg.h>
32#include <geometry/shape.h>
33#include <geometry/shape_arc.h>
35#include <math/vector2d.h>
36
42{
44 {
45 m_FirstArcIdx = -1;
46 m_SecondArcIdx = -1;
47 }
48
49 CLIPPER_Z_VALUE( const std::pair<ssize_t, ssize_t> aShapeIndices, ssize_t aOffset = 0 )
50 {
51 m_FirstArcIdx = aShapeIndices.first;
52 m_SecondArcIdx = aShapeIndices.second;
53
54 auto offsetVal = [&]( ssize_t& aVal )
55 {
56 if( aVal >= 0 )
57 aVal += aOffset;
58 };
59
60 offsetVal( m_FirstArcIdx );
61 offsetVal( m_SecondArcIdx );
62 }
63
66};
67
68
82{
83public:
84 typedef std::vector<VECTOR2I>::iterator point_iter;
85 typedef std::vector<VECTOR2I>::const_iterator point_citer;
86
91 {
94
97
101
104
109
113 bool valid;
114
116 index_our( -1 ),
117 index_their( -1 ),
118 is_corner_our( false ),
119 is_corner_their( false ),
120 valid( false )
121 {
122 }
123 };
124
125
131 {
132 public:
133 POINT_INSIDE_TRACKER( const VECTOR2I& aPoint );
134
135 void AddPolyline( const SHAPE_LINE_CHAIN& aPolyline );
136 bool IsInside();
137
138 private:
139
140 bool processVertex ( const VECTOR2I& ip, const VECTOR2I& ipNext );
141
148 };
149
150 typedef std::vector<INTERSECTION> INTERSECTIONS;
151
152
158 m_accuracy( 0 ),
159 m_closed( false ),
160 m_width( 0 )
161 {}
162
165 m_points( aShape.m_points ),
166 m_shapes( aShape.m_shapes ),
167 m_arcs( aShape.m_arcs ),
168 m_accuracy( aShape.m_accuracy ),
169 m_closed( aShape.m_closed ),
170 m_width( aShape.m_width ),
171 m_bbox( aShape.m_bbox )
172 {}
173
174 SHAPE_LINE_CHAIN( const std::vector<int>& aV );
175
176 SHAPE_LINE_CHAIN( const std::vector<VECTOR2I>& aV, bool aClosed = false );
177
178 SHAPE_LINE_CHAIN( const SHAPE_ARC& aArc, bool aClosed = false, std::optional<int> aMaxError = {} );
179
180 SHAPE_LINE_CHAIN( const Clipper2Lib::Path64& aPath,
181 const std::vector<CLIPPER_Z_VALUE>& aZValueBuffer,
182 const std::vector<SHAPE_ARC>& aArcBuffer );
183
185 {}
186
199 virtual bool Collide( const VECTOR2I& aP, int aClearance = 0, int* aActual = nullptr,
200 VECTOR2I* aLocation = nullptr ) const override;
201
214 virtual bool Collide( const SEG& aSeg, int aClearance = 0, int* aActual = nullptr,
215 VECTOR2I* aLocation = nullptr ) const override;
216
226 bool ClosestPoints( const SHAPE_LINE_CHAIN& aOther, VECTOR2I& aPt0, VECTOR2I& aPt1 ) const;
227
228 static bool ClosestPoints( const point_citer& aMyStart, const point_citer& aMyEnd,
229 const point_citer& aOtherStart, const point_citer& aOtherEnd,
230 VECTOR2I& aPt0, VECTOR2I& aPt1, int64_t& aDistSq );
231
232 static bool ClosestSegments( const VECTOR2I& aMyPrevPt, const point_citer& aMyStart,
233 const point_citer& aMyEnd, const VECTOR2I& aOtherPrevPt,
234 const point_citer& aOtherStart, const point_citer& aOtherEnd,
235 VECTOR2I& aPt0, VECTOR2I& aPt1, int64_t& aDistSq );
236
248 bool ClosestSegmentsFast( const SHAPE_LINE_CHAIN& aOther, VECTOR2I& aPt0,
249 VECTOR2I& aPt1 ) const;
250
252
253 SHAPE* Clone() const override;
254
258 void Clear()
259 {
260 m_points.clear();
261 m_arcs.clear();
262 m_shapes.clear();
263 m_closed = false;
264 }
265
272 void SetClosed( bool aClosed )
273 {
274 m_closed = aClosed;
276 }
277
281 bool IsClosed() const override
282 {
283 return m_closed;
284 }
285
291 void SetWidth( int aWidth )
292 {
293 m_width = aWidth;
294 }
295
301 int Width() const
302 {
303 return m_width;
304 }
305
311 int SegmentCount() const
312 {
313 int c = m_points.size() - 1;
314
315 if( m_closed )
316 c++;
317
318 return std::max( 0, c );
319 }
320
328 int ShapeCount() const;
329
330
335
342 void Simplify( int aTolerance = 0 );
343
344 // legacy function, used by the router. Please do not remove until I'll figure out
345 // the root cause of rounding errors - Tom
346 SHAPE_LINE_CHAIN& Simplify2( bool aRemoveColinear = true );
347
353 int PointCount() const
354 {
355 return m_points.size();
356 }
357
365 SEG Segment( int aIndex ) const;
366
374 const SEG CSegment( int aIndex ) const { return Segment( aIndex ); }
375
388 int NextShape( int aPointIndex ) const;
389
396 void SetPoint( int aIndex, const VECTOR2I& aPos );
397
404 const VECTOR2I& CPoint( int aIndex ) const
405 {
406 if( aIndex < 0 )
407 aIndex += PointCount();
408 else if( aIndex >= PointCount() )
409 aIndex -= PointCount();
410
411 return m_points[aIndex];
412 }
413
414 const std::vector<VECTOR2I>& CPoints() const { return m_points; }
415
419 const VECTOR2I& CLastPoint() const
420 {
421 return m_points[static_cast<size_t>( PointCount() ) - 1];
422 }
423
427 const std::vector<SHAPE_ARC>& CArcs() const
428 {
429 return m_arcs;
430 }
431
435 const std::vector<std::pair<ssize_t, ssize_t>>& CShapes() const
436 {
437 return m_shapes;
438 }
439
441 const BOX2I BBox( int aClearance = 0 ) const override
442 {
443 BOX2I bbox;
444 bbox.Compute( m_points );
445
446 if( aClearance != 0 || m_width != 0 )
447 bbox.Inflate( aClearance + m_width );
448
449 return bbox;
450 }
451
452 void GenerateBBoxCache() const
453 {
455
456 if( m_width != 0 )
458 }
459
460 BOX2I* GetCachedBBox() const override
461 {
462 return &m_bbox;
463 }
464
470 const SHAPE_LINE_CHAIN Reverse() const;
471
477 void ClearArcs();
478
484 long long int Length() const;
485
489 void ReservePoints( size_t aSize )
490 {
491 m_points.reserve( aSize );
492 }
493
503 void Append( int aX, int aY, bool aAllowDuplication = false )
504 {
505 VECTOR2I v( aX, aY );
506 Append( v, aAllowDuplication );
507 }
508
517 void Append( const VECTOR2I& aP, bool aAllowDuplication = false )
518 {
519 if( m_points.size() == 0 )
520 m_bbox = BOX2I( aP, VECTOR2I( 0, 0 ) );
521
522 if( m_points.size() == 0 || aAllowDuplication || CPoint( -1 ) != aP )
523 {
524 m_points.push_back( aP );
525 m_shapes.push_back( SHAPES_ARE_PT );
526 m_bbox.Merge( aP );
527 }
528 }
529
535 void Append( const SHAPE_LINE_CHAIN& aOtherLine );
536
537 void Append( const SHAPE_ARC& aArc );
538 void Append( const SHAPE_ARC& aArc, int aMaxError );
539
540 void Insert( size_t aVertex, const VECTOR2I& aP );
541
542 void Insert( size_t aVertex, const SHAPE_ARC& aArc );
543 void Insert( size_t aVertex, const SHAPE_ARC& aArc, int aMaxError );
544
552 void Replace( int aStartIndex, int aEndIndex, const VECTOR2I& aP );
553
562 void Replace( int aStartIndex, int aEndIndex, const SHAPE_LINE_CHAIN& aLine );
563
570 void Remove( int aStartIndex, int aEndIndex );
571
577 void Remove( int aIndex )
578 {
579 Remove( aIndex, aIndex );
580 }
581
590 void RemoveShape( int aPointIndex );
591
600 int Split( const VECTOR2I& aP, bool aExact = false );
601
608 int Find( const VECTOR2I& aP, int aThreshold = 0 ) const;
609
616 int FindSegment( const VECTOR2I& aP, int aThreshold = 1 ) const;
617
625 const SHAPE_LINE_CHAIN Slice( int aStartIndex, int aEndIndex ) const;
626 const SHAPE_LINE_CHAIN Slice( int aStartIndex, int aEndIndex, int aMaxError ) const;
627
629 {
631 m_origin( aOrigin )
632 {}
633
634 bool operator()( const INTERSECTION& aA, const INTERSECTION& aB )
635 {
636 return ( m_origin - aA.p ).EuclideanNorm() < ( m_origin - aB.p ).EuclideanNorm();
637 }
638
640 };
641
642 bool Intersects( const SHAPE_LINE_CHAIN& aChain ) const;
643
652 int Intersect( const SEG& aSeg, INTERSECTIONS& aIp ) const;
653
662 int Intersect( const SHAPE_LINE_CHAIN& aChain, INTERSECTIONS& aIp,
663 bool aExcludeColinearAndTouching = false,
664 BOX2I* aChainBBox = nullptr ) const;
665
672 int PathLength( const VECTOR2I& aP, int aIndex = -1 ) const;
673
681 bool CheckClearance( const VECTOR2I& aP, const int aDist) const;
682
688 const std::optional<INTERSECTION> SelfIntersecting() const;
689
695 const std::optional<INTERSECTION> SelfIntersectingWithArcs() const;
696
703 int NearestSegment( const VECTOR2I& aP ) const;
704
713 const VECTOR2I NearestPoint( const VECTOR2I& aP, bool aAllowInternalShapePoints = true ) const;
714
723 const VECTOR2I NearestPoint( const SEG& aSeg, int& dist ) const;
724
726 const std::string Format( bool aCplusPlus = true ) const override;
727
729 bool Parse( std::stringstream& aStream ) override;
730
731 bool operator!=( const SHAPE_LINE_CHAIN& aRhs ) const
732 {
733 if( PointCount() != aRhs.PointCount() )
734 return true;
735
736 for( int i = 0; i < PointCount(); i++ )
737 {
738 if( CPoint( i ) != aRhs.CPoint( i ) )
739 return true;
740 }
741
742 return false;
743 }
744
745 bool CompareGeometry( const SHAPE_LINE_CHAIN& aOther ) const;
746
747 void Move( const VECTOR2I& aVector ) override
748 {
749 for( auto& pt : m_points )
750 pt += aVector;
751
752 for( auto& arc : m_arcs )
753 arc.Move( aVector );
754
755 m_bbox.Move( aVector );
756 }
757
764 void Mirror( const VECTOR2I& aRef, FLIP_DIRECTION aFlipDirection );
765
771 void Mirror( const SEG& axis );
772
779 void Rotate( const EDA_ANGLE& aAngle, const VECTOR2I& aCenter = { 0, 0 } ) override;
780
781 bool IsSolid() const override
782 {
783 return false;
784 }
785
786 const VECTOR2I PointAlong( int aPathLength ) const;
787
793 double Area( bool aAbsolute = true ) const;
794
804 void Split( const VECTOR2I& aStart, const VECTOR2I& aEnd, SHAPE_LINE_CHAIN& aPre,
805 SHAPE_LINE_CHAIN& aMid, SHAPE_LINE_CHAIN& aPost ) const;
806
817 bool OffsetLine( int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError,
818 SHAPE_LINE_CHAIN& aLeft, SHAPE_LINE_CHAIN& aRight,
819 bool aSimplify = false ) const;
820
821 size_t ArcCount() const
822 {
823 return m_arcs.size();
824 }
825
829 ssize_t ArcIndex( size_t aSegment ) const
830 {
831 if( IsSharedPt( aSegment ) )
832 return m_shapes[aSegment].second;
833 else
834 return m_shapes[aSegment].first;
835 }
836
837 const SHAPE_ARC& Arc( size_t aArc ) const
838 {
839 return m_arcs[aArc];
840 }
841
847 bool IsSharedPt( size_t aIndex ) const;
848
849 bool IsPtOnArc( size_t aPtIndex ) const;
850
851 bool IsArcSegment( size_t aSegment ) const;
852
853 bool IsArcStart( size_t aIndex ) const;
854
855 bool IsArcEnd( size_t aIndex ) const;
856
857 using SHAPE::Distance;
858
859 int Distance( const VECTOR2I& aP, bool aOutlineOnly ) const
860 {
861 return sqrt( SquaredDistance( aP, aOutlineOnly ) );
862 }
863
864 virtual const VECTOR2I GetPoint( int aIndex ) const override { return CPoint(aIndex); }
865 virtual const SEG GetSegment( int aIndex ) const override { return CSegment(aIndex); }
866 virtual size_t GetPointCount() const override { return PointCount(); }
867 virtual size_t GetSegmentCount() const override { return SegmentCount(); }
868
869 void TransformToPolygon( SHAPE_POLY_SET& aBuffer, int aError,
870 ERROR_LOC aErrorLoc ) const override;
871
872protected:
873 friend class SHAPE_POLY_SET;
874
880 void convertArc( ssize_t aArcIndex );
881
894 void splitArc( ssize_t aPtIndex, bool aCoincident = false );
895
896 void amendArc( size_t aArcIndex, const VECTOR2I& aNewStart, const VECTOR2I& aNewEnd );
897
898 void amendArcStart( size_t aArcIndex, const VECTOR2I& aNewStart )
899 {
900 amendArc( aArcIndex, aNewStart, m_arcs[aArcIndex].GetP1() );
901 }
902
903 void amendArcEnd( size_t aArcIndex, const VECTOR2I& aNewEnd )
904 {
905 amendArc( aArcIndex, m_arcs[aArcIndex].GetP0(), aNewEnd );
906 }
907
911 ssize_t reversedArcIndex( size_t aSegment ) const
912 {
913 if( IsSharedPt( aSegment ) )
914 return m_shapes[aSegment].first;
915 else
916 return m_shapes[aSegment].second;
917 }
918
922 Clipper2Lib::Path64 convertToClipper2( bool aRequiredOrientation,
923 std::vector<CLIPPER_Z_VALUE> &aZValueBuffer,
924 std::vector<SHAPE_ARC> &aArcBuffer ) const;
925
929 void fixIndicesRotation();
930
935
936private:
937
938 static const ssize_t SHAPE_IS_PT;
939
940 static const std::pair<ssize_t, ssize_t> SHAPES_ARE_PT;
941
943 std::vector<VECTOR2I> m_points;
944
959 std::vector<std::pair<ssize_t, ssize_t>> m_shapes;
960
961 std::vector<SHAPE_ARC> m_arcs;
962
963 // the maxError to use when converting arcs to points
965
968
975
977 mutable BOX2I m_bbox;
978};
979
980
981#endif // __SHAPE_LINE_CHAIN
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
Definition: approximation.h:32
BOX2< VECTOR2I > BOX2I
Definition: box2.h:922
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:558
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
Definition: box2.h:658
constexpr void Move(const Vec &aMoveVector)
Move the rectangle by the aMoveVector.
Definition: box2.h:138
void Compute(const Container &aPointList)
Compute the bounding box from a given list of points.
Definition: box2.h:109
Definition: seg.h:42
A dynamic state checking if a point lies within polygon with a dynamically built outline ( with each ...
bool processVertex(const VECTOR2I &ip, const VECTOR2I &ipNext)
void AddPolyline(const SHAPE_LINE_CHAIN &aPolyline)
SEG::ecoord SquaredDistance(const VECTOR2I &aP, bool aOutlineOnly=false) const override
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
std::vector< std::pair< ssize_t, ssize_t > > m_shapes
Array of indices that refer to the index of the shape if the point is part of a larger shape,...
const SHAPE_LINE_CHAIN Reverse() const
Reverse point order in the line chain.
void Move(const VECTOR2I &aVector) override
bool IsPtOnArc(size_t aPtIndex) const
void amendArcStart(size_t aArcIndex, const VECTOR2I &aNewStart)
void Remove(int aIndex)
Remove the aIndex-th point from the line chain.
void amendArcEnd(size_t aArcIndex, const VECTOR2I &aNewEnd)
int Width() const
Get the current width of the segments in the chain.
const SHAPE_ARC & Arc(size_t aArc) const
void splitArc(ssize_t aPtIndex, bool aCoincident=false)
Splits an arc into two arcs at aPtIndex.
void Append(const VECTOR2I &aP, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
const std::optional< INTERSECTION > SelfIntersecting() const
Check if the line chain is self-intersecting.
bool Parse(std::stringstream &aStream) override
bool CheckClearance(const VECTOR2I &aP, const int aDist) const
Check if point aP is closer to (or on) an edge or vertex of the line chain.
std::vector< SHAPE_ARC > m_arcs
int Distance(const VECTOR2I &aP, bool aOutlineOnly) const
bool IsClosed() const override
virtual const VECTOR2I GetPoint(int aIndex) const override
void SetPoint(int aIndex, const VECTOR2I &aPos)
Move a point to a specific location.
const VECTOR2I PointAlong(int aPathLength) const
int Split(const VECTOR2I &aP, bool aExact=false)
Insert the point aP belonging to one of the our segments, splitting the adjacent segment in two.
SHAPE_LINE_CHAIN & operator=(const SHAPE_LINE_CHAIN &)=default
void fixIndicesRotation()
Fix indices of this chain to ensure arcs are not split between the end and start indices.
std::vector< VECTOR2I > m_points
array of vertices
void GenerateBBoxCache() const
int FindSegment(const VECTOR2I &aP, int aThreshold=1) const
Search for segment containing point aP.
int ShapeCount() const
Return the number of shapes (line segments or arcs) in this line chain.
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
ssize_t reversedArcIndex(size_t aSegment) const
Return the arc index for the given segment index, looking backwards.
int Intersect(const SEG &aSeg, INTERSECTIONS &aIp) const
Find all intersection points between our line chain and the segment aSeg.
bool Intersects(const SHAPE_LINE_CHAIN &aChain) const
SHAPE_LINE_CHAIN()
Initialize an empty line chain.
int m_width
Width of the segments (for BBox calculations in RTree) TODO Adjust usage of SHAPE_LINE_CHAIN to accou...
virtual ~SHAPE_LINE_CHAIN()
int PointCount() const
Return the number of points (vertices) in this line chain.
bool IsArcEnd(size_t aIndex) const
void Replace(int aStartIndex, int aEndIndex, const VECTOR2I &aP)
Replace points with indices in range [start_index, end_index] with a single point aP.
void TransformToPolygon(SHAPE_POLY_SET &aBuffer, int aError, ERROR_LOC aErrorLoc) const override
Fills a SHAPE_POLY_SET with a polygon representation of this shape.
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if point aP lies closer to us than aClearance.
void ClearArcs()
Remove all arc references in the line chain, resulting in a chain formed only of straight segments.
void ReservePoints(size_t aSize)
Allocate a number of points all at once (for performance).
void mergeFirstLastPointIfNeeded()
Merge the first and last point if they are the same and this chain is closed.
bool CompareGeometry(const SHAPE_LINE_CHAIN &aOther) const
ssize_t ArcIndex(size_t aSegment) const
Return the arc index for the given segment index.
void Clear()
Remove all points from the line chain.
void Simplify(int aTolerance=0)
Simplify the line chain by removing colinear adjacent segments and duplicate vertices.
SEG Segment(int aIndex) const
Return a copy of the aIndex-th segment in the line chain.
BOX2I m_bbox
cached bounding box
BOX2I * GetCachedBBox() const override
bool m_closed
is the line chain closed?
const std::vector< SHAPE_ARC > & CArcs() const
const std::optional< INTERSECTION > SelfIntersectingWithArcs() const
Check if the line chain is self-intersecting.
int NearestSegment(const VECTOR2I &aP) const
Find the segment nearest the given point.
int NextShape(int aPointIndex) const
Return the vertex index of the next shape in the chain, or -1 if aPointIndex is the last shape.
double Area(bool aAbsolute=true) const
Return the area of this chain.
SHAPE_LINE_CHAIN & Simplify2(bool aRemoveColinear=true)
void amendArc(size_t aArcIndex, const VECTOR2I &aNewStart, const VECTOR2I &aNewEnd)
virtual size_t GetPointCount() const override
bool ClosestPoints(const SHAPE_LINE_CHAIN &aOther, VECTOR2I &aPt0, VECTOR2I &aPt1) const
Finds closest points between this and the other line chain.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
virtual const SEG GetSegment(int aIndex) const override
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
bool operator!=(const SHAPE_LINE_CHAIN &aRhs) const
const std::vector< std::pair< ssize_t, ssize_t > > & CShapes() const
const VECTOR2I NearestPoint(const VECTOR2I &aP, bool aAllowInternalShapePoints=true) const
Find a point on the line chain that is closest to point aP.
std::vector< VECTOR2I >::iterator point_iter
const SHAPE_LINE_CHAIN Slice(int aStartIndex, int aEndIndex) const
Return a subset of this line chain containing the [start_index, end_index] range of points.
int SegmentCount() const
Return the number of segments in this line chain.
int PathLength(const VECTOR2I &aP, int aIndex=-1) const
Compute the walk path length from the beginning of the line chain and the point aP belonging to our l...
const VECTOR2I & CLastPoint() const
Return the last point in the line chain.
void Mirror(const VECTOR2I &aRef, FLIP_DIRECTION aFlipDirection)
Mirror the line points about y or x (or both).
bool ClosestSegmentsFast(const SHAPE_LINE_CHAIN &aOther, VECTOR2I &aPt0, VECTOR2I &aPt1) const
Finds closest points between segments of this and the other line chain.
const std::string Format(bool aCplusPlus=true) const override
static bool ClosestSegments(const VECTOR2I &aMyPrevPt, const point_citer &aMyStart, const point_citer &aMyEnd, const VECTOR2I &aOtherPrevPt, const point_citer &aOtherStart, const point_citer &aOtherEnd, VECTOR2I &aPt0, VECTOR2I &aPt1, int64_t &aDistSq)
SHAPE_LINE_CHAIN(const SHAPE_LINE_CHAIN &aShape)
Clipper2Lib::Path64 convertToClipper2(bool aRequiredOrientation, std::vector< CLIPPER_Z_VALUE > &aZValueBuffer, std::vector< SHAPE_ARC > &aArcBuffer) const
Create a new Clipper2 path from the SHAPE_LINE_CHAIN in a given orientation.
static const std::pair< ssize_t, ssize_t > SHAPES_ARE_PT
void convertArc(ssize_t aArcIndex)
Convert an arc to only a point chain by removing the arc and references.
virtual size_t GetSegmentCount() const override
void Remove(int aStartIndex, int aEndIndex)
Remove the range of points [start_index, end_index] from the line chain.
void RemoveDuplicatePoints()
Remove the duplicate points from the line chain.
size_t ArcCount() const
const SEG CSegment(int aIndex) const
Return a constant copy of the aIndex segment in the line chain.
bool IsArcSegment(size_t aSegment) const
void RemoveShape(int aPointIndex)
Remove the shape at the given index from the line chain.
void Insert(size_t aVertex, const VECTOR2I &aP)
bool IsArcStart(size_t aIndex) const
void SetWidth(int aWidth)
Set the width of all segments in the chain.
bool IsSharedPt(size_t aIndex) const
Test if a point is shared between multiple shapes.
std::vector< INTERSECTION > INTERSECTIONS
long long int Length() const
Return length of the line chain in Euclidean metric.
int Find(const VECTOR2I &aP, int aThreshold=0) const
Search for point aP.
const std::vector< VECTOR2I > & CPoints() const
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
std::vector< VECTOR2I >::const_iterator point_citer
SHAPE * Clone() const override
Return a dynamically allocated copy of the shape.
bool IsSolid() const override
static const ssize_t SHAPE_IS_PT
bool OffsetLine(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, SHAPE_LINE_CHAIN &aLeft, SHAPE_LINE_CHAIN &aRight, bool aSimplify=false) const
Creates line chains aLeft and aRight offset to this line chain.
Represent a set of closed polygons.
An abstract shape on 2D plane.
Definition: shape.h:126
virtual int Distance(const VECTOR2I &aP) const
Returns the minimum distance from a given point to this shape.
Definition: shape.cpp:109
CORNER_STRATEGY
define how inflate transform build inflated polygon
FLIP_DIRECTION
Definition: mirror.h:27
@ SH_LINE_CHAIN
line chain (polyline)
Definition: shape.h:49
Holds information on each point of a SHAPE_LINE_CHAIN that is retrievable after an operation with Cli...
CLIPPER_Z_VALUE(const std::pair< ssize_t, ssize_t > aShapeIndices, ssize_t aOffset=0)
Represent an intersection between two line segments.
bool is_corner_their
When true, the corner [index_their] of the 'their' line lies exactly on 'our' line.
bool is_corner_our
When true, the corner [index_our] of the 'our' line lies exactly on 'their' line.
int index_our
Index of the intersecting corner/segment in the 'our' (== this) line.
VECTOR2I p
Point of intersection between our and their.
bool valid
Auxiliary flag to avoid copying intersection info to intersection refining code, used by the refining...
int index_their
index of the intersecting corner/segment in the 'their' (Intersect() method parameter) line.
compareOriginDistance(const VECTOR2I &aOrigin)
bool operator()(const INTERSECTION &aA, const INTERSECTION &aB)
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:695