将实心框的点映射到四面体网格框

时间:2014-03-13 14:44:33

标签: algorithm graphics mapping computational-geometry tetrahedra

给出一个带有点的3d实心框。给出一个与四面体啮合的盒子。两个盒子的尺寸都是一样的。

我需要找到一种算法,它将实体的点映射到网格中的相应四面体。

我使用了下一个算法:

  1. 使用八叉树细化固体
  2. 迭代网格中的四面体并检查它是否与分支或八叉树的离开相交。 (Ratschek& Rockne的算法)
  3. 如果它相交,则将点从八叉树映射到四面体。
  4. 但算法非常慢,而且我在检查盒子和四面体之间的交叉点时遇到了很大的问题。

    我仍然坚持使用八叉树,但我确实需要一些合理的东西来检查交叉点。任何评论都将受到高度赞赏。

    更新:我有200万个固体点和200k四面体

    更新2:我正在尝试在三角测量中实现步行

2 个答案:

答案 0 :(得分:1)

一个标准的简化是首先使用轴对齐的边界框计算近似八叉树 - 四面体交点。由此产生的相交测试非常简单。

然后,一旦您遍历到树的叶级,就可以使用精确测试来确定给定四面体中包含哪些点。

总结:

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的“内”侧。 “顶点{{1}}。

这些定向测试可以使用自适应精度算法稳健地执行。 Jonathan Shewchuk提供了这样的实现here

答案 1 :(得分:1)

假设你知道四面体的顶点,你可以检查一个点是否在四面体内部,检查它是否位于每个平面的leftright侧,比如左边是指沿着正常的一侧。

确定某个点是否在某个平面的左侧或右侧的数学运算是straight forward

我找到了另一个method,但看起来像是我答案的一个变种。

当然,如果一个点位于tet内,它将被映射到tet。此方法可以实现为顶点着色器或OpenCL / CUDA内核,并使其高度并行。