前後左右の判定

前後の判定

ある点が運動しているとき、着目する他の点が進行方向の前方にあるのか、後方にあるのかを判定したい時があるが、2次元の場合は、ベクトルの内積を使うとこの判定が簡単にできる。

以下の図で、点sがvの方向に進んでいるとき、点pが前方/後方のいずれにあるかを判定する。

math_linear_tool_ahead_behind

sを起点としたベクトルvと、sから見たpの相対的な位置ベクトルの内積を考えると、

    $$ {\bf v} \cdot ( {\bf p} - {\bf s} ) = | {\bf v} | | {\bf p} - {\bf s} | \cos \theta $$

上式で0≤θ≤90度の範囲であればpはsの前方にあり、このときcosθ≥0。また90度<θ≤180度の範囲ならpはsの後方にあり、cosθ<0となる。
内積を計算する角は、ベクトルvとpのなす角なので、pがsの左右どちらにあるかは問わない。

以上のことから、進行方向のベクトルvと、自身から見た相対的な着目点の位置ベクトルの内積が正なら着目点は前方に、負なら後方にあることになる(ゼロならば真横)。

    $$ {\bf v} \cdot ( {\bf p} - {\bf s} ) \left\{ \begin{align*} &> 0 \: \rightarrow \: {\rm front} \\ &= 0 \: \rightarrow \: {\rm side} \\ &< 0 \: \rightarrow \: {\rm behind} \end{align} \right. $$

左右の判定

方向ベクトルvを90度回転させた上で上記の前後判定を行うことで左右判定が可能になる。

ベクトルを90度回転させる方法はこちら

右へ回転させたベクトルに対して前方なら元の方向ベクトルの右、後方なら元の方向ベクトルの左と判定できる。

 

2つのベクトルが平行かどうか確かめる

2次元の場合

2次元の場合、2つのベクトルが平行かどうかを確かめるには、いずれか一方を90度回転させて、それが他のベクトルと直角であるかどうかを確かめるとよい(→ベクトルを90度回転させる方法)。

以下の2つのベクトルが平行かどうかを確認するには、

    $$ \begin{align*} {\boldsymbol u} = (u_x , u_y) \\ {\boldsymbol v} = (v_x , v_y) \end{align} $$

たとえば{\boldsymbol v}を90度回転させて内積がゼロかどうかを確認する。

    $$ (u_x , u_y) \cdot (v_y , -v_x) = 0? $$

なお、この式は、2つのベクトルの外積のx-y平面に垂直な成分(z成分)を計算していることになる。

    $$ {\boldsymbol u} \times {\boldsymbol v} = \left| \begin{array}{ccc} {\boldsymbol i} & {\boldsymbol j} & {\boldsymbol k} \\ u_x & u_y & u_z \\ v_x & v_y & v_z \end{array} \right| = (u_y v_z - u_z v_y , u_z v_x - u_x v_z , u_x v_y - u_y v_x) $$

この2次元の2つのベクトルの場合、外積の絶対値はz成分の大きさにほかならず、その値は\sin \thetaに対応することから、この値がゼロの場合は\theta = 0すなわち平行を意味する。

なお数値計算上は、内積値の絶対値がある小さな値より小さいかどうかを判定することになる。

一般的な方法

2つのベクトルが平行な時、そのなす角がゼロとなることから以下が成り立つ。

(1)    \begin{equation*} | {\boldsymbol a} \cdot {\boldsymbol b | = | {\boldsymbol a} | \cdot | {\boldsymbol b} | \cos \theta = | {\boldsymbol a} | \cdot | {\boldsymbol b} | \end{equation*}

この等式についても、小さな値との比較で判定する。

 

直角なベクトルを作り出す

下図のように互いに直交する2つのベクトルを考える。

math_linear_tool_1

これらのベクトルが直角であるためには、内積がゼロとなればよい。

    $$ {\bf v} \cdot {\bf u} = | {\bf v} | | {\bf u} | cos \frac{\pi}{2} = 0 $$

成分表示すれば

    $$ {\bf v} \cdot {\bf u} = v_x u_x + v_y u_y = 0 $$

これを満足する最もわかりやすいベクトル{\bf u}は、{\bf v}の要素を入れ替えて、何れか片方をマイナスとしたもの。

    $$ {\bf u} = (v_y , -v_x) \ {\rm or} \ (-v_y , v_x) $$

ここで要素を入れ替えた後のy成分をマイナスとしたベクトルは、元のベクトルを90度右に回転させたもので、x成分をマイナスとしたベクトルは、元のベクトルを90度左に回転させたもの。

math_linear_tool_right_angle2

これは回転行列を使って確かめることもできる。ただし以下の式で、+は左回り、-は右回りの回転であることに注意。

    $$ \left[ \begin{array}{rr} \cos \left( \pm \frac{\pi}{2} \right) & -\sin \left( \pm \frac{\pi}{2} \right)\\ \sin \left( \pm \frac{\pi}{2} \right) & \cos \left( \pm \frac{\pi}{2} \right) \end{array} \right] \left[ \begin{array}{c} v_x & v_y \end{array} \right] = \left[ \begin{array}{rr} 0 & \mp 1 \\ \pm 1 & 0 \end{array} \right] \left[ \begin{array}{c} v_x & v_y \end{array} \right] = \left[ \begin{array}{c} \mp v_y & \pm v_x \end{array} \right] $$