碰撞检测自定义草图形状,表示为点列表

时间:2010-06-22 05:40:11

标签: c# .net collision-detection shapes plane

我有一组由用户绘制的点。他们将围绕一些物体。

我需要以某种方式将这组点变成一个形状,所以我可以找到检测碰撞的区域。

图片将澄清:

Set of points represented as shape http://www.imagechicken.com/uploads/1277188630025178800.jpg

到目前为止我所拥有的最好的想法是迭代每个像素,确定它是“内部”还是“外部”形状,但这将非常缓慢,我甚至不确定如何做出决定'在'/'外面'位...

任何提示?我正在使用.NET(C#和XNA),如果这有助于你帮助我!

3 个答案:

答案 0 :(得分:1)

您可以将您的形状视为多个形状的并集,每个形状都是一个简单的闭合多边形 如果每个对象位于任何多边形内,则按以下方式检查每个对象:
所有点都用线连接 - 每一行都有一个定义它的方程 对于每个对象 - 为穿过此对象的线构建方程 现在 - 对于每个对象方程式,您需要检查有多少条线(点之间的线)与此对象方程相交 - 但只计算两个点之间的交叉点(而不是在两个点之外的其余部分)两个点)并且只有在物体一侧的交叉点(选择一侧 - 无关紧要) 如果计数是偶数 - 对象在形状之外 - 否则它在里面。

答案 1 :(得分:1)

只是我要说的任何事情的先兆,我没有这个领域的经验,这就是我如何处理这个问题。

许多游戏使用的策略被称为Hit Boxes。检测点是否在正方形内比任何其他图更容易。但是这并没有给你一个确切的碰撞,它可能就在你想要的物体之外。

我以前见过碰撞'泡泡'。 Here是我找到的链接。这解释了在控制台游戏Super Smash Brothers中使用碰撞泡泡。

给定一个点,距离公式和半径,您可以轻松实现碰撞气泡。

为了向前迈进一步,我做了一些研究,我看到了一个漂亮的小算法(比前两个建议更先进),“Gilbert-Johnson-Keerthi碰撞检测算法的凸对象”。 Here是ya的链接。提供的实现是用D语言编写的。如果你在C#中工作,翻译起来应该不会太难(我强烈建议消化算法)。

希望这会给你一些指导。

答案 2 :(得分:1)

好吧,我感谢some help on another forum

我使用GraphicsPath课程为我做了所有艰苦的工作。

这就是我的方法最终看起来像:

public bool IsColliding(Vector2 point)
{
    GraphicsPath gp = new GraphicsPath();

    Vector2 prevPoint = points[0];
    for (int i = 1; i < points.Count; i++)
    {
        Vector2 currentPoint = points[i];

        gp.AddLine(prevPoint.X, prevPoint.Y, currentPoint.X, currentPoint.Y);

        prevPoint = currentPoint;
    }
    gp.CloseFigure();   //closing line segment

    return gp.IsVisible(point.X, point.Y);
}

感谢您的建议