2Dベクトルの外積の計算


87

ウィキペディアから:

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

定義が3次元(または7次元、1次元、ゼロ次元)でのみ定義されているとすると、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クラスを作成していて、どのメソッドを使用するかわからないためです。


10
実装2は間違っています。外積を形成するには、2つのベクトルが必要です。
bobobobo 2009年

7
実装2は、指定されたベクトルvを-90度回転します。-90inとx' = x cos θ - y sin θを代入しy' = x sin θ + y cos θます。この実装の別のバリエーションは、vを+90度return Vector2D(-v.Y, v.X);回転させることです。
legends2k 2013

3
@ legends2k:実装2は、行列式を使用して外積を評価する拡張機能であることに注意してください。最後の行と列を削除するだけです。このような拡張には、常に次元のN-1オペランドがありますN
ティムCAS

4
実装1は、外積の大きさを計算します。
Mateen Ulhaq 2016

@MateenUlhaqのようなもの、それは「符号付きの大きさ」です
MoritzMahringer18年

回答:


101

実装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実装はどちらも、何らかの形でそれと矛盾しています。

お役に立てれば...


7
実際、実装2は、vとz方向を指す単位ベクトルの外積です。
mattiast 2008年

@mattiast:本当です。これがまさに2Dの「perp」操作が3Dで記述されている方法です。
ドリューホール

@mattiast:実装2は、行列式を使用して外積を計算する拡張機能と考えることができます---最後の行と列を削除するだけです。実装1は次と同等であることに注意してくださいDotProduct(a, CrossProduct(b))。これは(非常にエレガントに!)「垂直ドット積」の概念と一致します(これは、実装1も[そしておそらくより正確に]知られています!)。
ティムCAS

最初の段落では、大きさは返されるものの絶対値です。Zコンポーネントとはまったく同じではありません。2番目の段落で指摘しているように、十字架の印を使用して吸血鬼を撃退することができます...えーと、たとえば、ベクトルがポリゴンの輪郭を離れるときと入るときを検出することを意味します。
Peter Cordes 2016年

68

要するに:それは数学的ハックの省略表記です。

長い説明:

2D空間でベクトルを使用して外積を行うことはできません。操作はそこで定義されていません。

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

そのようにベクトルを拡張し、そのような拡張されたベクトルペアの外積を計算すると、zコンポーネントのみが意味のある値を持つことに気付くでしょう。xとyは常にゼロになります。

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

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


「たとえば、2D空間で3点の巻線を見つけるために使用されます」@Nils Pipenbrinck、このコンテキストでの巻線とはどういう意味ですか?
NaderBelal19年

1
@NaderBelalここで巻くことは、ポイントaからb、cに移動する場合、ちょうどスパンした角度に関して、時計回りまたは反時計回りに移動することを意味すると思います。
アミットトマール

12

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

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

または

sine(theta)= | axb | /(| a |。| b |)

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


1
...これもベクトルaとベクトルbの間の三角形の面積の2倍です。
Tim Lovell-Smith

5

実装1は、PERP内積2つのベクトルの。2Dグラフィックスについて私が知っている最高のリファレンスは、優れたGraphicsGemsシリーズです。スクラッチ2D作業をしている場合は、これらの本を用意することが非常に重要です。第IV巻には、「PerpDotProductsの喜び」という記事があります。

1つの主要な使用PERP内積は、スケールを取得することでsin同じように、2つのベクトル間の角度のドット積は、スケール返すcos角度の。もちろん、内積内積を一緒に使用して、2つのベクトル間の角度を決定できます。

ここではその上にポストがあると、ここでヴォルフラム数学の世界の記事です。


3

計算で2D外積を使用して、重心を基準にした任意の点で力ベクトルが作用しているオブジェクトの新しい正しい回転を見つけています。(スカラーZのもの。)


3

便利な2Dベクトル演算は、スカラーを返す外積です。これを使用して、ポリゴン内の2つの連続するエッジが左または右に曲がっているかどうかを確認します。

Chipmunk2Dソースから:

/// 2D vector cross product analog.
/// The cross product of 2D vectors results in a 3D vector with only a z component.
/// This function returns the magnitude of the z value.
static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
{
        return v1.x*v2.y - v1.y*v2.x;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.