我正在研究小行星克隆。一切都是 2D 的,并且是用 C++ 编写的。
对于小行星,我正在生成随机的 N 边多边形。我保证它们是凸的。然后我旋转它们,给它们一个旋转速度,让它们飞过太空。一切正常,而且非常漂亮。
对于碰撞,我使用的是我自己想到的算法。这可能是一个坏主意,如果迫在眉睫,我可能会放弃整个事情并在互联网上找到一个教程。
我已经编写并实现了所有内容,并且碰撞检测工作正常......大部分时间。当屏幕上有明显的碰撞时它会随机失败,有时当没有任何东西接触时会显示碰撞。要么我在某个地方搞砸了我的实现,要么我的算法很糟糕。由于我的实现的大小/范围(在几个源文件中),我不想打扰你,只是想让有人检查我的算法实际上是否合理。到那时,我可以进行一次大型的错误搜索。
算法:
对于每个小行星,我有一个函数可以输出绘制小行星时每个顶点的位置。对于每对相邻的顶点,我为它们所在的线生成公式, y=mx+b
格式。然后我从我的一个飞船顶点开始,测试那个点看它是否在小行星内部。我首先插入该点的 X 坐标,并将输出与实际 Y 值进行比较。这告诉我该点是在线上方还是下方。然后我对小行星的中心做同样的事情,以确定线的哪一半被认为是小行星的“内部”。然后我对每对顶点重复。如果我发现我的点与小行星中心不在同一侧的线,我知道没有碰撞,并退出该点的检测。由于我的船上有 3 个点,所以我必须测试下一个点。如果所有 3 个点都提前退出,那么船上的任何点都没有碰撞,我们就完成了。
我发现这个算法的两个问题是:
- 它不适用于凹多边形,并且
- 它在斜率未定义的边缘情况下存在问题。
我已经确保所有多边形都是凸的,并且已经编写了代码来处理未定义的斜率问题(NAN
如果我们除以,则双精度应该返回0
,所以很容易测试)。
那么,这应该工作吗?