gpt4 book ai didi

algorithm - 圆到圆段碰撞

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:33:06 24 4
gpt4 key购买 nike

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

底部的图表是我为了尝试找出一些可能的情况而画的,但我确信还有更多。

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

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

具体来说,如果目标圆靠近中心但不接触它(在下面的 E 和 B 之间的某处),或者如果线段比目标圆窄(这样中心就在线段内),它似乎变得很古怪但两条边都在它外面)。

有可靠的方法吗?

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

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

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

collision types current solution

false positive edge case


最终编辑

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

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

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

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

最佳答案

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

交集需要 A && (B || C)

关于algorithm - 圆到圆段碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4226356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com