Fix off-by-one error in distance check for arcs
This commit is contained in:
parent
18e33a0957
commit
590bd6237d
|
@ -74,6 +74,18 @@ public:
|
||||||
*/
|
*/
|
||||||
VECTOR2I NearestPoint( const VECTOR2I& aP ) const;
|
VECTOR2I NearestPoint( const VECTOR2I& aP ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the point (floating point version) on the circumference of the circle that
|
||||||
|
* is the closest to aP.
|
||||||
|
*
|
||||||
|
* In other words: finds the intersection point of this circle and a line that passes through
|
||||||
|
* both this circle's center and aP.
|
||||||
|
*
|
||||||
|
* @param aP.
|
||||||
|
* @return nearest point to aP.
|
||||||
|
*/
|
||||||
|
VECTOR2D NearestPoint( const VECTOR2D& aP ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the intersection points between this circle and \a aCircle.
|
* Compute the intersection points between this circle and \a aCircle.
|
||||||
*
|
*
|
||||||
|
|
|
@ -206,6 +206,18 @@ VECTOR2I CIRCLE::NearestPoint( const VECTOR2I& aP ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VECTOR2D CIRCLE::NearestPoint( const VECTOR2D& aP ) const
|
||||||
|
{
|
||||||
|
VECTOR2D vec = aP - Center;
|
||||||
|
|
||||||
|
// Handle special case where aP is equal to this circle's center
|
||||||
|
if( vec.x == 0 && vec.y == 0 )
|
||||||
|
vec.x = 1; // Arbitrary, to ensure the return value is always on the circumference
|
||||||
|
|
||||||
|
return vec.Resize( Radius ) + Center;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<VECTOR2I> CIRCLE::Intersect( const CIRCLE& aCircle ) const
|
std::vector<VECTOR2I> CIRCLE::Intersect( const CIRCLE& aCircle ) const
|
||||||
{
|
{
|
||||||
// From https://mathworld.wolfram.com/Circle-CircleIntersection.html
|
// From https://mathworld.wolfram.com/Circle-CircleIntersection.html
|
||||||
|
|
|
@ -432,8 +432,8 @@ bool SHAPE_ARC::Collide( const VECTOR2I& aP, int aClearance, int* aActual,
|
||||||
VECTOR2L center = GetCenter();
|
VECTOR2L center = GetCenter();
|
||||||
double radius = ( center - m_start ).EuclideanNorm();
|
double radius = ( center - m_start ).EuclideanNorm();
|
||||||
CIRCLE fullCircle( center, radius );
|
CIRCLE fullCircle( center, radius );
|
||||||
VECTOR2I nearestPt = fullCircle.NearestPoint( aP );
|
VECTOR2D nearestPt = fullCircle.NearestPoint( VECTOR2D( aP ) );
|
||||||
int dist = ( nearestPt - aP ).EuclideanNorm();
|
int dist = nearestPt.Distance( aP );
|
||||||
EDA_ANGLE angleToPt( aP - fullCircle.Center ); // Angle from center to the point
|
EDA_ANGLE angleToPt( aP - fullCircle.Center ); // Angle from center to the point
|
||||||
|
|
||||||
if( !dist )
|
if( !dist )
|
||||||
|
|
Loading…
Reference in New Issue