//---------------------------------------------------------------------------- bool Mgc::FindIntersection (const Line2& rkLine0, const Line2& rkLine1, int& riQuantity, Real afT[2]) { Vector2 kDiff; Real fD0SqrLen; bool bIntersects = Find(rkLine0.Origin(),rkLine0.Direction(), rkLine1.Origin(),rkLine1.Direction(),kDiff,fD0SqrLen,riQuantity,afT); if ( bIntersects ) { if ( riQuantity == 2 ) { afT[0] = -Math::MAX_REAL; afT[1] = Math::MAX_REAL; } } return riQuantity != 0; }
//---------------------------------------------------------------------------- bool Mgc::FindIntersection (const Line2& rkLine, const Segment2& rkSegment, int& riQuantity, Real afT[2]) { Vector2 kDiff; Real fD0SqrLen; bool bIntersects = Find(rkLine.Origin(),rkLine.Direction(), rkSegment.Origin(),rkSegment.Direction(),kDiff,fD0SqrLen,riQuantity, afT); if ( bIntersects ) { if ( riQuantity == 1 ) { if ( afT[1] < 0.0f || afT[1] > 1.0f ) { // lines intersect, but segment does not intersect line riQuantity = 0; } } else { // segment is contained by line, adjust intersection interval Real fDot = rkLine.Direction().Dot(rkSegment.Direction()); Real fInvLen = 1.0f/fD0SqrLen; if ( fDot > 0.0f ) { afT[0] = (kDiff.Dot(rkLine.Direction()))*fInvLen; afT[1] = afT[0] + fDot*fInvLen; } else { afT[1] = (kDiff.Dot(rkLine.Direction()))*fInvLen; afT[0] = afT[1] + fDot*fInvLen; } } } return riQuantity != 0; }
//---------------------------------------------------------------------------- bool Mgc::FindIntersection (const Line2& rkLine, const Ray2& rkRay, int& riQuantity, Real afT[2]) { Vector2 kDiff; Real fD0SqrLen; bool bIntersects = Find(rkLine.Origin(),rkLine.Direction(), rkRay.Origin(),rkRay.Direction(),kDiff,fD0SqrLen,riQuantity,afT); if ( bIntersects ) { if ( riQuantity == 1 ) { if ( afT[1] < 0.0f ) { // lines intersect, but ray does not intersect line riQuantity = 0; } } else { // ray is contained by line, adjust intersection interval if ( rkLine.Direction().Dot(rkRay.Direction()) > 0.0f ) { afT[0] = (kDiff.Dot(rkLine.Direction()))/fD0SqrLen; afT[1] = Math::MAX_REAL; } else { afT[0] = -Math::MAX_REAL; afT[1] = (kDiff.Dot(rkLine.Direction()))/fD0SqrLen; } } } return riQuantity != 0; }