我正在努力寻找一个可靠的解决方案来检测圆和圆段之间的碰撞。想象一下游戏敌人的视场锥体,其中圆圈代表感兴趣的物体。
底部的图表是我为了尝试解决一些可能的情况而绘制的,但我确信还有更多。
我了解如何快速排除极端情况,我丢弃任何不与整个圆碰撞的目标,并且主圆的中心在目标圆内的任何情况都自动为真(图中的E)。
我正在努力寻找一种好方法来检查其余的情况。我尝试比较圆心与线段外线端点之间的距离,并且尝试计算出目标圆中心与主圆中心的角度,并确定其是否在线段内,但这两种方法似乎都无法捕获所有情况。
具体来说,如果目标圆靠近中心但不接触它(下面的 E 和 B 之间的某个位置),或者如果线段比目标圆窄(因此中心位于线段内但两个边缘都在),则似乎会变得很奇怪都在它外面)。
有可靠的方法来做到这一点吗?
额外信息:该段由位置 P、方向 O(其大小为圆半径)和视图大小 S 来描述。
迄今为止,我最成功的尝试涉及确定向量 ca1 和 ca2 的角度,并检查它们中的任何一个是否位于向量 a1 和 a2 的角度之间。这适用于如上所述的某些情况,但不适用于目标圆大于线段的情况。
Edit 2在实施下面的最佳建议后,仍然存在误报,我不确定如何最好地消除该误报。请参阅下面的粉红色图。右下角的圆报告为与线段碰撞,因为它的边界与半空间和主圆重叠。
最终编辑
在发现另一个边缘情况(第四张图)后,我决定采用一种方法,该方法结合了下面的两个最佳答案,并且似乎涵盖了所有基础。为了方便后面的人,我将在这里描述它。
首先排除任何未通过快速环对环测试的东西。
然后测试圆与线段的两条外线之间的碰撞。如果触及其中任何一个,则返回 true。
最后,使用圆心和两条外线进行一些点到半空间测试(如下 Gareth 所描述)。如果它通过了它所在的两个,否则返回 false。