26 #ifndef __SHAPE_LINE_CHAIN 27 #define __SHAPE_LINE_CHAIN 32 #include <boost/optional.hpp> 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];
269 if( aClearance != 0 )
293 bool Collide(
const SEG& aSeg,
int aClearance = 0 )
const override;
330 void Append(
int aX,
int aY,
bool aAllowDuplication =
false )
333 Append( v, aAllowDuplication );
347 if( m_points.size() == 0 )
350 if( m_points.size() == 0 || aAllowDuplication ||
CPoint( -1 ) != aP )
352 m_points.push_back( aP );
371 m_points.push_back( p );
375 for(
int i = 1; i < aOtherLine.
PointCount(); i++ )
378 m_points.push_back( p );
383 void Insert(
int aVertex,
const VECTOR2I& aP )
385 m_points.insert( m_points.begin() + aVertex, aP );
417 void Remove(
int aStartIndex,
int aEndIndex );
476 return ( m_origin - aA.
p ).EuclideanNorm() < ( m_origin - aB.
p ).EuclideanNorm();
493 int Intersect(
const SEG& aSeg, INTERSECTIONS& aIp )
const;
571 const std::string
Format()
const override;
574 bool Parse( std::stringstream& aStream )
override;
592 void Move(
const VECTOR2I& aVector )
override 594 for( std::vector<VECTOR2I>::iterator i = m_points.begin(); i != m_points.end(); ++i )
598 bool IsSolid()
const override 603 const VECTOR2I PointAlong(
int aPathLength )
const;
607 std::vector<VECTOR2I> m_points;
616 #endif // __SHAPE_LINE_CHAIN Struct INTERSECTION.
Definition: shape_line_chain.h:59
int Find(const VECTOR2I &aP) const
Function Find()
Definition: shape_line_chain.cpp:178
const boost::optional< INTERSECTION > SelfIntersecting() const
Function SelfIntersecting()
Definition: shape_line_chain.cpp:369
const VECTOR2I NearestPoint(const VECTOR2I &aP) const
Function NearestPoint()
void Append(const VECTOR2I &aP, bool aAllowDuplication=false)
Function Append()
Definition: shape_line_chain.h:345
int FindSegment(const VECTOR2I &aP) const
Function FindSegment()
Definition: shape_line_chain.cpp:188
int Split(const VECTOR2I &aP)
Function Split()
Definition: shape_line_chain.cpp:140
int Intersect(const SEG &aSeg, INTERSECTIONS &aIp) const
Function Intersect()
Definition: shape_line_chain.cpp:230
SHAPE(SHAPE_TYPE aType)
Constructor.
Definition: shape.h:69
bool PointInside(const VECTOR2I &aP) const
Function PointInside()
Definition: shape_line_chain.cpp:321
const SHAPE_LINE_CHAIN Slice(int aStartIndex, int aEndIndex=-1) const
Function Slice()
Definition: shape_line_chain.cpp:198
SHAPE_LINE_CHAIN(const SHAPE_LINE_CHAIN &aShape)
Copy Constructor.
Definition: shape_line_chain.h:82
VECTOR2I p
point of intersection between our and their.
Definition: shape_line_chain.h:66
void Compute(const Container &aPointList)
Compute the bounding box from a given list of points.
Definition: box2.h:79
const SHAPE_LINE_CHAIN Reverse() const
Function Reverse()
Definition: shape_line_chain.cpp:61
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
int PointCount() const
Function PointCount()
Definition: shape_line_chain.h:186
bool Collide(const VECTOR2I &aP, int aClearance=0) const override
Function Collide()
void Append(int aX, int aY, bool aAllowDuplication=false)
Function Append()
Definition: shape_line_chain.h:330
int PathLength(const VECTOR2I &aP) const
Function PathLength()
Definition: shape_line_chain.cpp:299
bool Parse(std::stringstream &aStream) override
Definition: shape_line_chain.cpp:567
Definition: shape_line_chain.h:468
SHAPE_LINE_CHAIN & Simplify()
Function Simplify()
Definition: shape_line_chain.cpp:417
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
Definition: shape_line_chain.h:253
void SetClosed(bool aClosed)
Function SetClosed()
Definition: shape_line_chain.h:150
SHAPE_LINE_CHAIN()
Constructor Initializes an empty line chain.
Definition: shape_line_chain.h:75
SEG their
segment belonging from the aOther argument of Intersect()
Definition: shape_line_chain.h:64
const BOX2I BBox(int aClearance=0) const override
Function BBox()
Definition: shape_line_chain.h:264
bool PointOnEdge(const VECTOR2I &aP) const
Function PointOnEdge()
Definition: shape_line_chain.cpp:346
Class SHAPE.
Definition: shape.h:57
void Remove(int aStartIndex, int aEndIndex)
Function Remove()
Definition: shape_line_chain.cpp:114
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:350
const std::string Format() const override
Definition: shape_line_chain.cpp:526
void Remove(int aIndex)
Function Remove() removes the aIndex-th point from the line chain.
Definition: shape_line_chain.h:424
int SegmentCount() const
Function SegmentCount()
Definition: shape_line_chain.h:171
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:266
SEG Segment(int aIndex)
Function Segment()
Definition: shape_line_chain.h:199
const SEG CSegment(int aIndex) const
Function CSegment()
Definition: shape_line_chain.h:218
Class SHAPE_LINE_CHAIN.
Definition: shape_line_chain.h:47
int Distance(const VECTOR2I &aP) const
Function Distance()
Definition: shape_line_chain.cpp:126
int Length() const
Function Length()
Definition: shape_line_chain.cpp:72
void Clear()
Function Clear() Removes all points from the line chain.
Definition: shape_line_chain.h:137
SHAPE * Clone() const override
Function Clone()
Definition: shape_line_chain.cpp:562
VECTOR2I & Point(int aIndex)
Function Point()
Definition: shape_line_chain.h:238
void Append(const SHAPE_LINE_CHAIN &aOtherLine)
Function Append()
Definition: shape_line_chain.h:363
bool IsClosed() const
Function IsClosed()
Definition: shape_line_chain.h:160
void Replace(int aStartIndex, int aEndIndex, const VECTOR2I &aP)
Function Replace()
SEG our
segment belonging from the (this) argument of Intersect()
Definition: shape_line_chain.h:62