幾何計算って何?(内積編)

はじめに

こんにちは、meviyのPMIチームで開発をしております、横田です。

前回はPMIチームの紹介記事を書かせていただきましたが、その中で、幾何計算を扱うのが特徴のチームという話をしました。
ただ「幾何計算ってなんだ?」という方が多いのでは、と思いましたので、実際に使われている処理を例示しつつ、どんな内容か紹介していければと思います。

今回は、その中で「内積」の活用例についてご紹介しようと思います。

内積とは?

2つのベクトルAとBに対して、そのなす角度がθの時、内積は下記のように定義されます。

 A \cdot B = |A||B|\cosθ
内積とは

この内積の計算結果の値(特に符号)は、「2つのベクトルがどれだけ同じ方向を向いているか」を測る指標とできます。

  • 内積が0の場合: 2つのベクトルは垂直に交わる(直角)
  • 内積が正の場合: 2つのベクトルは互いに近い方向(鋭角)
  • 内積が負の場合: 2つのベクトルは互いに逆の方向(鈍角)
もしかしたら「角度θを直接使えばいいのではないか」と思う方がいらっしゃるかもしれません。  
しかし、角度θの算出には除算や逆三角関数など、複雑で計算コストの高い処理が必要になります。  
その点、内積は単純なベクトル成分の加算/乗算だけで算出できるため、非常に容易です。  
内積の大きなメリットは、この計算効率の良さにあるかと思います。

といっても、「これを実際の開発でどう活用するのか?」と、具体的なイメージが湧きにくいかもしれません。
実は、前回のチーム紹介記事でご紹介した「部分焼入れ」のPMI表示で、この内積を活用している部分があります。こちらを具体例として見ていきます。

部分焼入れ指示の例

※ PMI(Product Manufacturing Information: 製品製造情報) については前回記事で概要をご紹介していますので、合わせて読んでいただけると嬉しいです。

techblog.dt-dynamics.com

活用例

このPMIは、マウスドラッグで移動できるのですが、見えなくなってしまわないよう、面に埋まる位置(赤線部より下)に移動できないよう制御をしています。

制御サンプル

この「埋まっているかどうか」の判定処理に内積が利用されています。

まず、PMIの基準点(円筒面に沿った赤線上の点)から、その円筒面に垂直な方向へ伸びるベクトル(法線)を取得します。
そして、この法線と、PMIの基準点からマウスの現在位置へのベクトルの内積を求めます。
この内積の値を見ることで、下記の図のように、PMIが円筒面のどちら側に位置するかを判断できます。

内積が0以上の場合

おおよそ同じ向き、または垂直のベクトルなので、赤線部より外側(または赤線上)に位置する。

補正なしの例

内積が0より小さい場合

おおよそ反対向きのベクトルなので、赤線部より内側に位置する → 位置を赤線部上になるよう自動的に補正する。

補正ありの例

上記の制御により、PMIが自動的に赤線部より上に配置されるよう補正され、表示が面に埋まってしまうことを防いでいます。

おわりに

今回は、幾何計算の例として、内積について紹介させていただきました。

ちょっと数学って聞くとハードルを感じちゃうな...と思った方にも、少しでも伝わっていたらいいなと思います。

次回は、また別の幾何計算の活用例をご紹介できればと考えています。今回の記事についても、ご意見や「こんな幾何計算の例が知りたい!」といったご要望があれば、ぜひコメントでお寄せください!