3

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

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

一张图片将阐明:

表示为形状的点集 http://www.imagechicken.com/uploads/1277188630025178800.jpg

到目前为止,我最好的想法是遍历每个像素来确定它是在形状“内部”还是“外部”,但这会非常慢,而且我什至不确定如何确定“内部”/ “外面”一点...

有什么提示吗?我正在使用 .NET(C# 和 XNA),如果这对您有帮助的话!

4

3 回答 3

1

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

于 2010-06-22T06:10:56.620 回答
1

只是我要说的任何事情的前兆,我在这个领域没有经验,这就是我解决这个问题的方式。

许多游戏为此使用的一种策略称为 Hit Boxes。检测一个点是否在正方形内比任何其他图形都容易得多。但这不会给你一个精确的碰撞,它可能就在你想要的对象之外。

我以前见过碰撞“气泡”。是我为您找到的链接。这解释了在主机游戏 Super Smash Brothers 中使用碰撞气泡。

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

为了更进一步,我做了一点研究,我看到了一个漂亮的小算法(比前两个建议更先进),“Gilbert-Johnson-Keerthi 凸物体碰撞检测算法”。是你的链接。提供的实现是用 D 编写的。如果您使用 C# 工作,翻译应该不会太难(我强烈建议也消化算法)。

希望这能给你一些方向。

于 2010-06-22T06:40:38.710 回答
1

好吧,由于另一个论坛上的一些帮助,我得到了它的工作。

我用这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);
}

谢谢你们俩的建议

于 2010-06-23T11:42:27.173 回答