26 #ifndef __SHAPE_LINE_CHAIN
27 #define __SHAPE_LINE_CHAIN
32 #include <core/optional.h>
34 #include <math/vector2d.h>
35 #include <geometry/shape.h>
36 #include <geometry/seg.h>
50 typedef std::vector<VECTOR2I>::iterator point_iter;
51 typedef std::vector<VECTOR2I>::const_iterator point_citer;
69 typedef std::vector<INTERSECTION> INTERSECTIONS;
76 SHAPE( SH_LINE_CHAIN ), m_closed( false )
83 SHAPE( SH_LINE_CHAIN ), m_points( aShape.m_points ), m_closed( aShape.m_closed )
91 SHAPE( SH_LINE_CHAIN ), m_closed( false )
99 SHAPE( SH_LINE_CHAIN ), m_closed( false )
101 m_points.resize( 3 );
108 SHAPE( SH_LINE_CHAIN ), m_closed( false )
110 m_points.resize( 4 );
119 SHAPE( SH_LINE_CHAIN ),
122 m_points.resize( aCount );
124 for(
int i = 0; i < aCount; i++ )
173 int c = m_points.size() - 1;
177 return std::max( 0, c );
188 return m_points.size();
204 if( aIndex == (
int)( m_points.size() - 1 ) && m_closed )
205 return SEG( m_points[aIndex], m_points[0], aIndex );
207 return SEG( m_points[aIndex], m_points[aIndex + 1], aIndex );
223 if( aIndex == (
int)( m_points.size() - 1 ) && m_closed )
224 return SEG( const_cast<VECTOR2I&>( m_points[aIndex] ),
225 const_cast<VECTOR2I&>( m_points[0] ), aIndex );
227 return SEG( const_cast<VECTOR2I&>( m_points[aIndex] ),
228 const_cast<VECTOR2I&>( m_points[aIndex + 1] ), aIndex );
243 return m_points[aIndex];
260 return m_points[aIndex];
285 if( aClearance != 0 )
309 bool Collide(
const SEG& aSeg,
int aClearance = 0 )
const override;
346 void Append(
int aX,
int aY,
bool aAllowDuplication =
false )
349 Append( v, aAllowDuplication );
363 if( m_points.size() == 0 )
366 if( m_points.size() == 0 || aAllowDuplication ||
CPoint( -1 ) != aP )
368 m_points.push_back( aP );
387 m_points.push_back( p );
391 for(
int i = 1; i < aOtherLine.
PointCount(); i++ )
394 m_points.push_back( p );
399 void Insert(
int aVertex,
const VECTOR2I& aP )
401 m_points.insert( m_points.begin() + aVertex, aP );
433 void Remove(
int aStartIndex,
int aEndIndex );
492 return ( m_origin - aA.
p ).EuclideanNorm() < ( m_origin - aB.
p ).EuclideanNorm();
509 int Intersect(
const SEG& aSeg, INTERSECTIONS& aIp )
const;
597 const std::string
Format()
const override;
600 bool Parse( std::stringstream& aStream )
override;
618 void Move(
const VECTOR2I& aVector )
override
620 for( std::vector<VECTOR2I>::iterator i = m_points.begin(); i != m_points.end(); ++i )
632 bool IsSolid()
const override
637 const VECTOR2I PointAlong(
int aPathLength )
const;
643 std::vector<VECTOR2I> m_points;
652 #endif // __SHAPE_LINE_CHAIN
VECTOR2I p
point of intersection between our and their.
Definition: shape_line_chain.h:66
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Function NearestPoint()
Definition: shape_line_chain.cpp:537
SHAPE_LINE_CHAIN(const SHAPE_LINE_CHAIN &aShape)
Copy Constructor.
Definition: shape_line_chain.h:82
int Intersect(const SEG &aSeg, INTERSECTIONS &aIp) const
Function Intersect()
Definition: shape_line_chain.cpp:242
const VECTOR2I & CLastPoint() const
Returns the last point in the line chain.
Definition: shape_line_chain.h:274
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:300
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
Definition: shape_line_chain.h:346
SHAPE_LINE_CHAIN(const VECTOR2I &aA, const VECTOR2I &aB)
Constructor Initializes a 2-point line chain (a single segment)
Definition: shape_line_chain.h:90
void Clear()
Function Clear() Removes all points from the line chain.
Definition: shape_line_chain.h:137
const std::string Format() const override
Definition: shape_line_chain.cpp:577
SEG Segment(int aIndex)
Function Segment()
Definition: shape_line_chain.h:199
const SHAPE_LINE_CHAIN Slice(int aStartIndex, int aEndIndex=-1) const
Function Slice()
Definition: shape_line_chain.cpp:210
VECTOR2I & Point(int aIndex)
Function Point()
Definition: shape_line_chain.h:238
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Function Merge modifies the position and size of the rectangle in order to contain aRect.
Definition: box2.h:384
int SegmentCount() const
Function SegmentCount()
Definition: shape_line_chain.h:171
void Replace(int aStartIndex, int aEndIndex, const VECTOR2I &aP)
Function Replace()
Definition: shape_line_chain.cpp:95
void Remove(int aStartIndex, int aEndIndex)
Function Remove()
Definition: shape_line_chain.cpp:126
const SEG CSegment(int aIndex) const
Function CSegment()
Definition: shape_line_chain.h:218
void SetClosed(bool aClosed)
Function SetClosed()
Definition: shape_line_chain.h:150
const OPT< INTERSECTION > SelfIntersecting() const
Function SelfIntersecting()
Definition: shape_line_chain.cpp:420
bool PointInside(const VECTOR2I &aP) const
Function PointInside()
Definition: shape_line_chain.cpp:333
VECTOR2I & LastPoint()
Returns the last point in the line chain.
Definition: shape_line_chain.h:266
void Append(const SHAPE_LINE_CHAIN &aOtherLine)
Function Append()
Definition: shape_line_chain.h:379
const BOX2I BBox(int aClearance=0) const override
Function BBox()
Definition: shape_line_chain.h:280
SHAPE * Clone() const override
Function Clone()
Definition: shape_line_chain.cpp:613
void Rotate(double aAngle, const VECTOR2I &aCenter)
Function Rotate rotates all vertices by a given angle.
Definition: shape_line_chain.cpp:39
SEG their
segment belonging from the aOther argument of Intersect()
Definition: shape_line_chain.h:64
int Distance(const VECTOR2I &aP, bool aOutlineOnly=false) const
Function Distance()
Definition: shape_line_chain.cpp:138
int PointCount() const
Function PointCount()
Definition: shape_line_chain.h:186
bool PointOnEdge(const VECTOR2I &aP) const
Function PointOnEdge()
Definition: shape_line_chain.cpp:367
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
Definition: shape_line_chain.h:253
bool IsClosed() const
Function IsClosed()
Definition: shape_line_chain.h:160
Definition: shape_line_chain.h:484
SEG our
segment belonging from the (this) argument of Intersect()
Definition: shape_line_chain.h:62
Struct INTERSECTION.
Definition: shape_line_chain.h:59
bool Parse(std::stringstream &aStream) override
Definition: shape_line_chain.cpp:618
int Find(const VECTOR2I &aP) const
Function Find()
Definition: shape_line_chain.cpp:190
int PathLength(const VECTOR2I &aP) const
Function PathLength()
Definition: shape_line_chain.cpp:311
bool CheckClearance(const VECTOR2I &aP, const int aDist) const
Function CheckClearance()
Definition: shape_line_chain.cpp:397
void Append(const VECTOR2I &aP, bool aAllowDuplication=false)
Function Append()
Definition: shape_line_chain.h:361
int Split(const VECTOR2I &aP)
Function Split()
Definition: shape_line_chain.cpp:152
Class SHAPE_LINE_CHAIN.
Definition: shape_line_chain.h:47
SHAPE_LINE_CHAIN & Simplify()
Function Simplify()
Definition: shape_line_chain.cpp:468
Class SHAPE.
Definition: shape.h:58
void Compute(const Container &aPointList)
Compute the bounding box from a given list of points.
Definition: box2.h:89
int Length() const
Function Length()
Definition: shape_line_chain.cpp:84
void Remove(int aIndex)
Function Remove() removes the aIndex-th point from the line chain.
Definition: shape_line_chain.h:440
bool Collide(const VECTOR2I &aP, int aClearance=0) const override
Function Collide()
Definition: shape_line_chain.cpp:31
int FindSegment(const VECTOR2I &aP) const
Function FindSegment()
Definition: shape_line_chain.cpp:200
const SHAPE_LINE_CHAIN Reverse() const
Function Reverse()
Definition: shape_line_chain.cpp:73
SHAPE_LINE_CHAIN()
Constructor Initializes an empty line chain.
Definition: shape_line_chain.h:75