ベクトルの外積と当たり判定

アバター
ナムアニクラウド
記事: 16
登録日時: 15年前
住所: 茨城県

ベクトルの外積と当たり判定

投稿記事 by ナムアニクラウド » 13年前

 次回は軌跡判定を書きます、と前回は書きましたが、そのために「外積」についてお話する必要があると思い、今回の記事を投稿します。

外積(クロス積・ウェッジ積) とはなんぞや
 3次元空間(以下、単に空間と呼ぶ)上の2つのベクトルに対する乗算として、高校の数学で習う範囲では「内積」がありますが、「外積」というものもあります。
外積は、
  ベクトル × ベクトル → ベクトル
となる計算ですが、計算の結果となるベクトルは、掛けあわせた2つのベクトルの両方に垂直です。
Cross.png
Cross.png (4.18 KiB) 閲覧数: 385 回
この図で、a×ba, b の両方に垂直で、大きさが|a||b|sinθ のベクトルです(ただしθはa, bのなす角)。
この計算は、使用する演算子にちなんで「クロス積」と呼ばれることがあります。

 しかし、今回紹介するのは「2次元空間(以下、平面)上の外積」です。
2つの平面ベクトルに対して記号「∧」を用いて、
  ベクトル ∧ ベクトル → スカラー(ふつうの数)
となる計算を外積と呼びます。
また、3次元での外積「クロス積」と区別するために、3次元以外での外積を「ウェッジ積」と呼びます。
ウェッジ積の求め方を、内積と比較して書いてみます。(ベクトルを太文字で表します)

ベクトル a = ( x1, y1 ), b = ( x2, y2 ) が角θをなすとき、
     内積: ab = x1x2 + y1y2 = |a||b|cosθ
  ウェッジ積: ab = x1y2 - y1x2 = |a||b|sinθ

それぞれ、次のような性質があります。
  内積
  • ①2つのベクトルが垂直ならば結果が0になる。
    ②2つのベクトルがなす角が鋭角ならば正、鈍角ならば負になる。
      (鋭角とは90度未満の鋭い角、鈍角は90度より大きい角です)
    ③交換法則が成り立つ。
      つまり ab = ba
    ④分配法則が成り立つ。
      つまり a・(b + c) = ab + ac
    ⑤k(ab) = (ka)・b = a・(kb) である。
  ウェッジ積
  • ①2つのベクトルが平行なら結果が0になる。
    ②2つのベクトルの向きの関係が符号に現れる。
      左から掛けたベクトルから見て、右から掛けたベクトルが右を向いているか、左を向いているかで結果の符号が異なります。
    ③交換法則は成り立たないが、次のような性質がある。
      ab = -ab
    ④分配法則が成り立つ。
      a∧( b + c ) = ab + ac
    ⑤k(ab) = (ka)∧b = a∧(kb)
    ⑥結果の絶対値は、2つのベクトルのなす平行四辺形の面積となる。
ウェッジ積の②の性質を図に示します。aから見て、bは左向き、cは右向きですので、外積の符号が異なります。
Wedge.png
Wedge.png (7.17 KiB) 閲覧数: 383 回
ウェッジ積の使い方の例
 さて、ウェッジ積を使うと、点と直線の距離を調べることができます。
dist.png
dist.png (6.97 KiB) 閲覧数: 387 回
いま、点Pと直線ABがあるとき、ベクトルAB, APを考えます。
ABAPが角θを成すとき、図のように直線と点の距離は |AP|sinθ となります。
ここで、2つのベクトルのウェッジ積は ABAP = |AB||AP|sinθ ですので、これを|AB|で割れば距離が求まります。
よって、直線と点の間の距離は
  |ABAP|/|AB|
となります。
わざわざウェッジ積を使うより、直接 |AP|sinθ を計算したほうが早い気もしますが、ウェッジ積をベクトルの成分から計算すれば、θを求めることなく距離を計算することができます。
なす角が分からなくてもsinの値を使える、それが外積のメリットです。

 そして、直線と点の間の距離を求めることができると、そこから線分と円の当たり判定に発展します。
その他にも、当たり判定にウェッジ積を使うとすっきりすることが幾らかありますので、これから説明していきたいと思います。
と、言う訳で、次回は線分に関する当たり判定を解説する予定です。軌跡はまた今度。

参考文献
平面での外積について、以下の資料が詳しいです。
今回は雑に説明してしまったので、わけが分からなかった場合は ◯×つくろーどっとコム さんの資料を参考にするといいと思います。
  外積代数 from Wikipedia
  ベクトル(高校の数学) from ++C++; // 未確認飛行C
  内積と外積の使い方 from ◯×つくろーどっとコム

コメントはまだありません。