圈到圈段碰撞

bee*_*bug 8 algorithm geometry trigonometry collision-detection game-physics

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

底部的图表是我试图找出一些可能的情况,但我相信还有更多.

我了解如何快速exlude极端的情况下,我放弃不跟整个圈子碰撞的任何目标,任何情况下,主循环的中心目标圆圈内有自动真(E图中).

我正在努力寻找一种检查其余案例的好方法.我已经尝试比较圆心和段外线的终点之间的距离,并且我已经尝试从主圆的中心计算目标圆的中心角度并确定它是否在段内,但似乎都没有抓住所有情况.

具体而言,似乎去时髦如果目标圆圈是接近中心但不接触(E和B下面之间的某处),或者如果该段是比目标圆变窄(使得中心是段,但两个边缘内它在外面).

这样做有可靠的方法吗?

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

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

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

碰撞类型 当前解决方案

假阳性 边缘情况


最终编辑

在发现另一个边缘案例(第四张图片)后,我已经确定了一种方法,它结合了下面的两个顶部答案,似乎涵盖了所有基础.我会在这里为了跟随者而描述它.

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

然后测试圆与段的两个外线之间的碰撞.如果它接触到,则返回true.

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

Pet*_*der 5

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

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