more accurate pushout force calculation for circle-segment collisions
This commit is contained in:
parent
bd800630be
commit
0fa71d8d8f
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
Loading…
Reference in New Issue