多面体の頂点の座標が分かっているとする。
多面体の内側の点を原点に取り、対象とする点が多面体の内側に入っているかどうかを判断したい。
もし対象点が多面体の外側にあるとき、「多面体の頂点ベクトルを(原点から見た)対象点の方向に射影させると、射影成分は常に(原点からの)対象点の距離より小さい」が成り立つ。
逆に言えば、各頂点について調べていき、一つでも射影成分の方が大きければ、多面体の内側にあることが分かる。
訂正(2021/0812)
多面体の頂点との内積では上手く行かないことが分かった。
原点から各面に垂線を下し、面と垂線の交点と垂点と定義する。
原点から対象点へ向かうベクトルを各垂点方向へ射影したときに、射影成分が垂線の長さよりも短ければ、多面体の内側にいると判断できる。
以下、テストコード。
import numpy as np import itertools as it def make_vertical_points( vertices ): vps = [] for v1, v2, v3 in it.combinations( vertices, 3 ): vv = np.cross( v2 - v1, v3 - v1 ) ev = vv / np.linalg.norm( vv ) pv = np.dot( v1, ev ) nv = abs( pv ) if np.all( nv >= np.array( [ np.dot( vertex, ev ) for vertex in vertices ] ) ) and \ not np.any( [ np.all( pv * ev == vp ) for vp in vps ] ): vps.append( pv * ev ) return vps def check_inside_polyhedron( point, vps ): return np.all( [ np.dot( point, vp/np.linalg.norm(vp) ) <= np.linalg.norm( vp ) for vp in vps ] ) # example vertices = np.array( list( it.product( [-1,1], repeat=3 ) ) ) vps = make_vertical_points( vertices ) check_inside_polyhedron( np.array( [0.9, 0, 0] ), vps )