public static void ClosestSegmentToSegments(Segment2f seg0, Segment2f seg1, out float s, out float t) { Vector2f ab0 = seg0.B - seg0.A; Vector2f ab1 = seg1.B - seg1.A; Vector2f a01 = seg0.A - seg1.A; float d00 = Vector2f.Dot(ab0, ab0); float d11 = Vector2f.Dot(ab1, ab1); float d1 = Vector2f.Dot(ab1, a01); s = 0; t = 0; //Check if either or both segments degenerate into points. if (d00 < FMath.EPS && d11 < FMath.EPS) { return; } if (d00 < FMath.EPS) { //First segment degenerates into a point. s = 0; t = FMath.Clamp01(d1 / d11); } else { float c = Vector2f.Dot(ab0, a01); if (d11 < FMath.EPS) { //Second segment degenerates into a point. s = FMath.Clamp01(-c / d00); t = 0; } else { //The generate non degenerate case starts here. float d2 = Vector2f.Dot(ab0, ab1); float denom = d00 * d11 - d2 * d2; //if segments not parallel compute closest point and clamp to segment. if (!FMath.IsZero(denom)) { s = FMath.Clamp01((d2 * d1 - c * d11) / denom); } else { s = 0; } t = (d2 * s + d1) / d11; if (t < 0.0f) { t = 0.0f; s = FMath.Clamp01(-c / d00); } else if (t > 1.0f) { t = 1.0f; s = FMath.Clamp01((d2 - c) / d00); } } } }