1

2つのベクトルaとbの間の角度を計算したいと思います。これらが原点にあると仮定しましょう。これはで行うことができます

theta = arccos(a . b / |a| * |b|)

ただし、arccosは[0、pi]の角度を提供します。つまり、180度を超える角度は提供されません。これは、私が望むものです。では、ベクトルが180度のマークを超えたことをどのようにして知ることができますか?2Dでは、ベクトルの1つにあるy成分の符号によって、ベクトルがどの象限にあるかを簡単に決定できます。しかし、3Dでそれを行う最も簡単な方法は何でしょうか。

編集:私は質問を一般的に保ちたかったのですが、ここに行きます。私はこれをcでプログラミングしており、角度を取得するために使用するコードは、theta = acos(dot(a, b)/mag(a)*mag(b))プログラムで方向を決定する方法です。

4

4 に答える 4

2

回転を定義する平面が定義されているため、これは 2D で機能します。

これを 3D で行う場合、そのような暗黙的な 2D 平面はありません。3D 座標を 3 点すべてを通る 2D 平面に変換し、この平面内で計算を行うことができます。

しかし、もちろん平面には 2 つの可能な方向があり、それはどの角度が > 180 以下になるかに影響します。

于 2010-03-16T13:22:23.383 に答える
1

2つのベクトルの外積の方向変化を利用する次の解決策を思いつきました。

  1. ベクトルn = a X bを作成して正規化します。このベクトルは、aとbがまたがる平面に垂直です。

  2. 新しい角度が計算されるときはいつでも、それを古い法線と比較してください。比較では、古い法線と現在の法線を点として扱い、それらの間の距離を計算します。この距離が2の場合、法線です(つまり、外積a X bが反転しています)。

ベクトルaとbの方向と角度を更新する頻度によっては、フリップ後の距離が2より短くなる可能性があるため、距離のしきい値が必要になる場合があります。

于 2010-03-17T15:50:43.797 に答える
0

厳密に言えば、2 つの 3D ベクトルの間には常に2 つの角度があります。1 つは 180 以下、もう 1 つは 180 以上です。Arccos はそのうちの 1 つを提供し、もう 1 つは 360 から差し引くことで得られます。そのように考えてください。 : 2 つの線が交差していると想像してください。そこには 4 つの角度があります。ある値の 2 つと別の値の 2 つです。線の間の角度は?単一の答えはありません。こっちも一緒。何らかの特別な基準がないと、理論的には、2 つの角度値のどちらを考慮に入れる必要があるかを判断できません。

編集:本当に必要なのは、方向を修正する任意の例です。1 つ: 正の Z 方向から見ます。2 つのベクトル間の平面に Z 軸が含まれる場合、正の Y 方向から見ます。平面が YZ の場合、正の X 方向から見ます。これを座標で表現する方法を考えて、また編集します。

于 2010-03-16T13:33:41.177 に答える
0

使用できる解決策の 1 つ:
実際に行う必要があるのは、ベクトルの 1 つが同一平面上にある平面を作成することです。

両方のベクトルの外積を取得すると平面が作成されます。次に、この平面の法線を取得します。これと符号付き角度を取得する必要があるベクトルの間の角度を取得でき、角度を使用してサイン。
角度が 90 度より大きい場合は、作成された平面の下にあります。90 度未満で、それ以上です。
計算のコストによっては、この段階で角度の代わりに内積を使用できます。

ベクトルの同じ順序で常に法線を計算するようにしてください。

XYZ 軸を使用している場合、これはより簡単に使用できます。平面に必要なベクトルが既にあるため、これを比較対象としています。

もっと効率的な解決策があるかもしれませんが、これは私が思いついたものです。

編集:作成されたベクトルの明確化 a X b = paこれは と の両方に垂直bです。次に、次のいずれかを実行します: a X pまたはb X p2 つのベクトルによって作成された平面に垂直な別のベクトルを作成します。ベクトルの選択は、角度を見つけようとしているものによって異なります。

于 2010-03-16T13:35:03.073 に答える