2012-08-17 45 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)) 

這基本上是你所描述的解決方案。我添加的唯一東西就是在最後一個和第一個之間進行檢查,以確保我們有正確的順序。