2016-09-14 7 views
1

私はPythonで新しいです。 私は3D空間内の2つのベクトルを持っている、と私は22つのベクトルの間の角度3D? python

との間の角度を知りたい私が試した:

vec1=[x1,y1,z1] 

vec2=[x2,y2,z2] 

angle=np.arccos(np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2))) 

が、ときに、同じ角度と高くないを得るため、VEC2、VEC1を変更します。 ベクトルの順序が変わったときに私に大きな角度を与えたいと思います。

+1

は、あなたがあなたの周りを回転したい通常の把握方法を決めたことがありますか? –

答えて

0

ドットプロダクトは可換であるため、別のメトリックを使用する必要があります。注文については気にしない。

0

ドットプロダクトはcommutativeなので、変数を関数に入れた順番を逆にするだけでは機能しません。

あなたの目的が尖った(小さい)角度ではなくむしろ(より大きい)角度を見つけることである場合は、関数から返された値を360度から引きます。変数を切り替えたいときの基準があるように見えるので、同じ基準を使用して、見つかった値を360から引き出すタイミングを決定する必要があります。これにより、これらのケースで探している価値が得られます。

+0

はい、しかし、どのようにプログラムでそのプロセスを自動化するPythonで、私は考えがありません。これは、ポイントが空間3d内の頂点を持つそのポリゴンの内部にあるかどうかを計算するメインプログラムの一部です。つまり、点と頂点のベクトル生成の間の角度の加算は、n * 360度です。 –

+1

あなたはベクトルの順序を切り替えると言っていました。これの意図した結果は何でしたか?あなたはそれらのベクトルをどのような状況で切り替えるでしょうか?これらの質問に答えることは私があなたを助けるのに役立ちます。 –

+0

@AlbertoAlarconParedesどの定理を参照していますか?ポリゴンの全内角は180 *(n-2)度です。 – ijustlovemath

1

角度を含む平面は2つの方向を向けることができ、入力データの何もそれについての手がかりを与えないので、あなたが求めているものは不可能です。

あなたができることは、ベクトル間の最小の角度(またはその補数を360°にする)を計算し、ベクトルを入れ替えても効果がありません。

ドットプロダクトはここでは無罪ですが、これは幾何学的なデッドエンドです。

1

どの角度を選択するかを選択する機能を使用します。あなただけ鋭角ため

angle(vec1, vec2, 'True') 

を書き、あなたのプログラム内の角度(ラジアン)を計算するときに、次に

def angle(v1, v2, acute): 
# v1 is your firsr vector 
# v2 is your second vector 
    angle = np.arccos(np.dot(v1, v2)/(np.linalg.norm(v1) * np.linalg.norm(v2))) 
    if (acute == True): 
     return angle 
    else: 
     return 2 * np.pi - angle 

を、そして

angle(vec2, vec1, 'False') 
:あなたのコードのbegginingでは、書き込み

鈍角です。例えば

vec1 = [1, -1, 0] 
vec2 = [1, 1, 0] 

#I am explicitly converting from radian to degree 
print(180* angle(vec1, vec2, True)/np.pi) #90 degrees 
print(180* angle(vec2, vec1, False)/np.pi) #270 degrees 
関連する問題