Fix TRANSFORM::MapAngles (Third time lucky?)

Use epsilon value to decide whether we should swap the angles

Fixes https://gitlab.com/kicad/code/kicad/-/issues/12346
This commit is contained in:
Roberto Fernandez Bautista 2022-09-04 23:21:15 +02:00
parent 895a8a8dbc
commit 6013c796dd
1 changed files with 14 additions and 19 deletions

View File

@ -77,6 +77,8 @@ TRANSFORM TRANSFORM::InverseTransform() const
bool TRANSFORM::MapAngles( EDA_ANGLE* aAngle1, EDA_ANGLE* aAngle2 ) const bool TRANSFORM::MapAngles( EDA_ANGLE* aAngle1, EDA_ANGLE* aAngle2 ) const
{ {
static const EDA_ANGLE epsilon( 0.1, DEGREES_T );
wxCHECK_MSG( aAngle1 != nullptr && aAngle2 != nullptr, false, wxCHECK_MSG( aAngle1 != nullptr && aAngle2 != nullptr, false,
wxT( "Cannot map NULL point angles." ) ); wxT( "Cannot map NULL point angles." ) );
@ -84,42 +86,35 @@ bool TRANSFORM::MapAngles( EDA_ANGLE* aAngle1, EDA_ANGLE* aAngle2 ) const
VECTOR2D v; VECTOR2D v;
bool swap = false; bool swap = false;
EDA_ANGLE delta = ( *aAngle2 - *aAngle1 ).Normalize180(); EDA_ANGLE delta = *aAngle2 - *aAngle1;
x = aAngle1->Cos(); x = aAngle1->Cos();
y = aAngle1->Sin(); y = aAngle1->Sin();
v = VECTOR2D( x * x1 + y * y1, x * x2 + y * y2 ); v = VECTOR2D( x * x1 + y * y1, x * x2 + y * y2 );
*aAngle1 = EDA_ANGLE( v ); *aAngle1 = EDA_ANGLE( v );
aAngle1->Normalize180();
x = aAngle2->Cos(); x = aAngle2->Cos();
y = aAngle2->Sin(); y = aAngle2->Sin();
v = VECTOR2D( x * x1 + y * y1, x * x2 + y * y2 ); v = VECTOR2D( x * x1 + y * y1, x * x2 + y * y2 );
*aAngle2 = EDA_ANGLE( v ); *aAngle2 = EDA_ANGLE( v );
aAngle2->Normalize180();
EDA_ANGLE deltaTransformed = ( *aAngle2 - *aAngle1 ).Normalize180(); EDA_ANGLE deltaTransformed = *aAngle2 - *aAngle1;
EDA_ANGLE residualError( deltaTransformed - delta );
residualError.Normalize();
if( sign( deltaTransformed.AsDegrees() ) if( residualError > epsilon || residualError < epsilon.Invert().Normalize() )
!= sign( delta.AsDegrees() ) )
{ {
std::swap( *aAngle1, *aAngle2 ); std::swap( *aAngle1, *aAngle2 );
swap = true; swap = true;
if( *aAngle2 < *aAngle1 )
*aAngle2 += ANGLE_360;
} }
#ifdef DEBUG if( *aAngle2 < *aAngle1 )
// This check is only valid for coordinate inversions (y=-y). If we start using this function on {
// more complex transforms (different x to y scaling), we should re-write it/re think it. if( *aAngle2 < ANGLE_0 )
static const EDA_ANGLE epsilon( 0.1, DEGREES_T ); aAngle2->Normalize();
else
EDA_ANGLE residualError( *aAngle2 - *aAngle1 - delta ); *aAngle1 = aAngle1->Normalize() - ANGLE_360;
residualError.Normalize(); }
assert( residualError < epsilon || residualError > epsilon.Invert().Normalize() );
#endif // DEBUG
return swap; return swap;
} }