104

ウィキペディアから:

外積は、3次元ユークリッド空間内の2つのベクトルに対する二項演算であり、2つの入力ベクトルを含む平面に垂直な別のベクトルになります。

定義が3次元(または7次元、1次元および0次元)でのみ定義されているとすると、2つの2次元ベクトルの外積をどのように計算しますか?

私は2つの実装を見てきました。1つは新しいベクトルを返し(ただし、単一のベクトルのみを受け入れます)、もう1つはスカラーを返します(ただし、2つのベクトル間の計算です)。

実装1(スカラーを返します):

float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
{
    return (v1.X*v2.Y) - (v1.Y*v2.X);
}

実装2(ベクトルを返します):

Vector2D CrossProduct(const Vector2D & v) const
{
    return Vector2D(v.Y, -v.X);
}

なぜさまざまな実装ですか?スカラー実装を何に使用しますか?ベクトル実装を何に使用しますか?

私が尋ねる理由は、私が自分でVector2Dクラスを作成していて、どのメソッドを使用するかわからないためです。

4

6 に答える 6

122

実装 1 は、入力ベクトルの通常の 3D 外積から得られるベクトルの大きさを返し、Z 値を暗黙的に 0 とします (つまり、2D 空間を 3D 空間の平面として扱います)。3D 外積はその平面に対して垂直になるため、X および Y コンポーネントは 0 になります (したがって、返されるスカラーは 3D 外積ベクトルの Z 値になります)。

3D 外積から得られるベクトルの大きさは、2 つのベクトル間の平行四辺形の面積にも等しいことに注意してください。これにより、実装 1 に別の目的が与えられます。さらに、この領域は符号付きで、V1 から V2 への回転が反時計回りか時計回りかを判断するために使用できます。実装 1 は、これら 2 つのベクトルから構築された 2x2 行列の行列式であることにも注意してください。

実装 2 は、同じ 2D 平面にある入力ベクトルに垂直なベクトルを返します。古典的な意味の外積ではありませんが、「垂直ベクトルを与えてください」という意味では一貫しています。

3D ユークリッド空間は外積演算の下で閉じていることに注意してください。つまり、2 つの 3D ベクトルの外積は別の 3D ベクトルを返します。上記の 2D 実装はどちらも、何らかの形でそれと矛盾しています。

お役に立てれば...

于 2008-10-28T16:39:04.160 に答える
78

要するに、これは数学的ハックの簡略表記です。

長い説明:

2D 空間では、ベクトルを外積することはできません。操作はそこで定義されていません。

ただし、z 座標をゼロに設定することによって 2D ベクトルが 3D に拡張されると仮定して、2 つのベクトルの外積を評価することは興味深いことがよくあります。これは、xy 平面で 3D ベクトルを操作するのと同じです。

そのようにベクトルを拡張し、そのような拡張されたベクトル ペアの外積を計算すると、z 成分だけが意味のある値を持つことがわかります。x と y は常にゼロになります。

これが、結果の z コンポーネントが単純にスカラーとして返されることが多い理由です。このスカラーは、たとえば、2D 空間で 3 点の曲がりを見つけるために使用できます。

純粋な数学的観点からは、2D 空間の外積は存在しません。スカラー バージョンはハックであり、2D ベクトルを返す 2D 外積はまったく意味がありません。

于 2008-10-28T16:40:55.560 に答える
12

外積のもう 1 つの便利な特性は、その大きさが 2 つのベクトル間の角度のサインに関連していることです。

| | axb | = |a| . |b| . 正弦(シータ)

また

サイン(シータ) = | axb | / (|a| . |b|)

したがって、上記の実装 1 では、abが単位ベクトルであることが事前にわかっている場合、その関数の結果はまさにその sine() 値です。

于 2008-10-28T16:58:27.290 に答える