2Dベクトル外積の計算
-
04-07-2019 - |
質問
ウィキペディアから:
外積は、 3次元ユークリッド空間の2つのベクトルの2項演算であり、2つの入力ベクトルを含む平面に垂直な別のベクトルになります。
定義は3つだけ(または7、1、0のみで定義されていることを考えると、 a>)次元、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クラスを自分で書いているため、どのメソッドを使用するかわからないからです。
解決
Impllementation 1は、入力ベクトルの通常の3Dクロス積から生じるベクトルの大きさを返し、それらのZ値を暗黙的に0とします(つまり、2D空間を3D空間の平面として扱います)。 3Dの外積はその平面に垂直になるため、0 X& Yコンポーネント(返されるスカラーは3D外積ベクトルのZ値です)。
3Dクロス積から生じるベクトルの大きさは、2つのベクトル間の平行四辺形の面積にも等しいことに注意してください。これにより、実装1に別の目的が与えられます。さらに、この領域は署名されており、V1からV2への回転が反時計回りまたは時計回りのどちらの方向に移動するかを判断するために使用できます。実装1は、これら2つのベクトルから構築された2x2行列の決定要因であることにも注意してください。
Implementation 2は、同じ2D平面にある入力ベクトルに垂直なベクトルを返します。古典的な意味での外積ではなく、「垂直ベクトルを与えてください」で一貫しています。センス。
3Dユークリッド空間は外積演算の下で閉じられていることに注意してください。つまり、2つの3Dベクトルの外積は別の3Dベクトルを返します。上記の2D実装はどちらも何らかの形で矛盾しています。
これが役立つことを願っています...
他のヒント
要するに:これは数学的なハックの略記法です。
詳細な説明:
2D空間のベクトルとの外積はできません。操作はそこで定義されていません。
ただし、2次元ベクトルがz座標をゼロに設定して3次元に拡張されると仮定して、2つのベクトルの外積を評価することは興味深い場合があります。これは、xy平面で3Dベクトルを操作するのと同じです。
ベクトルをそのように拡張し、そのような拡張ベクトルペアの外積を計算すると、zコンポーネントのみに意味のある値があることに気付くでしょう:xとyは常にゼロになります。
これが、結果のzコンポーネントがしばしばスカラーとして単に返される理由です。このスカラーは、たとえば、2D空間で3つのポイントのワインディングを見つけるために使用できます。
純粋な数学的な観点からは、2D空間の外積は存在しません。スカラーバージョンはハックであり、2Dベクトルを返す2D外積はまったく意味がありません。
外積のもう1つの有用な特性は、その大きさが2つのベクトル間の角度のサインに関連することです:
| a x b | = | a | 。 | b | 。 sine(theta)
または
sine(theta)= | a x b | /(| a |。| b |)
したがって、上記の実装1では、 a
と b
が事前に単位ベクトルであることがわかっている場合、その関数の結果はそのsine()値になります。
実装1は、2つのベクトルの perpドット積です。 2Dグラフィックスに関する私が知っている最良のリファレンスは、優れたグラフィックスジェムシリーズです。スクラッチ2D作業をしている場合、これらの本を持っていることは本当に重要です。 Volume IVには、「The Pleasures of Perp Dot Products」という記事があります。それはそれの多くの用途を超えています。
perp dot product の主な用途の1つは、 dot product と同様に、2つのベクトル間の角度のスケーリングされた sin
を取得することです角度のスケーリングされた cos
を返します。もちろん、ドット積と perpドット積を一緒に使用して、2つのベクトル間の角度を決定できます。
こちらはその投稿であり、< a href = "http://mathworld.wolfram.com/PerpDotProduct.html" rel = "nofollow">こちらはWolfram Math Worldの記事です。
私は、計算で2dの外積を使用して、重心に対して任意の点で力ベクトルが作用しているオブジェクトの新しい正しい回転を見つけています。 (スカラーZのもの。)
有用な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;
}