geometry: SHAPE_RECT: use SquaredDistance() for collision detection
This commit is contained in:
parent
d6fa81036b
commit
8fb154e04e
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
#include <geometry/shape_rect.h>
|
#include <geometry/shape_rect.h>
|
||||||
|
|
||||||
|
|
||||||
bool SHAPE_RECT::Collide( const SEG& aSeg, int aClearance, int* aActual,
|
bool SHAPE_RECT::Collide( const SEG& aSeg, int aClearance, int* aActual,
|
||||||
VECTOR2I* aLocation ) const
|
VECTOR2I* aLocation ) const
|
||||||
{
|
{
|
||||||
|
@ -62,31 +61,47 @@ bool SHAPE_RECT::Collide( const SEG& aSeg, int aClearance, int* aActual,
|
||||||
|
|
||||||
for( int i = 0; i < 4; i++ )
|
for( int i = 0; i < 4; i++ )
|
||||||
{
|
{
|
||||||
SEG side = SEG( corners[i], corners[ i + 1] );
|
SEG side( corners[i], corners[ i + 1] );
|
||||||
VECTOR2I pnA = side.NearestPoint( aSeg );
|
SEG::ecoord dist_sq = side.SquaredDistance( aSeg );
|
||||||
VECTOR2I pnB = aSeg.NearestPoint( side );
|
|
||||||
SEG::ecoord dist_sq = ( pnA - pnB ).SquaredEuclideanNorm();
|
|
||||||
|
|
||||||
if( dist_sq < closest_dist_sq )
|
if( dist_sq < closest_dist_sq )
|
||||||
{
|
{
|
||||||
nearest = pnA;
|
if ( aLocation )
|
||||||
closest_dist_sq = dist_sq;
|
{
|
||||||
|
nearest = side.NearestPoint( aSeg );
|
||||||
|
}
|
||||||
|
|
||||||
if( closest_dist_sq == 0 || !aActual )
|
closest_dist_sq = dist_sq;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( closest_dist_sq == 0 || closest_dist_sq < SEG::Square( aClearance ) )
|
if( closest_dist_sq == 0 || closest_dist_sq < SEG::Square( aClearance ) )
|
||||||
{
|
{
|
||||||
if( aLocation )
|
|
||||||
*aLocation = nearest;
|
|
||||||
|
|
||||||
if( aActual )
|
if( aActual )
|
||||||
*aActual = sqrt( closest_dist_sq );
|
*aActual = sqrt( closest_dist_sq );
|
||||||
|
|
||||||
|
if( aLocation )
|
||||||
|
*aLocation = nearest;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::string SHAPE_RECT::Format( ) const
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
|
||||||
|
ss << "SHAPE_RECT( ";
|
||||||
|
ss << m_p0.x;
|
||||||
|
ss << ", ";
|
||||||
|
ss << m_p0.y;
|
||||||
|
ss << ", ";
|
||||||
|
ss << m_w;
|
||||||
|
ss << ", ";
|
||||||
|
ss << m_h;
|
||||||
|
ss << ");";
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue