Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 检查同一圆上的两段是否重叠/相交_Algorithm_Language Agnostic_Geometry_2d_Angle - Fatal编程技术网

Algorithm 检查同一圆上的两段是否重叠/相交

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所

给定同一圆的两个圆段: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_norm = a1 % 360
    a2_norm = a2 % 360
    b1_norm = b1 % 360
    b2_norm = b2 % 360
    
    现在检查b1是否在(a1,a2)范围内


    对于区间[i.X,i.Y],让我们定义归一化i_norm=normalize(i),以便:

    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
    
    我们可以证明,, 对于您的输入ABA圆圈与B重叠,当且仅当:

    标准化(A)间隔与标准化(B)

    标准化(A)间隔与幻灯片重叠(标准化(B))

    间隔重叠的定义方式与adamoldak文章中的“交叉点”相同

    而且normalize()slide()这两种操作都很容易实现

    以你的例子:
    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,尽管有重叠谢谢!这就是我使用的;虽然速度是个问题,但我认为只检查
    相交(b1_norm,a1_norm,a2_norm)|相交(a1_norm,b1_norm,b2_norm)
    就足以覆盖所有关于A=[-45°,45°];B=[180°,359°]==>注意,对于负数(我不知道python,但在大多数C语言中都是这种情况)开关A和B,模块通常没有正确实现,示例中断。您需要检查范数(A)与范数(B),幻灯片(范数(A))与范数(B)以及范数(A)与幻灯片(范数(B)
    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]