网格到网格交叉点

时间:2011-11-01 21:53:25

标签: computational-geometry mesh surface triangulation

我正在寻找一个图书馆或一篇论文来描述如何确定一个三角形网格是否与另一个三角形网格相交。

有趣的是我空洞。如果在CGAL中有某种方法可以做到这一点,那就是我的意思。

似乎显然应该是可能的,因为三角形交叉是可能的,因为每个网格包含有限数量的三角形。但我认为必须有一个更好的方法来做这个比明显的O(n * m)方法,其中一个网格有n个三角形而另一个网格有m个三角形。

5 个答案:

答案 0 :(得分:8)

我们通常使用CGAL执行此操作的方式是使用CGAL::box_intersection_d

您可以将此example与此one混合使用。

修改

自CGAL 4.12起,现在有了CGAL::Polygon_mesh_processing::do_intersect()函数。

答案 1 :(得分:3)

本书Real-Time Collision Detection对实施此类算法有一些很好的建议。基本方法是使用空间分区或边界卷来减少需要执行的三元交叉测试的数量。

有很多优秀的学术套餐可以解决这个问题,包括Proximity Query Package,而GAMMA research group at University of North Carolina,SWIFT,I-COLLIDE和RAPID的其他工作都是众所周知的。检查这些库上的许可证是否可以接受。

开放动态引擎(ODE)是一个物理引擎,它包含大量交集原语的优化实现。您可以在wiki上查看三角形 - 三角形相交测试的文档。

虽然它并不完全符合您的要求,但我相信CGAL也可以做到这一点 - Tree of Triangles, for Intersection and Distance Queries

答案 2 :(得分:1)

我认为您缺少的搜索字词是 overlay 。例如,这是Surface Mesh Overlay上的网页。该网站有一个简短的参考书目,全部由同一作者撰写。 以下是关于该主题的另一篇论文:“Overlay mesh construction using interleaved spanning trees,” INFOCOM 2004 :IEEE计算机和通信学会第二十三届年度联席会议。 另见GIS SE问题,“Performing Overlay of Two Triangulated Irregular Networks (TIN)。”

答案 3 :(得分:1)

要添加到其他答案,还有涉及3D Minkowski和凸多面体的技术 - 凹面多面体可以分解为凸面部分。查看this

答案 4 :(得分:1)

libigl中,我们将cgal' CGAL::box_intersection_d包裹起来,使网格与顶点V相交,并将F与另一个网格与顶点{{1}相交}和faces U,将成对的交叉面存储为G中的行:

IF

这将忽略自我交叉。为了完整起见,我还提到我们还在一个单独的函数中支持自交叉:

igl::intersect_other(V,F,U,G,false,IF);