C#XNA计算矩形之间的距离(旋转友好型)

C#XNA计算矩形之间的距离(旋转友好型),c#,xna,collision,detection,C#,Xna,Collision,Detection,这里有两种可用的方法 if(rectangle.Intersects(otherRectangle)) { //collision stuff } 捕捉:仅适用于非旋转矩形 if(Vector2.Distance(player.pos, enemy.pos) < 50) { //collision stuff } if(矢量2.距离(player.pos,敌军.pos)

这里有两种可用的方法

if(rectangle.Intersects(otherRectangle))
{
    //collision stuff
}
捕捉:仅适用于非旋转矩形

if(Vector2.Distance(player.pos, enemy.pos) < 50)
{
    //collision stuff
}
if(矢量2.距离(player.pos,敌军.pos)<50)
{
//碰撞材料
}
捕获:仅适用于圆

我想要的是计算这张图中的x和y:

事实

定义了两个矩形的宽度和长度以及它们的旋转。 我可以用毕达哥拉斯定理计算D。 但真正的距离是D-(X+Y)

一般方法

显然,x和y可以用余弦规则来计算。 但我只有宽度或长度以及两个形状之间的角度

并发症

另外,这需要对任何旋转都有效。 左边的矩形可以向任何方向旋转,x会根据所述旋转而不同

问题

如何计算x和y?
我只想要一种比边界框和毕达哥拉斯定理更复杂的有效碰撞检测方法。

一种方法是以相反的角度旋转直线,并使用轴对齐框进行检查:

class RotatedBox 
{
    ...

    float CalcIntersectionLength(Vector2 lineTo) //assume that the line starts at the box' origin
    {
        Matrix myTransform = Matrix.CreateRotationZ(-this.RotationAngle);
        var lineDirection = Vector2.Transform(lineTo -this.Center, myTransform);
        lineDirection.Normalize();
        var distanceToHitLeftOrRight = this.Width / 2 / Math.Abs(lineDirection.X);
        var distanceToHitTopOrBottom = this.Height / 2 / Math.Abbs(lineDirection.Y);
        return Math.Min(distanceToHitLeftOrRight, distanceToHitTopOrBottom);
    }
}
现在,您可以使用

 var distance = (box1.Center - box2.Center).Length
                - box1.CalcIntersectionLength(box2.Center)
                - box2.CalcIntersectionLength(box1.Center);

确保旋转方向与您的视觉效果相匹配。

“我只想要一种更复杂的有效碰撞检测方法…”小心不要寻求复杂性。。。它会找到你,你可能会后悔。说真的,搜索SAT。那么你想不想使用毕达哥拉斯定理?您还可以研究
Vector2
方法,例如
Vector2.Dot()
我需要使用毕达哥拉斯定理来获得距离。Center和lineTo是什么?Center是长方体的中心,
lineTo
直线的目标。我刚刚在一个测试应用程序中实现了这一点。它起作用了。确保
宽度
属于未旋转的x轴,
高度
属于未旋转的y轴。确保可视化与数据匹配(即,正确的中心点、正确的旋转方向)。视频中的中心点似乎有点偏离。我用sb.Draw(纹理,新矩形((int)Center.X,(int)Center.Y,(int)Width,(int)Height),null,Color.White,RotationAngle,new Vector2(Texture.Width/2,Texture.Height/2),SpriteEffects.None,0)绘制了示例框<代码>旋转角度必须以弧度为单位。