はじめに
こんにちは、meviyのPMIチームで開発をしております、横田です。
前回はPMIチームの紹介記事を書かせていただきましたが、その中で、幾何計算を扱うのが特徴のチームという話をしました。
ただ「幾何計算ってなんだ?」という方が多いのでは、と思いましたので、実際に使われている処理を例示しつつ、どんな内容か紹介していければと思います。
今回は、その中で「内積」の活用例についてご紹介しようと思います。
内積とは?
2つのベクトルAとBに対して、そのなす角度がθの時、内積は下記のように定義されます。

この内積の計算結果の値(特に符号)は、「2つのベクトルがどれだけ同じ方向を向いているか」を測る指標とできます。
もしかしたら「角度θを直接使えばいいのではないか」と思う方がいらっしゃるかもしれません。 しかし、角度θの算出には除算や逆三角関数など、複雑で計算コストの高い処理が必要になります。 その点、内積は単純なベクトル成分の加算/乗算だけで算出できるため、非常に容易です。 内積の大きなメリットは、この計算効率の良さにあるかと思います。
といっても、「これを実際の開発でどう活用するのか?」と、具体的なイメージが湧きにくいかもしれません。
実は、前回のチーム紹介記事でご紹介した「部分焼入れ」のPMI表示で、この内積を活用している部分があります。こちらを具体例として見ていきます。
※ PMI(Product Manufacturing Information: 製品製造情報) については前回記事で概要をご紹介していますので、合わせて読んでいただけると嬉しいです。
活用例
このPMIは、マウスドラッグで移動できるのですが、見えなくなってしまわないよう、面に埋まる位置(赤線部より下)に移動できないよう制御をしています。
この「埋まっているかどうか」の判定処理に内積が利用されています。
まず、PMIの基準点(円筒面に沿った赤線上の点)から、その円筒面に垂直な方向へ伸びるベクトル(法線)を取得します。
そして、この法線と、PMIの基準点からマウスの現在位置へのベクトルの内積を求めます。
この内積の値を見ることで、下記の図のように、PMIが円筒面のどちら側に位置するかを判断できます。
内積が0以上の場合
おおよそ同じ向き、または垂直のベクトルなので、赤線部より外側(または赤線上)に位置する。

内積が0より小さい場合
おおよそ反対向きのベクトルなので、赤線部より内側に位置する → 位置を赤線部上になるよう自動的に補正する。
上記の制御により、PMIが自動的に赤線部より上に配置されるよう補正され、表示が面に埋まってしまうことを防いでいます。
おわりに
今回は、幾何計算の例として、内積について紹介させていただきました。
ちょっと数学って聞くとハードルを感じちゃうな...と思った方にも、少しでも伝わっていたらいいなと思います。
次回は、また別の幾何計算の活用例をご紹介できればと考えています。今回の記事についても、ご意見や「こんな幾何計算の例が知りたい!」といったご要望があれば、ぜひコメントでお寄せください!