nano_exit

基礎的なことこそ、簡単な例が必要だと思うのです。

多面体の内側に点があるかどうかを判定する。

多面体の頂点の座標が分かっているとする。
多面体の内側の点を原点に取り、対象とする点が多面体の内側に入っているかどうかを判断したい。

もし対象点が多面体の外側にあるとき、「多面体の頂点ベクトルを(原点から見た)対象点の方向に射影させると、射影成分は常に(原点からの)対象点の距離より小さい」が成り立つ。
逆に言えば、各頂点について調べていき、一つでも射影成分の方が大きければ、多面体の内側にあることが分かる。

訂正(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 )