【问题标题】:Find the largest angle made by different points at the center找到中心不同点所成的最大角度
【发布时间】:2012-08-17 13:25:47
【问题描述】:

下面给出了一个示例图像,其中“中心点”是 (x0,y0)(车轮的中心)。其他点是辐条的另一端。 “中心点”和辐条另一端之间的距离可能不同(不同长度的辐条)。这些点都在笛卡尔坐标系中。

我需要在这里找到任意两个连续辐条所形成的最大角度。在此图中,所有角度都相同,但假设缺少任何一个辐条,那么我们将该角度作为原点处的最大角度。

我的看法: 我正在计算每个边缘相对于 x 轴创建的角度,一次减去前一个(给出两个辐条之间的角度)。我正在跟踪最大的角度,如果我遇到比以前更大的角度,每次都会更新它。我的方法有效,但只是想知道是否有任何有效的方法可以找到相同的方法。

【问题讨论】:

  • 这是作业吗?你试过什么?
  • 您可以发布您现在拥有的代码吗?
  • 不清楚你在问什么,你认为你可以用更数学的方式来写这个问题吗(究竟你想最大化什么?他们的极角坐标表示?)“坐标系中的最大角度”太模糊了。
  • @hayden -- 我认为 OP 想要两个相邻“辐条”之间的最大角度。
  • 在一个轮子中,所有点都与中心等距,您的模型也是这样吗? (你写的第一段的第二句话很混乱)

标签: python math coordinate-systems algebra


【解决方案1】:

假设您想要两个辐条之间的角度,我建议您将数据点转换为极坐标/复坐标,这在cmath 模块中很容易,并允许您执行类似的操作 (phase只取出关于中心的角度):

import cmath

def largest_spoke_angle(centre, peripheral):
     per_from_centre = [complex(z[0]-centre[0], z[1]-centre[1]) for z in peripheral]
     per_angles = [cmath.phase(z) for z in per_from_centre]
     per_angles.sort()

     differences = [ per_angles[n+1]-per_angles[n] for n in range(len(per_angles)-1)] \
                    + [per_angles[0] +2*cmath.pi - per_angles[-1]]

     return max(differences)#in radians

centre = (0.,0.)
peripheral = [(1.,2.),(3.,4.),(3.,5.)]
print largest_spoke_angle(centre, peripheral)

【讨论】:

  • 不适用于以下内容。这里的中心是 (1,0)。输出应该是 pi,但是,上面的代码输出 pi/2。中心 = (1.,0.) 外围 = [(0.,0.),(1.,1.),(2.,0.)] 打印最大辐条角度(中心, 外围)
  • @user1597034 谢谢,已修复(错误在第二行差异)。希望它现在可以工作,它适用于该示例。
  • 有效!顺便说一句,是否有可能得到最大角度的辐条?
  • @user1597034 是的,提示如何做到这一点:[(x[n],n) for n in ...] 列表的排序将与 [x[n] for n in ...] 相同。
【解决方案2】:

我想我会这样做:

angles = [get_angle_from_xaxis(origin,point) for point in points]
#make sure the angles are in order
angles.sort()  
#need to compare last one with first one
angles.insert(0,angles[-1]-360.0)  #360 if degrees, otherwise 2*math.pi.
#Now calculate the difference between adjacent angles and take the maximum
maxangle = max( angles[i] - angle for i,angle in enumerate(angles[:-1],1) )

这基本上就是您描述的解决方案。我唯一添加的是最后一个和第一个之间的检查以及确保我们的角度顺序正确的排序。

【讨论】:

    【解决方案3】:

    @user1597034 的回答是正确的。但无法确定哪些辐条导致的角度最大。

    下面的代码找到两个最大角度向量的索引:

    import cmath
    import numpy as np
    
    center = (0.,0.)
    peripheral = np.array([(-1.,-1.),(0.,1.),(1.,-0.55), (0,-1), (-1,1)])
    
    
    per_from_centre = [complex(z[0]-center[0], z[1]-center[1]) for z in peripheral]
    per_angles = [cmath.phase(z) for z in per_from_centre]
    id_ord = np.argsort(per_angles,axis=-1) # order index 
    per_angles.sort()
    
    differences = [ per_angles[n+1]-per_angles[n] for n in range(len(per_angles)-1)] \
                   + [per_angles[0] +2*cmath.pi - per_angles[-1]]
    
    # ----- so far, same code in relation to @user1597034  -----
    
    # find index of adjacent angles of greater angle
    max_value = max(differences) # maximum value
    for i in range(len(differences)):
        if max_value == differences[i]:
            if i == (len(differences)-1):
                pairs = [id_ord[0], id_ord[-1]]
            else:
                pairs = [id_ord[i]] + [id_ord[i+1]]
            print('pair index of largest angle:',pairs)
    

    最大角度对索引: [2, 1]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-10
      • 2018-06-27
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多