/* * 矩形,圆形的相交测试。 * 转到矩形的局部坐标系 * 然后把相对位置移动到第一象限 * 求出圆心到矩形的最近的点。 */ public static bool DetectSquareCircle(SquareCollider bodyA, CircleCollider bodyB) { Vector2 hA = 0.5f * bodyA.width; Vector2 hB = new Vector2(bodyB.radius, bodyB.radius); Vector2 posA = bodyA.position; Vector2 posB = bodyB.position; Mat22 RotA = new Mat22(bodyA.rotation); Mat22 RotAT = RotA.Transpose(); Vector2 dp = posB - posA; // 距离向量 Vector2 dA = RotAT * dp; // 距离向量,在A的局部坐标系里面表现 Vector2 v = MathUtils.Abs(dA); // 转到第一象限 Vector2 u = MathUtils.Max(v - hA, 0); // 求出最近的点(因为在第一象限,而且是在矩形的坐标系里面,所以可以这么写) return(u.sqrMagnitude <= bodyB.radius * bodyB.radius); // 计算距离 }