WPF:旋转方块的碰撞检测

时间:2009-02-28 08:57:43

标签: wpf math rotation collision-detection

参考我目前正在制作的this programming game

感谢来自this post的答案,我现在能够找到矩形所有点的xy坐标(即使在旋转时),并且与墙壁的碰撞检测现在几乎完美地工作了。

现在我需要与机器人本身实施碰撞检测(显然,在竞技场中会有不止一个机器人)。

方形碰撞检测(非旋转)在这种情况下无效,因为机器人将以某个角度转动(就像我描述的here)。

那么在WPF中实现这种形式的旋转矩形碰撞检测的最佳方法是什么?

我想必须要涉及一些数学,但通常会发现WPF中有函数可以为你“计算”这些数学(就像在this case中一样)

2 个答案:

答案 0 :(得分:9)

解决方案

通过使用我发布的方法作为this previous question的解决方案和名为IntersectsWith的WPF方法(来自Rect),我能够解决此问题的旋转矩形碰撞检测这样:

public Rect GetBounds(FrameworkElement of, FrameworkElement from)
{
        // Might throw an exception if of and from are not in the same visual tree
        GeneralTransform transform = of.TransformToVisual(from);

        return transform.TransformBounds(new Rect(0, 0, of.ActualWidth, of.ActualHeight));
}

Vehicle IsBotCollided(IEnumerable<Vehicle> blist)
{
    //currentBounds is of type Rect, which contains the 4 points of the rectangle (even when rotated)
    var currentBounds = GetBounds(BotBody, BattleArena);

    //Then I check if the current bounds intersect with each of the other Bots` bounds that are also in the Arena
    foreach (Vehicle vehicle in blist)
    {
        if(GetBounds(vehicle.BotBody, BattleArena).IntersectsWith(currentBounds))
        {
            return vehicle;
        }
    }
    return null;
}

答案 1 :(得分:0)

我会检查每一行是否发生碰撞(所以你有最多4 * 4线碰撞检查,如果两条线碰撞,机器人也会这样做,你可以停下来),虽然我确信有更好的/更快的方法来做到这一点。如果矩形可以有不同的大小,你还应该检查较小的是否在另一个内。

如果您首先检查矩形的旋转x / y-min / max-value(或者您甚至可以计算机器人周围的两个圆圈并检查这些,这甚至更快),性能可能略有提高,所以你不要如果它们彼此相距很远,就必须检查线条。