如何判断n维平行多面体(平行六面体的高维推广)内是否包含指定点?
嘿,这个问题其实不用纠结维度,核心思路在任意n维空间里都是通用的,咱们一步步拆解来看:
先明确前提
首先假设你的n维平行多面体(也就是你说的parallelotope)是由n个线性无关的基向量$\mathbf{b}_1, \mathbf{b}_2, ..., \mathbf{b}_n$生成的——简单说,这个多面体里的所有点都可以写成:
$$\mathbf{p} = \mathbf{v}_0 + s_1\mathbf{b}_1 + s_2\mathbf{b}_2 + ... + s_n\mathbf{b}_n$$
其中$\mathbf{v}_0$是多面体的一个顶点(比如原点,要是你的多面体不是从原点出发的,先做个平移就行),每个系数$s_i$都落在$[0,1]$区间里。
步骤1:平移点(如果需要)
如果你的平行多面体不是以原点为顶点的,先把目标点$\mathbf{t}$做平移:
$$\mathbf{t}' = \mathbf{t} - \mathbf{v}_0$$
这样就把问题转化为判断$\mathbf{t}'$是否在“以原点为顶点、由基向量生成的平行多面体”内。
步骤2:求解线性组合系数
把$\mathbf{t}'$表示成基向量的线性组合,也就是解下面的n×n线性方程组:
$$\mathbf{B}\mathbf{s} = \mathbf{t}'$$
这里$\mathbf{B}$是一个n×n矩阵,每一列就是对应的基向量$\mathbf{b}_i$,$\mathbf{s} = [s_1, s_2, ..., s_n]^T$是我们要求的系数向量。
步骤3:检查系数范围
解出$\mathbf{s}$之后,只要所有的$s_i$都满足$0 \leq s_i \leq 1$,那点$\mathbf{t}$就在这个平行多面体里;只要有一个系数超出了这个区间,就说明点不在里面。
结合你提到的3D情况对应一下
你之前在3D里用的投影方法,本质上就是在间接求解这些系数。比如解出$s_1, s_2, s_3$三个系数,只要它们都在0到1之间,点就在平行六面体里——和这个通用思路是一致的。
4D的情况完全同理
到了4维空间,操作步骤没有任何变化:
- 平移目标点(如果多面体顶点不是原点)
- 解4×4的线性方程组,得到4个系数$s_1 \sim s_4$
- 检查这4个系数是否全部落在$[0,1]$区间内
一些注意事项
- 基向量必须是线性无关的,不然生成的不是n维的平行多面体(可能是低维的“扁”结构),这时候方程组要么无解,要么有无穷多解,需要先验证基的线性相关性。
- 如果是用浮点数计算的话,记得考虑精度误差,不要严格判断等于0或1,可以给个很小的容错范围,比如判断$s_i \in [-\epsilon, 1+\epsilon]$($\epsilon$取比如$10^{-6}$之类的小值),避免把边界上的点误判为“在外面”。
备注:内容来源于stack exchange,提问作者narger

