一个标准的简化是首先使用轴对齐的边界框计算近似的八叉树-四面体交叉点。由此产生的相交测试非常简单。
然后,一旦遍历到树的叶层,就可以使用精确测试来确定给定四面体中包含哪些点。
总结一下:
Form an octree T for your points X
for (all tetrahedrons ti in mesh M)
Form a minimal axis-aligned bounding-box Bi for tetrahedron ti
Traverse T from root, accumulating a list Li of all leaf nodes
that overlap with box Bi
for (all leaf nodes li in list L)
for (all points pi in leaf node li)
if (point pi is inside tetrahedron ti /*exact test*/ )
Associate point pi with tetrahedron ti
endif
endfor
endfor
endfor
如果满足以下条件,则该算法是有效(i)
的:点X
在网格中分布良好M
,并且(ii)
其中的四面体M
具有合理的纵横比。
实现良好性能的关键是确保尽可能高效地执行树遍历步骤。
可以通过检查给定点是否pi
位于四面体 4 个面的“内”侧来完成四面体点测试。给定一个四面体[i,j,k,l]
,如果该点与“相对”顶点位于平面的同一侧,则该点位于pi
面的“内”侧。[i,j,k]
[i,j,k]
l
可以使用自适应精度算术稳健地执行这些定向测试。Jonathan Shewchuk在这里提供了这样的实现。