Algorithm 检查同一圆上的两段是否重叠/相交
给定同一圆的两个圆段:A=[a1,a2]和B=[b1,b2],其中:Algorithm 检查同一圆上的两段是否重叠/相交,algorithm,language-agnostic,geometry,2d,angle,Algorithm,Language Agnostic,Geometry,2d,Angle,给定同一圆的两个圆段:A=[a1,a2]和B=[b1,b2],其中: a1、a2、b1、b2值,以-inf和+inf之间的度数表示 a1如何将每个度值规格化为0-360: a1_norm = a1 % 360 a2_norm = a2 % 360 b1_norm = b1 % 360 b2_norm = b2 % 360 然后您只需检查交叉点: (a1_norm <= b2_norm) and (a2_norm<= b1_norm) (a1_norm正如@admaoldak所
- a1、a2、b1、b2值,以-inf和+inf之间的度数表示
- a1如何将每个度值规格化为0-360:
然后您只需检查交叉点:a1_norm = a1 % 360 a2_norm = a2 % 360 b1_norm = b1 % 360 b2_norm = b2 % 360
(a1_norm <= b2_norm) and (a2_norm<= b1_norm)
(a1_norm正如@admaoldak所提到的,首先标准化度:
现在检查b1是否在(a1,a2)范围内a1_norm = a1 % 360 a2_norm = a2 % 360 b1_norm = b1 % 360 b2_norm = b2 % 360
对于区间[i.X,i.Y],让我们定义归一化i_norm=normalize(i),以便:1. 0 <= i_norm.X < 360 2. i_norm.X <=i_norm.Y
我们可以证明,, 对于您的输入A和B,A圆圈与B重叠,当且仅当: 标准化(A)间隔与标准化(B) 或 标准化(A)间隔与幻灯片重叠(标准化(B)) 间隔重叠的定义方式与adamoldak文章中的“交叉点”相同 而且normalize()和slide()这两种操作都很容易实现 以你的例子:1. i_slide.X = i.X + 360 2. i_slide.Y = i.Y + 360
,我们有A=[-45°,45°];B=[10°,20°]
normalize(A) = [315,405] normalize(B) = [10,20] slide( normalize(B) ) = [370,380]
[315405]间隔与[370380]重叠我对循环地图中矩形重叠的游戏引擎也有类似的问题。我对此考虑了很多,也看过你们的一些答案。如果你在寻找性能,这是你能得到的最好结果(直到有人证明我错了:p):#假设角度已经标准化 def重叠(a1、a2、b1、b2): 如果a2-a1+b2-b1>360:#必须重叠 返回真值 返回(b1>a2)^(b2>a1)^(a2
优雅。优雅,有点难看。如果你没有指定圆的半径或圆心,可能会重复。我们是否要假设圆弧在同一个圆上?@HighPerformanceMark我不认为其他问题是重复的。这个问题的答案包括排序数组和管理相邻线段的列表。@Chris是的,the段在同一个圆圈上;我在文本中有这一点,但标题可能不清楚,我修改了问题标题以反映这一点fact@HighPerformanceMark我刚刚看到你修改了链接;另一个问题看起来确实相关,虽然它们看起来只有0°和360°之间的角度。答案似乎与我的基本想法相似对于分割段,我想知道这是否真的是解决我问题的有效方法,是否有更好的方法?a=[-45°,45°];B=[10°,20°]==>a=[315°,45°];B=[10°,20°],然后a1_norm是>b2_norm,尽管有重叠谢谢!这就是我使用的;虽然速度是个问题,但我认为只检查
就足以覆盖所有关于A=[-45°,45°];B=[180°,359°]==>注意,对于负数(我不知道python,但在大多数C语言中都是这种情况)开关A和B,模块通常没有正确实现,示例中断。您需要检查范数(A)与范数(B),幻灯片(范数(A))与范数(B)以及范数(A)与幻灯片(范数(B)相交(b1_norm,a1_norm,a2_norm)|相交(a1_norm,b1_norm,b2_norm)
1. 0 <= i_norm.X < 360 2. i_norm.X <=i_norm.Y
1. i_slide.X = i.X + 360 2. i_slide.Y = i.Y + 360
normalize(A) = [315,405] normalize(B) = [10,20] slide( normalize(B) ) = [370,380]