more accurate pushout force calculation for circle-segment collisions

This commit is contained in:
Tomasz Wlostowski 2016-03-01 14:26:08 +01:00 committed by Maciej Suminski
parent bd800630be
commit 0fa71d8d8f
3 changed files with 19 additions and 7 deletions

View File

@ -121,14 +121,26 @@ static inline bool Collide( const SHAPE_RECT& aA, const SHAPE_CIRCLE& aB, int aC
static VECTOR2I pushoutForce( const SHAPE_CIRCLE& aA, const SEG& aB, int aClearance ) static VECTOR2I pushoutForce( const SHAPE_CIRCLE& aA, const SEG& aB, int aClearance )
{ {
VECTOR2I nearest = aB.NearestPoint( aA.GetCenter() ); VECTOR2I f( 0, 0 );
VECTOR2I f (0, 0);
int dist = ( nearest - aA.GetCenter() ).EuclideanNorm(); const VECTOR2I c = aA.GetCenter();
int min_dist = aClearance + aA.GetRadius(); const VECTOR2I nearest = aB.NearestPoint( c );
const int r = aA.GetRadius();
int dist = ( nearest - c ).EuclideanNorm();
int min_dist = aClearance + r;
if( dist < min_dist ) if( dist < min_dist )
f = ( aA.GetCenter() - nearest ).Resize ( min_dist - dist + 10 ); {
for( int corr = 0; corr < 5; corr++ )
{
f = ( aA.GetCenter() - nearest ).Resize( min_dist - dist + corr );
if( aB.Distance( c + f ) >= min_dist )
break;
}
}
return f; return f;
} }

View File

@ -63,7 +63,7 @@ public:
{ {
int rc = aClearance + m_radius; int rc = aClearance + m_radius;
return aSeg.Distance( m_center ) <= rc; return aSeg.Distance( m_center ) < rc;
} }
void SetRadius( int aRadius ) void SetRadius( int aRadius )

View File

@ -59,7 +59,7 @@ public:
bool Collide( const VECTOR2I& aP, int aClearance = 0 ) const bool Collide( const VECTOR2I& aP, int aClearance = 0 ) const
{ {
return m_seg.Distance( aP ) <= ( m_width + 1 ) / 2 + aClearance; return m_seg.Distance( aP ) < ( m_width + 1 ) / 2 + aClearance;
} }
void SetSeg( const SEG& aSeg ) void SetSeg( const SEG& aSeg )