1. ホーム
  2. language-agnostic

[解決済み] 2次元ベクトルの外積を計算する

2022-03-02 04:50:27

質問

ウィキペディアより

<ブロッククオート

の2つのベクトルに対する2項演算である。 三次元 ユークリッド空間では、2つの入力ベクトルを含む平面に垂直な別のベクトルが得られます。

定義が3つでしか定義されていないことを考えると、( または7、1、0 2次元のベクトル同士の外積はどのように計算するのでしょうか?

私は2つの実装を見たことがあります。一つは新しいベクトルを返し(ただし単一のベクトルしか受け付けない)、もう一つはスカラーを返します(ただし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のクラスを書いていて、どのメソッドを使えばいいのかわからないからです。

どのように解決するのですか?

実装1は、入力ベクトルのZ値を暗黙のうちに0として、通常の3Dクロスプロダクトから生じるベクトルの大きさを返します(つまり、2D空間を3D空間内の平面として扱います)。 3次元のクロスプロダクトはその平面に垂直になるので、0 X & Y 成分を持ちます(したがって、返されるスカラーは3次元クロスプロダクト・ベクトルの Z 値です)。

なお、3次元のクロスプロダクトから得られるベクトルの大きさは 面積 は、2つのベクトル間の平行四辺形のため、実装1には別の目的があります。さらに、この面積は符号付きであり、V1からV2への回転が反時計回りに動くか時計回りに動くかの判定に使用できる。また、実装1はこれら2つのベクトルから作られる2x2行列の行列式であることにも注目すべきです。

実装2は、同じ2次元平面上で入力ベクトルに直交するベクトルを返します。 古典的な意味でのcross productではありませんが、quot;give me a perpendicular vector"という意味では一貫しています。

3次元ユークリッド空間は、2つの3次元ベクトルのクロスプロダクトが別の3次元ベクトルを返すという、クロスプロダクト操作の下で閉じていることに注意してください。 上記の2次元の実装は両方とも、何らかの形でそれと矛盾しています。

お役に立てれば幸いです...。