Fix edge case in CIRCLE::Intersect that caused a divide-by-zero crash
Also add some additional test cases.
This commit is contained in:
parent
d98e93de7e
commit
ed39b33d74
|
@ -239,6 +239,9 @@ std::vector<VECTOR2I> CIRCLE::Intersect( const CIRCLE& aCircle ) const
|
|||
if( d > ( r1 + r2 ) || ( d < ( std::abs( r1 - r2 ) ) ) )
|
||||
return retval; //circles do not intersect
|
||||
|
||||
if( d == 0 )
|
||||
return retval; // circles are co-centered. Don't return intersection points
|
||||
|
||||
// Equation (3)
|
||||
int64_t x = ( ( d * d ) + ( r1 * r1 ) - ( r2 * r2 ) ) / ( int64_t( 2 ) * d );
|
||||
int64_t r1sqMinusXsq = ( r1 * r1 ) - ( x * x );
|
||||
|
|
|
@ -271,13 +271,21 @@ static const std::vector<CIR_CIR_VECPT_CASE> intersect_circle_cases = {
|
|||
},
|
||||
},
|
||||
{
|
||||
"tangent aligned",
|
||||
"tangent aligned, external",
|
||||
{ { 10, 10 }, 20 },
|
||||
{ { 10, 50 }, 20 },
|
||||
{
|
||||
{ 10, 30 },
|
||||
},
|
||||
},
|
||||
{
|
||||
"tangent aligned, internal",
|
||||
{ { 10, 10 }, 40 },
|
||||
{ { 10, 30 }, 20 },
|
||||
{
|
||||
{ 10, 50 },
|
||||
},
|
||||
},
|
||||
{
|
||||
"no intersection",
|
||||
{ { 10, 10 }, 20 },
|
||||
|
@ -318,6 +326,14 @@ static const std::vector<CIR_CIR_VECPT_CASE> intersect_circle_cases = {
|
|||
//no points
|
||||
},
|
||||
},
|
||||
{
|
||||
"Co-centered, same radius", // Exercise d=0
|
||||
{ { 205999999, 136367974 }, 3742026 },
|
||||
{ { 205999999, 136367974 }, 3742026 },
|
||||
{
|
||||
//no points
|
||||
},
|
||||
},
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
|
Loading…
Reference in New Issue