Add a clearance check for closed shape line chains

Also improves speed of multiple point checks by first eliminating points
outside of the BBox.
This commit is contained in:
Seth Hillbrand 2018-05-08 13:03:52 -07:00
parent 108dc20fba
commit d67821d771
2 changed files with 19 additions and 3 deletions

View File

@ -331,7 +331,7 @@ int SHAPE_LINE_CHAIN::PathLength( const VECTOR2I& aP ) const
bool SHAPE_LINE_CHAIN::PointInside( const VECTOR2I& aP ) const
{
if( !m_closed || SegmentCount() < 3 )
if( !m_closed || SegmentCount() < 3 || !BBox().Contains( aP ) )
return false;
bool inside = false;
@ -358,6 +358,12 @@ bool SHAPE_LINE_CHAIN::PointInside( const VECTOR2I& aP ) const
bool SHAPE_LINE_CHAIN::PointOnEdge( const VECTOR2I& aP ) const
{
return CheckClearance( aP, 1 );
}
bool SHAPE_LINE_CHAIN::CheckClearance( const VECTOR2I& aP, const int aDist) const
{
if( !PointCount() )
return false;
@ -372,7 +378,7 @@ bool SHAPE_LINE_CHAIN::PointOnEdge( const VECTOR2I& aP ) const
if( s.A == aP || s.B == aP )
return true;
if( s.Distance( aP ) <= 1 )
if( s.Distance( aP ) <= aDist )
return true;
}

View File

@ -532,7 +532,7 @@ public:
/**
* Function PointInside()
*
* Checks if point aP lies inside a convex polygon defined by the line chain. For closed
* Checks if point aP lies inside a polygon (any type) defined by the line chain. For closed
* shapes only.
* @param aP point to check
* @return true if the point is inside the shape (edge is not treated as being inside).
@ -548,6 +548,16 @@ public:
*/
bool PointOnEdge( const VECTOR2I& aP ) const;
/**
* Function CheckClearance()
*
* Checks if point aP is closer to (or on) an edge or vertex of the line chain.
* @param aP point to check
* @param aDist distance in internal units
* @return true if the point is equal to or closer than aDist to the line chain.
*/
bool CheckClearance( const VECTOR2I& aP, const int aDist) const;
/**
* Function SelfIntersecting()
*