我试图找到位于四面体内的整数坐标的所有点(我想以某种方式能够遍历它们)。我知道定义四面体的四个点(A,B,C,D)的坐标。
我目前正在做的是找到四面体的边界框(A,B,C,D的最小和最大x,y,z坐标),然后循环遍历边界内的所有点框。对于每个这样的点,我计算重心坐标(使用the equations from Wikipedia)并检查点是否在四面体内(如果任何重心坐标为负或大于1,则点不在内部)。 / p>
有更好的方法吗?目前我测试的点(来自边界框)大约有1/6的机会真的位于四面体内部,所以我认为我做了太多不必要的计算。
我正在处理我通过三角测量更大音量生成的四面体列表(我正在扩展音量并希望使用四面体插值来插值缺失值)。我没有使用任何外部库。
答案 0 :(得分:3)
你的方法是正确的。有一些可能的优化,根据要求可能值得或不值得。例如:
有一种更简单的方法可以检查给定点是否在四面体内部或外部。 相当于四面体的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次。
答案 1 :(得分:3)
改善的另一个想法:
检查与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个循环。