如何确定两个圆形扇区是否相互重叠

wzb*_*210 9 java algorithm

每个扇区可以表示为(x,y,r,a,d),其中x,y是位置,r是半径,d是方向,a是角度.鉴于这两个循环扇区的信息,如何确定它们是否相互重叠?有没有有效的算法来解决它?谢谢!

pax*_*blo 8

我知道有一种非常快速的方法来折扣这种可能性,因为我以前用它来进行圆碰撞.

计算两个中心之间的距离,然后,如果大于半径之和,则不会发生碰撞.为了提高效率,不要使用平方根,只需直接处理平方值:

if (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) > (r1 + r2) * (r1 + r2):
    # No chance of collision.
Run Code Online (Sandbox Code Playgroud)

对圆形段进行处理将会更加困难.


您选择的方法取决于您需要的准确程度.如果您正在进行实际数学运算,则可能需要高精度.但是,例如,如果您正在为计算机游戏这样的事情做这件事,那么足够接近可能就足够了.

如果是这种情况,我会考虑将弧线转换成一系列直线(其数量可能取决于a弧线的"扩散") - 你可能可以通过几条线来获得一度弧度的传播,但180度不会太好.

直线碰撞检测是一种更为人熟知的方法,尽管您必须处理比较次数可能快速增加的事实.


如果您不想使用线段,那么这是要遵循的过程.它使用圆碰撞算法找出整圆的零点,一点或两点碰撞,然后检查这些点以查看它们是否在两个弧内.

首先,运行上面的检查以检测不可能发生碰撞的情况.如果圆圈之间不可能发生碰撞,那么弧线也不会发生碰撞.

其次,检查圆圈是否有单个碰撞点.如果是这样的情况:

(x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) == (r1 + r2) * (r1 + r2)
Run Code Online (Sandbox Code Playgroud)

当然,在合适的误差范围内.我们现在都应该知道,比较相等的浮点数应该使用某种delta比较.

如果是这种情况,你有一点要检查,你可以很容易地找到这一点.这是点r1沿直线从单位领导(x1,y1)(x2,y2)或,看着它作为移动沿着这条线一定分数:

(x1 + (x2-x1) * (r1+r2) / r1, y1 + (y2-y1) * (r1+r2) / r1)
Run Code Online (Sandbox Code Playgroud)

否则,有两点要检查,你可以使用像这样的问题的答案来确定这两点是什么.

一旦你有一些碰撞点,这是一个更简单的方法来确定这些点是否在弧上,记住候选点需要在两个弧上,以便它们碰撞,而不仅仅是在一个.