我有一组由用户绘制的点。他们将围绕一些物体。
我需要以某种方式将这组点变成一个形状,所以我可以找到检测碰撞的区域。
图片将澄清:
Set of points represented as shape http://www.imagechicken.com/uploads/1277188630025178800.jpg
到目前为止我所拥有的最好的想法是迭代每个像素,确定它是“内部”还是“外部”形状,但这将非常缓慢,我甚至不确定如何做出决定'在'/'外面'位...
任何提示?我正在使用.NET(C#和XNA),如果这有助于你帮助我!
答案 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);
}
感谢您的建议