关于数学:找到四面体内所有整数坐标的点

Find all points with integer coordinates inside tetrahedron

我试图找到位于四面体内部的所有整数坐标点(我希望能够以某种方式遍历它们)。我知道定义四面体的四个点(A、B、C、D)的坐标。

我目前正在做的是找到四面体的边界框(A、B、C、D 的最小和最大 x、y、z 坐标),然后循环遍历四面体内的所有点边界框。对于每个这样的点,我计算重心坐标(使用来自维基百科的方程)并检查该点是否在四面体内部(如果任何重心坐标为负或大于 1,则该点不在内部)。

有没有更好的方法来做到这一点?目前,我正在测试的点(从边界框)有大约 1/6 的机会确实位于四面体内部,所以我认为我做了太多不必要的计算。

我正在处理通过对更大体积进行三角剖分生成的四面体列表(我正在扩展体积并希望使用四面体插值法对缺失值进行插值)。我没有使用任何外部库。


另一个改进的想法:

检查平行于 z 轴的"杆"(即 x=4,y=6)是否穿过四面体。如果不是,则 (x=4, y=5, z) 不能在里面。

否则,找出杆与四面体边缘的交点(通过找出构成四面体边缘的平面与其相交的位置)。

假设这些平面在 z=1.3 和 z=10.04 处相交。然后你知道所有点 (4,5, 2) 到 (4,5,10) 都在里面。

对 x 和 y 的所有值重复。

这在实践中应该更快,因为它会为您节省 1 个循环。


你的方法是正确的。有一些可能的优化,取决于要求可能值得或不值得。例如:

有一种更简单的方法可以检查给定点是在四面体内部还是外部。
它相当于检查该点相对于四面体的 4 个边中的每一个属于哪个半空间:

每边由 3 个点定义(比如 A、B、C)。那么平面法线是 (C-A)x(B-A) (这是平面中向量的叉积)。如果此坐标为 (a,b,c),则平面方程为 F(x,y,z) = ax+by+cz = 0。对于给定的点 (x0, y0, z0),F(x0,y0,z0) 的符号决定了这些点属于哪个半平面。

关键是您可以预先计算四面体每一侧的平面方程以及对应于"外部"的符号,然后对给定点的检查最多进行 4 次评估(每侧一个) ,每个需要 3 次乘法和 2 次加法。