web-dev-qa-db-ja.com

2Dベクトル外積の計算

ウィキペディアから:

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

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

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クラスを書いているので、どのメソッドを使うべきかわからないからです。

69
Zack The Human

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

3Dの外積から生じるベクトルの大きさは、2つのベクトル間の平行四辺形の面積にも等しいことに注意してください。これにより、実装1に別の目的が与えられます。さらに、この領域は署名されており、V1からV2への回転が反時計回りまたは時計回りのどちらの方向に移動するかを判断するために使用できます。また、実装1は、これら2つのベクトルから構築された2x2行列の決定要因であることに注意してください。

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

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

お役に立てれば...

95
Drew Hall

要するに:これは数学的なハックの略記法です。

詳細な説明:

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

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

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

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

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

53

クロス積のもう1つの有用な特性は、その大きさが2つのベクトル間の角度のサインに関連することです。

| a x b | = | a | 。 | b | 。正弦(シータ)

または

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

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

12
Alnitak

実装1は、2つのベクトルのperpドット積です。私が2Dグラフィックスについて知っている最良のリファレンスは、優れた Graphics Gems シリーズです。スクラッチ2D作業をしている場合、これらの本を持っていることが本当に重要です。 Volume IVには、「The Pleasures of Perp Dot Products」という記事があり、多くの用途に使用されています。

perp dot productの主な用途の1つは、dot productと同様に、2つのベクトル間の角度のスケーリングされたsinを取得することですは、角度のスケーリングされたcosを返します。もちろん、dot productperp dot productを一緒に使用して、2つのベクトル間の角度を決定できます。

ここ はその投稿であり、 ここ はWolfram Math Worldの記事です。

4
Bill Burdick

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

3
Olai

便利な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;
}
1
Bram