47 return ( aSeg.
A == aPoint ) ? aSeg.
B : aSeg.
A;
53 if( aSegA.
A == aSegB.
A || aSegA.
A == aSegB.
B )
57 else if( aSegA.
B == aSegB.
A || aSegA.
B == aSegB.
B )
68 const std::array<VECTOR2I, 4> corners = {
76 SEG{ corners[0], corners[1] },
77 SEG{ corners[1], corners[2] },
78 SEG{ corners[2], corners[3] },
79 SEG{ corners[3], corners[0] },
147 std::optional<VECTOR2I> ptA, ptB;
149 for(
const SEG& boxSeg : boxSegs )
159 if( !ptA || *intersection == *ptA )
173 return SEG( *ptA, *ptB );
178 if( ptA && *ptA != aRay.
GetStart() )
193 std::optional<VECTOR2I> ptA, ptB;
195 for(
const SEG& boxSeg : boxSegs )
200 if( intersection && boxSeg.Contains( *intersection ) )
203 if( !ptA || *intersection == *ptA )
218 return SEG( *ptA, *ptB );
253 default: wxFAIL_MSG(
"Invalid direction" );
return SHAPE_ARC();
287 default: wxFAIL_MSG(
"Invalid direction" );
309 return nw +
VECTOR2I( -aOutset, -aOutset );
317 wxFAIL_MSG(
"Invalid direction" );
326 std::vector<TYPED_POINT2I> pts;
341 pt.m_point += aCircle.
Center;
352 const auto handleSegment = [&](
const SEG& aSeg )
354 const VECTOR2I p0( aSeg.A.x, aSeg.B.y );
355 const VECTOR2I p1( aSeg.B.x, aSeg.A.y );
357 raOutline.
Append( aSeg.A );
366 handleSegment( aPoly.
CSegment( i ) );
384 if( aHole.PointCount() < 3 || aHole.Area() == 0 )
389 aOutline.
AddHole( std::move( aHole ) );
398 std::vector<VECTOR2I> pts;
400 for(
size_t i = 0; i < aN; i++ )
403 pts.push_back(
KiROUND( pt + aCenter ) );
411 int aRadius,
bool aAcrossCorners,
414 if( !aAcrossCorners )
417 aRadius = aRadius / (
FULL_CIRCLE / ( aN * 2 ) ).Cos();
428 std::vector<SEG> segs;
431 segs.emplace_back( pt0, aCenter - ( pt0 - aCenter ) );
434 segs.emplace_back( pt0, aCenter - ( pt0 - aCenter ) );
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
constexpr coord_type GetLeft() const
constexpr coord_type GetRight() const
constexpr coord_type GetTop() const
constexpr coord_type GetBottom() const
Represent basic circle geometry with utility geometry functions.
VECTOR2I Center
Public to make access simpler.
int Radius
Public to make access simpler.
Directions
Available directions, there are 8 of them, as on a rectilinear map (north = up) + an extra undefined ...
OPT_VECTOR2I Intersect(const SEG &aSeg) const
const VECTOR2I & GetStart() const
Get the start point of the ray.
OPT_VECTOR2I Intersect(const SEG &aOther) const
SEG Reversed() const
Returns the center point of the line.
bool PointInside(const VECTOR2I &aPt, int aAccuracy=0, bool aUseBBoxCache=false) const override
Check if point aP lies inside a closed shape.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
bool IsClosed() const override
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
void Simplify(int aMaxError=0)
Simplify the line chain by removing colinear adjacent segments and duplicate vertices.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
int SegmentCount() const
Return the number of segments in this line chain.
const SEG CSegment(int aIndex) const
Return a constant copy of the aIndex segment in the line chain.
Represent a set of closed polygons.
int AddHole(const SHAPE_LINE_CHAIN &aHole, int aOutline=-1)
Adds a new hole to the given outline (default: last) and returns its index.
const VECTOR2I & GetPosition() const
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE FULL_CIRCLE
static constexpr EDA_ANGLE ANGLE_180
bool AddHoleIfValid(SHAPE_POLY_SET &aOutline, SHAPE_LINE_CHAIN &&aHole)
Adds a hole to a polygon if it is valid (i.e.
VECTOR2I GetPoint(const SHAPE_RECT &aRect, DIRECTION_45::Directions aDir, int aOutset=0)
Get the point on a rectangle that corresponds to a given direction.
std::vector< TYPED_POINT2I > GetCircleKeyPoints(const CIRCLE &aCircle, bool aIncludeCenter)
Get key points of an CIRCLE.
std::vector< VECTOR2I > MakeRegularPolygonPoints(const VECTOR2I &aCenter, size_t aN, const VECTOR2I &aPt0)
Get the corners of a regular polygon from the centre, one point and the number of sides.
OPT_VECTOR2I GetSharedEndpoint(const SEG &aSegA, const SEG &aSegB)
Get the shared endpoint of two segments, if it exists, or std::nullopt if the segments are not connec...
std::vector< SEG > GetSegsInDirection(const BOX2I &aBox, DIRECTION_45::Directions aDir)
Get the segments of a box that are in the given direction.
SEG NormalisedSeg(const SEG &aSeg)
Returns a SEG such that the start point is smaller or equal in x and y compared to the end point.
std::vector< SEG > MakeCrossSegments(const VECTOR2I &aCenter, const VECTOR2I &aSize, EDA_ANGLE aAngle)
Create the two segments for a cross.
std::array< SEG, 4 > BoxToSegs(const BOX2I &aBox)
Decompose a BOX2 into four segments.
std::optional< SEG > ClipHalfLineToBox(const HALF_LINE &aRay, const BOX2I &aBox)
Get the segment of a half-line that is inside a box, if any.
std::optional< SEG > ClipLineToBox(const LINE &aLine, const BOX2I &aBox)
Get the segment of a line that is inside a box, if any.
SHAPE_ARC MakeArcCw180(const VECTOR2I &aCenter, int aRadius, DIRECTION_45::Directions aDir)
Get a SHAPE_ARC representing a 180-degree arc in the clockwise direction with the midpoint in the giv...
SHAPE_LINE_CHAIN RectifyPolygon(const SHAPE_LINE_CHAIN &aPoly)
SHAPE_ARC MakeArcCw90(const VECTOR2I &aCenter, int aRadius, DIRECTION_45::Directions aDir)
Get a SHAPE_ARC representing a 90-degree arc in the clockwise direction with the midpoint in the give...
void CollectBoxCorners(const BOX2I &aBox, std::vector< VECTOR2I > &aCorners)
Add the 4 corners of a BOX2I to a vector.
const VECTOR2I & GetOtherEnd(const SEG &aSeg, const VECTOR2I &aPoint)
Get the end point of the segment that is not the given point.
@ PT_CENTER
The point is the center of something.
@ PT_QUADRANT
The point is on a quadrant of a circle (N, E, S, W points).
std::optional< VECTOR2I > OPT_VECTOR2I
Utility functions for working with shapes.
VECTOR2I GetRotated(const VECTOR2I &aVector, const EDA_ANGLE &aAngle)
Return a new VECTOR2I that is the result of rotating aVector by aAngle.
VECTOR2< int32_t > VECTOR2I
constexpr int LexicographicalCompare(const VECTOR2< T > &aA, const VECTOR2< T > &aB)