0

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

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

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

带辐条的轮子

4

3 回答 3

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)
于 2012-08-17T14:06:59.317 回答
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) )

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

于 2012-08-17T13:53:46.763 回答
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)

在此处输入图像描述

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

于 2021-01-18T17:35:52.313 回答