2012-08-17 50 views
0

下面给出的是一个示例图像,其中'center-point'是(x0,y0)(轮子的中心)。其他点是辐条的另一端。 “中心点”与轮辐另一端的距离可能不同(长度不同的轮辐),这些点都在笛卡儿坐标系统中查找中心不同点所产生的最大角度

我需要在这里找到任意两个连续的最大角度在这张图中,所有角度都是相同的,但是假设任何一个辐条都没有了,那么我们将把该角度看作是最大的角度。

我的: 我正在计算由每个边沿相对于X轴一次减去一个(此时给出两个辐射之间的角度)我跟踪最大的角度,每次更新时,如果遇到比前一个角度更大的角度我的方法工作但只是想知道是否有效的方法可以找到相同的。

Wheel with spokes

+0

这功课吗?你有什么尝试? – GWW 2012-08-17 13:28:01

+3

你可以发布你现在的代码吗? – Kevin 2012-08-17 13:33:39

+0

不是一个肯定的作业 – user1597034 2012-08-17 13:35:13

回答

0

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

不适用于以下情况。这里的中心是(1,0)。输出应该是pi,但是,上面的代码输出pi/2。中心=(1.,0。) peripheral = [(0.,0。),(1.,1),(2.,0。)] print largest_spoke_angle(center,peripheral) – user1597034 2012-08-17 15:47:33

+0

@ user1597034 thanks,固定(错误是在第二行的差异)。希望它现在可以工作,它确实适用于这个例子。 – 2012-08-17 16:20:48

+0

作品!顺便说一句,有可能得到哪个辐条导致最大的角度? – user1597034 2012-08-17 16:43:00

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

这基本上是你所描述的解决方案。我添加的唯一东西就是在最后一个和第一个之间进行检查,以确保我们有正确的顺序。