找到中心不同点的最大角度

时间:2012-08-17 13:25:48

标签: python math coordinate-systems algebra

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

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

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

Wheel with spokes

3 个答案:

答案 0 :(得分:0)

我想我会做这样的事情:

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) )

这基本上就是您描述的解决方案。我添加的唯一内容是在最后一个和第一个之间进行检查,并确保我们的角度顺序正确。

答案 1 :(得分:0)

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

phase

答案 2 :(得分:0)

@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)

enter image description here

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