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

2024-05-20 21:37:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我要找出任何两个连续轮辐形成的最大角度。在这个图中,所有的角度都是一样的,但是假设其中任何一个辐条缺失,那么我们将把这个角度作为原点处的最大角度。在

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

{1美元^


Tags: 方法图像距离示例中心角度坐标系车轮
2条回答

假设您需要两个辐条之间的角度,我建议您将数据点转换为极坐标/复坐标,这在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)

我想我应该这样做:

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

这基本上就是你描述的解决方案。我只添加了最后一个和第一个之间的检查,以确保角度顺序正确。在

相关问题 更多 >