繁体   English   中英

圈到圈段碰撞

[英]Circle to Circle Segment Collision

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

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

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

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

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

这样做有可靠的方法吗?

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

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

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

碰撞类型当前解决方案

假阳性边缘情况


最终编辑

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

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

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

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

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

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

圆弧段(中心角小于180°)是三个数字的交点:圆形和两个半平面:

替代文字

因此,只有当图形与所有这三个图形相交时,图形才会与圆形线段相交。 [这只是如果如果 ; 见下文。]

圆/圆交点很容易(比较它们的中心与它们的半径之和的距离)。

对于圈/半平面相交,表示在晶型P的半平面·N≤k(其中,p是要测试的点,n是这是正常的,以限定所述半平面的线的单位矢量,而k是一个常数)。 然后用中心x和半径为r的圆相交的半平面如果x·N≤K +

(如果您需要处理中心角大于180°的圆形段,请将其分成两段,中心角小于180°。如果我正确理解您的问题描述,您将不需要这样做,因为您的字段视野总是小于180°,但值得一提。)

编辑添加:正如beeglebug所指出的,一个圆可以与所有三个数字相交而不会交叉它们的交点。 哎呀。 但我相信这只有在圆形位于线段中心后面时才会发生,如下图所示,在这种情况下,我们可以对凸形图形应用分离轴测试

圆不能与圆弧段相交,轴显示将它们分开

分离轴定理表示如果存在一条线使得一个图形完全落在线的一侧而另一个图形落在另一侧上,则两个凸形图不能相交。

如果在这种情况下存在任何分离轴,则垂直于圆心和段中心之间的直线的轴是分离轴(如图所示)。

让段的中心位于原点,让圆具有中心x和半径r ,并让两个半平面具有(向外)法线n 1n 2 如果,圆圈在“后面”

x · n 1 > 0且x · n 2 > 0

如果,轴将它与段分开

| x | > r

一个圆不能与圆弧段相交,轴显示将它们分开,标记了点,法线和半径

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM