内積(投影と成分)

記号の意味
ベクトル- 矢印付きの文字
長さ- ベクトルの大きさ
単位ベクトル- 長さ1のベクトル
内積- 2つのベクトルから数値を計算
シータ- 角度を表すギリシャ文字
余弦- 角度から比率を求める関数

概要

内積を使うと、あるベクトルを特定の方向にどれだけ含んでいるかを計算できます。これにより、ベクトルの成分分解や向きの判定が簡単にできるようになります。

内積とは

内積(Dot Product) は、2つのベクトルから1つの数値を計算する演算です。

例えば、キャラクターが斜め右上に移動している時、その移動ベクトルと右方向のベクトルの内積を計算すると、「どれだけ右方向に進んでいるか」という横方向の速度成分が分かります。また、プレイヤーの向きと敵への方向の内積を計算すれば、敵が前方にいるのか後方にいるのかを判定できます。このように、内積はベクトルを特定方向に分解したり、2つのベクトルの向きの関係を調べたりするための基本的な道具です。

内積は記号 \cdot (中点、ドット)で表します。2つのベクトル a\vec{a}b\vec{b} の内積は次のように書きます:

ab=ax×bx+ay×by\vec{a} \cdot \vec{b} = a_x \times b_x + a_y \times b_y

計算方法はシンプルで、各成分を掛けて足し合わせるだけです。例えば、a=(3,4)\vec{a} = (3, 4)b=(2,1)\vec{b} = (2, 1) なら:

ab=3×2+4×1=6+4=10\vec{a} \cdot \vec{b} = 3 \times 2 + 4 \times 1 = 6 + 4 = 10

結果は1つの数値(スカラー)になります。この数値は、投影の長さ、向きの判定、角度の情報など、幾何学的に多くの意味を持っています。

内積はどんな時に使える?

  • 移動ベクトルの成分分解 - 斜め移動から「横方向の速度だけ」を取り出す
  • 視界判定 - プレイヤーの正面に敵がいるかチェック(前方なら正、後方なら負)
  • 傾斜判定 - 地面の向きから「歩ける平らさか」を判定
  • 反射計算 - ボールが壁に当たった時の跳ね返り方向を計算

内積は、ベクトルの特定方向の成分を抽出し、向きの関係を判定する基本演算です。

それでは、内積で何ができるのかを具体的に見ていきましょう。

成分の抽出

成分の抽出とは、ベクトルを特定の方向でどれだけ進んでいるかを数値化することです。

例えば、キャラクターが斜め右上に移動している時、「右方向にどれだけ進んでいるか」「上方向にどれだけ進んでいるか」を別々に知りたい場合があります。内積を使えば、任意の方向への成分を簡単に取り出せます。

投影との関係

幾何学的には、成分の抽出を投影(Projection)とも呼びます。

太陽の光が斜めから差し込んでいる時、壁に映る影の長さを想像してください。ベクトルの成分を抽出することは、一方のベクトルをもう一方の方向に「影として落とした」時の長さを求めることと同じです。この長さをスカラー射影(scalar projection)と呼びます。

つまり、「成分の抽出」という操作と「投影」という幾何学的なイメージは同じ計算を指しています。

単位ベクトルとの内積

単位ベクトル(長さ1)との内積 = その方向への成分

これにより、任意の方向への成分を簡単に計算できます。以下の実用例では、単位ベクトルとの内積で特定方向の成分を抽出しています。

実用例1:坂道でボールが転がる力を計算する

坂の上にボールがあるとき、重力は真下(0, -10)に働きます。しかし、坂があるため、ボールは斜め下に転がります。この「斜めに転がる力」を求めるには、重力の「坂方向への成分」を抽出します。

例えば、30度の坂なら、坂の単位方向ベクトル(0.866, -0.5) です。重力 (0, -10) と坂方向ベクトルの内積を計算すると 5 になります。つまり、ボールは坂の方向に「5」の力で転がります。この数値を使って、ボールの加速度や移動量を計算できます。

実用例2:横スクロールゲームで画面外判定をする

プレイヤーが斜め (3, 4) の速度で移動しているとき、画面の右端に到達するかを判定したいとします。このとき、移動ベクトル (3, 4) と右方向の単位ベクトル (1, 0) の内積を計算すると 3 になります。

この 3 という数値は「1フレームで右方向に3ピクセル進む」ことを意味します。現在のX座標が 790 で、画面幅が 800 なら、あと 10 ピクセルで画面外です。10 ÷ 3 ≈ 3.3 フレーム後に画面外に出ることが分かります。この情報を使って、画面外に出る直前にキャラクターを止めたり、警告を表示したりできます。

数式で理解する:内積と成分の関係

なす角とは

なす角(angle between vectors) θ\theta とは、2つのベクトルの間の角度のことです。

2つのベクトルを同じ始点から描いたとき、その間にできる角度を指します。例えば、右方向のベクトル (1, 0) と斜め上方向のベクトル (1, 1) のなす角は45度です。

  • 同じ方向を向いている → なす角 = 0°
  • 垂直(直角) → なす角 = 90°
  • 逆方向を向いている → なす角 = 180°

内積の幾何学的な式

内積は、2つのベクトルのなす角 θ\theta と密接に関係しています:

ab=abcosθ\vec{a} \cdot \vec{b} = |\vec{a}| \, |\vec{b}| \cos\theta

単位ベクトル b^\hat{b} (長さ1)との内積なら、この式は次のように簡略化されます:

ab^=a×1×cosθ=acosθ\vec{a} \cdot \hat{b} = |\vec{a}| \times 1 \times \cos\theta = |\vec{a}| \cos\theta

この acosθ|\vec{a}| \cos\theta が、ベクトル a\vec{a}b^\hat{b} 方向への成分であり、幾何学的にはスカラー射影(投影の長さ)です。

単位ベクトル化の重要性

一般的なベクトル(長さが1でない)との内積の場合、内積の値には相手のベクトルの長さが含まれてしまいます:

  • 成分(スカラー射影): bcosθ|\vec{b}| \cos\theta - ベクトルbをベクトルaの方向に投影した長さ
  • 内積: a×bcosθ|\vec{a}| \times |\vec{b}| \cos\theta - スカラー射影に片方のベクトルの長さを掛けた値

そのため、純粋な成分を得たい場合は、方向ベクトルを単位ベクトル化してから内積を計算します。これにより、相手の長さの影響を除外できます。

向きの関係の判定

向きの関係の判定とは、2つのベクトルが「同じ方向を向いているか」「逆方向か」「垂直か」を判断することです。

敵が自分の前にいるのか後ろにいるのかを判定したり、壁に対して正面から進んでいるのか斜めから入っているのかを調べたりする時に使います。

計算方法

向きの判定は、正規化(単位ベクトル化)してから内積を計算します。

手順1: 両方のベクトルを正規化する

まず、各ベクトルの長さで割って単位ベクトル(長さ1)にします:

a^=aa=(ax,ay)ax2+ay2\hat{a} = \frac{\vec{a}}{|\vec{a}|} = \frac{(a_x, a_y)}{\sqrt{a_x^2 + a_y^2}}

b^=bb=(bx,by)bx2+by2\hat{b} = \frac{\vec{b}}{|\vec{b}|} = \frac{(b_x, b_y)}{\sqrt{b_x^2 + b_y^2}}

手順2: 正規化されたベクトル同士の内積を計算する

a^b^=a^x×b^x+a^y×b^y\hat{a} \cdot \hat{b} = \hat{a}_x \times \hat{b}_x + \hat{a}_y \times \hat{b}_y

この結果は -1 から 1 の範囲に必ず収まります。

手順3: 符号で向きを判定する

  • a^b^>0\hat{a} \cdot \hat{b} > 0 → 同じ方向を向いている
  • a^b^=0\hat{a} \cdot \hat{b} = 0 → 垂直(直角)
  • a^b^<0\hat{a} \cdot \hat{b} < 0 → 逆方向を向いている

具体例: a=(3,4)\vec{a} = (3, 4)b=(2,1)\vec{b} = (2, 1) の向きを判定する

  1. 正規化:a=32+42=5|\vec{a}| = \sqrt{3^2 + 4^2} = 5b=22+12=5|\vec{b}| = \sqrt{2^2 + 1^2} = \sqrt{5}

    a^=(35,45)\hat{a} = (\frac{3}{5}, \frac{4}{5})b^=(25,15)\hat{b} = (\frac{2}{\sqrt{5}}, \frac{1}{\sqrt{5}})

  2. 内積:a^b^=35×25+45×15=1055=250.894\hat{a} \cdot \hat{b} = \frac{3}{5} \times \frac{2}{\sqrt{5}} + \frac{4}{5} \times \frac{1}{\sqrt{5}} = \frac{10}{5\sqrt{5}} = \frac{2}{\sqrt{5}} \approx 0.894

  3. 判定:0.894>00.894 > 0 なので、同じ方向を向いている

正規化により、ベクトルの長さの影響を除外し、純粋に向きだけを判定できます。

内積の値意味
正の値(> 0)同じ方向を向いている
0垂直(直角)
負の値(< 0)逆方向を向いている

デモ: インタラクティブな向き判定

2つのベクトルの角度を変えて、内積の値と向きの関係を体験しましょう!

-180°180°
ベクトルA: (3.0, 0.0)
ベクトルB: (2.12, 2.12)
計算式: 3.0 × 2.12 + 0.0 × 2.12
内積: 6.36
同じ向き(鋭角)
• 内積 > 0: 同じ向き(鋭角)
• 内積 = 0: 垂直(90度)
• 内積 < 0: 逆向き(鈍角)