More accurate pushout force calculation for circle-segment collisions. (fixes lp:1551579)
This commit is contained in:
parent
5c4fbbec43
commit
79fe4a0acb
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Reference in New Issue