More accurate pushout force calculation for circle-segment collisions. (fixes lp:1551579)

This commit is contained in:
Tomasz Wlostowski 2016-03-01 08:44:02 -05:00 committed by Wayne Stambaugh
parent 5c4fbbec43
commit 79fe4a0acb
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 )
{
VECTOR2I nearest = aB.NearestPoint( aA.GetCenter() );
VECTOR2I f (0, 0);
VECTOR2I f( 0, 0 );
int dist = ( nearest - aA.GetCenter() ).EuclideanNorm();
int min_dist = aClearance + aA.GetRadius();
const VECTOR2I c = aA.GetCenter();
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 )
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;
}

View File

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

View File

@ -59,7 +59,7 @@ public:
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 )