9

我正在努力寻找一种坚如磐石的解决方案来检测圆和圆段之间的碰撞。想象一个游戏敌人的视野锥,圆圈代表感兴趣的对象。

底部的图表是我为尝试解决一些可能的情况而绘制的,但我相信还有更多。

我知道如何快速排除极端情况,我丢弃任何不与整个圆碰撞的目标,并且任何主圆的中心在目标圆内的情况都自动为真(图中的 E)。

我正在努力寻找一种检查其余案例的好方法。我试过比较圆心和线段外线端点之间的距离,我试着计算出目标圆心与主圆心的角度,并确定它是否在线段内,但似乎两种方法都无法捕捉到所有情况。

具体来说,如果目标圆靠近中心但不接触它(下方 E 和 B 之间的某个位置),或者如果该线段比目标圆窄(因此中心在该线段内但两个边缘),它似乎变得很时髦在外面)。

有没有可靠的方法来做到这一点?

额外信息:该段由位置 P、方向 O(其大小为圆半径)和视图大小 S 描述。

迄今为止,我最成功的尝试涉及确定向量 ca1 和 ca2 的角度,并检查它们中的任何一个是否位于向量 a1 和 a2 的角度之间。如上所述,这适用于某些情况,但不适用于目标圆大于线段的情况。

编辑 2 在实施下面的最佳建议后,仍然存在误报,我不确定如何最好地消除。请参阅下面的粉红色图表。右下角的圆圈报告为与线段发生碰撞,因为它的边界与半空间和主圆圈重叠。

碰撞类型 当前解决方案

假阳性 边缘案例


最终编辑

在发现另一个边缘情况(第 4 张图片)之后,我决定采用一种方法,该方法结合了下面的两个最佳答案,并且似乎涵盖了所有基础。为了后面的人,我在这里描述一下。

首先排除任何未能通过快速循环测试的内容。

然后测试圆与线段的两条外线之间的碰撞。如果它触及任何一个,则返回 true。

最后,使用圆心和两条外线(如下面的 Gareth 所述)进行几个点到半空间测试。如果它通过了它所在的两个,否则返回false。

4

2 回答 2

5

A. 检查它是否与整个圆相交。
B. 检查它是否与任何一条直线相交。
C. 如果不是,检查圆心之间的角度是否在线段的角度范围内(点积对此有好处)。

交叉口要求A && (B || C)

于 2010-11-19T15:29:53.677 回答
4
于 2010-11-20T11:56:18.800 回答