public float FindMinSeparation(out int indexA, out int indexB, float t) { Transform xfA, xfB; _sweepA.GetTransform(out xfA, t); _sweepB.GetTransform(out xfB, t); switch (_type) { case SeparationFunctionType.Points: { Vector2 axisA = MathUtils.MultiplyT(ref xfA.R, _axis); Vector2 axisB = MathUtils.MultiplyT(ref xfB.R, -_axis); indexA = _proxyA.GetSupport(axisA); indexB = _proxyB.GetSupport(axisB); Vector2 localPointA = _proxyA.GetVertex(indexA); Vector2 localPointB = _proxyB.GetVertex(indexB); Vector2 pointA = MathUtils.Multiply(ref xfA, localPointA); Vector2 pointB = MathUtils.Multiply(ref xfB, localPointB); float separation = Vector2.Dot(pointB - pointA, _axis); return(separation); } case SeparationFunctionType.FaceA: { Vector2 normal = MathUtils.Multiply(ref xfA.R, _axis); Vector2 pointA = MathUtils.Multiply(ref xfA, _localPoint); Vector2 axisB = MathUtils.MultiplyT(ref xfB.R, -normal); indexA = -1; indexB = _proxyB.GetSupport(axisB); Vector2 localPointB = _proxyB.GetVertex(indexB); Vector2 pointB = MathUtils.Multiply(ref xfB, localPointB); float separation = Vector2.Dot(pointB - pointA, normal); return(separation); } case SeparationFunctionType.FaceB: { Vector2 normal = MathUtils.Multiply(ref xfB.R, _axis); Vector2 pointB = MathUtils.Multiply(ref xfB, _localPoint); Vector2 axisA = MathUtils.MultiplyT(ref xfA.R, -normal); indexB = -1; indexA = _proxyA.GetSupport(axisA); Vector2 localPointA = _proxyA.GetVertex(indexA); Vector2 pointA = MathUtils.Multiply(ref xfA, localPointA); float separation = Vector2.Dot(pointA - pointB, normal); return(separation); } default: Debug.Assert(false); indexA = -1; indexB = -1; return(0.0f); } }