問題を定義する
- a * x + b * y + c * z + d = 0 で表される平面
- (x1, y1, z1) で表される点
の間の距離は平面の法線ベクトル(a, b, c)の長さの何倍か。 点が法線ベクトル側にあれば正の値、逆なら負の値になる。
問題を整理する
距離が法線ベクトル長さのt倍であるとすると、最も近い点は
(x1 - t*a, y1 - t*b, z1 - t*c)
これを平面の式に当てはめて
a*(x1 - t*a) + b*(y1 - t*b) + c*(z1 - t*c) + d = 0
a*x1 - t*a*a + b*y1 - t*b*b + c*z1 - t*c*c + d = 0
t*a*a + t*b*b + t*c*c = a*x1 + b*y1 + c*z1 + d
t*(a*a + b*b + c*c) = a*x1 + b*y1 + c*z1 + d
両辺を(a*a + b*b + c*c)で割って(平面の定義より0ではない)
t = (a*x1 + b*y1 + c*z1 + d)/(a*a + b*b + c*c)
実装
というわけで以下のようなコードになる。