0

以下は、'center-point' が (x0,y0) (ホイールの中心) であるイメージの例です。その他のポイントは、スポークのもう一方の端です。「中心点」とスポークのもう一方の端の間の距離は異なる場合があります (スポークの長さが異なります)。これらのすべての点はデカルト座標系にあります。

ここで、連続する 2 つのスポークの最大角度を見つける必要があります。この図では、すべての角度が同じですが、スポークのいずれかが欠落していると仮定すると、その角度が原点での最大角度になります。

私の見解: x 軸に対して各エッジによって作成された角度を 1 つずつ計算して、前の角度から差し引いています (2 つのスポーク間の角度が得られます)。以前よりも大きな角度に遭遇した場合は毎回更新して、最大の角度を追跡しています。私の方法は機能しますが、同じものを見つけるための効率的な方法があるかどうか疑問に思っています。

スポーク付きホイール

4

3 に答える 3

1

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)
于 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 に答える