Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 实心长方体到四面体网格长方体的映射点_Algorithm_Graphics_Mapping_Computational Geometry_Tetrahedra - Fatal编程技术网

Algorithm 实心长方体到四面体网格长方体的映射点

Algorithm 实心长方体到四面体网格长方体的映射点,algorithm,graphics,mapping,computational-geometry,tetrahedra,Algorithm,Graphics,Mapping,Computational Geometry,Tetrahedra,给定一个包含点的三维实体框。给定一个与四面体啮合的盒子。两个箱子的尺寸相同 我需要找到一个算法,将实体的点映射到网格中相应的四面体 我使用了下一个算法: 用八叉树细化实体 在网格中的四面体上迭代,并检查它是否与八叉树的分支或左侧相交。(Ratschek&Rockne算法) 如果相交,将点从八叉树映射到四面体 但是算法非常慢,而且我在检查长方体和四面体之间的交集时遇到了很大的问题 我仍然可以使用八叉树,但我确实需要一些合理的东西来检查交叉点。如有任何评论,将不胜感激 更新:我有200万个实心点和2

给定一个包含点的三维实体框。给定一个与四面体啮合的盒子。两个箱子的尺寸相同

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

我使用了下一个算法:

  • 用八叉树细化实体
  • 在网格中的四面体上迭代,并检查它是否与八叉树的分支或左侧相交。(Ratschek&Rockne算法)
  • 如果相交,将点从八叉树映射到四面体
  • 但是算法非常慢,而且我在检查长方体和四面体之间的交集时遇到了很大的问题

    我仍然可以使用八叉树,但我确实需要一些合理的东西来检查交叉点。如有任何评论,将不胜感激

    更新:我有200万个实心点和20万个四面体


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

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

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

    总结如下:

    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]
    的“内侧”,如果它与“相对”顶点
    l
    位于平面
    [i,j,k]
    的同一侧


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

    假设你知道四面体的顶点,你可以检查一个点是否在四面体内部,方法是检查它是否位于每个平面的
    左侧
    右侧
    ,比如说左侧是指向法线的一侧

    确定点是在平面的左侧还是右侧的数学是

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

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