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