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