Graphics 带孔多边形三角剖分

Graphics 带孔多边形三角剖分,graphics,geometry,direct3d,triangulation,cgal,Graphics,Geometry,Direct3d,Triangulation,Cgal,我正在寻找一个算法或库(更好)分解成三角形的多边形。我将在Direct3D应用程序中使用这些三角形。最好的选择是什么 以下是我到目前为止的发现: 我知道它提供了三角测量,但不确定它是否支持孔 我非常感谢在这方面有经验的人的一些意见 编辑:这是一个二维多边形。您可以相对轻松地添加孔。基本上,根据CGAL对输入点的凸包进行三角剖分,然后删除其中心位于任何孔多边形(或任何外部边界)内的任何三角形。在处理大型数据集中的大量漏洞时,可以使用掩蔽技术来显著加快此过程 编辑:此技术的一个常见扩展是删除外壳

我正在寻找一个算法或库(更好)分解成三角形的多边形。我将在Direct3D应用程序中使用这些三角形。最好的选择是什么

以下是我到目前为止的发现:

  • 我知道它提供了三角测量,但不确定它是否支持孔
  • 我非常感谢在这方面有经验的人的一些意见


    编辑:这是一个二维多边形。

    您可以相对轻松地添加孔。基本上,根据CGAL对输入点的凸包进行三角剖分,然后删除其中心位于任何孔多边形(或任何外部边界)内的任何三角形。在处理大型数据集中的大量漏洞时,可以使用掩蔽技术来显著加快此过程


    编辑:此技术的一个常见扩展是删除外壳上的弱三角形,其中最长边或最小内角超过给定值。这将形成更好的凹面外壳。

    CGAL具有您需要的工具:

    您可以简单地将多边形的边界(包括孔的边界)作为约束提供(最好是插入所有顶点,然后将约束指定为成对的顶点控制柄)


    然后,可以通过任何遍历算法标记三角剖分的三角形:从与无限顶点关联的三角形开始,将其标记为外部,每次穿过约束时,切换到相反的标记(如果您以前将三角形标记为“局外人”,则在内部;如果您以前将三角形标记为“局内人”,则在外部)。

    为您提供更多的库选择:

    Polyboolean。我从未尝试过这个,但它看起来很有希望:

    通用多边形裁剪器。该裁剪器在实践中效果非常好,可以进行三角剖分以及裁剪和打孔:

    我个人的建议是:使用GLU(OpenGL实用程序库)中的tesselation。代码坚如磐石,比GPC更快,生成的三角形更少。使用库不需要初始化OpenGL句柄或类似的东西

    如果您不喜欢在DirectX应用程序中包含OpenGL系统库的想法,还有一个解决方案:只需下载SGI OpenGL参考实现代码并从中取出三角架。它只使用OpenGL Typedef名称和一手完整的枚举。就是这样。您可以在一小时或更长的时间内提取代码并制作一个独立库两个


    总的来说,我的建议是使用一些真正有效的方法,不要开始编写自己的三角测量

    如果你读过关于削耳或扫线算法的文章,你很可能会想自己动手,但事实是,计算几何算法非常难编写,因为它们工作稳定,从不崩溃,并且总是返回有意义的结果。数值舍入误差会累积,最终会让你丧命


    我为我工作的公司用C写了一个三角剖分算法。使核心算法工作需要两天时间。使其处理各种退化输入又花了两年时间(我不是全职工作,但相信我,我在这方面花的时间比我应该花的多)这是有限元分析中的一个常见问题。它被称为“自动网格生成”。谷歌找到了商业和开源软件的链接。他们通常假定几何图形的某种CAD表示形式开始。

    乔纳森·舍丘克(Jonathan Shewchuk)的几何图形是惊人的;我过去曾用它来自动化三角测量。你可以要求它尝试避免小三角形/窄三角形等,所以你会说“好”三角剖分,而不仅仅是任何三角剖分。

    另一个选项(具有非常灵活的许可证)是从VTK移植算法:

    该算法工作得相当好。直接使用它是可能的,但需要指向VTK的链接,这可能比您想要的开销更大(尽管它还有许多其他不错的特性)

    它支持约束(孔/边界等),以及对不一定在XY平面上的曲面进行三角剖分。它还支持我在其他地方没有看到的一些功能(请参阅Alpha值注释)。

    请尝试libtess2


    基于原始SGI GLU tesselator(具有自由许可)。解决了许多小型Malloc的一些内存管理问题。

    我发现poly2tri库正是三角剖分所需的。它生成的网格比我尝试过的其他库(包括libtess)干净得多,而且它也支持漏洞。它已经被转换成一系列语言。许可证是,所以你可以在任何项目中使用它


    我已经用耳削法在C#中实现了一个3D多边形。它易于使用,支持孔,数值稳定,支持任意(非自交)凸/非凸多边形。

    您需要2D(三角形)还是3D(四面体)?此方法不起作用:您需要使用受约束的三角剖分,否则,您可能会遇到部分位于孔内部分位于孔外的三角形。@camille-带孔的三角剖分多边形始终受约束。根据定义,多边形边和孔是约束的。如果三角形边与孔相交,则孔将被部分覆盖。如果它穿过一个多边形边缘,TIN就不会是该多边形的三角剖分。我也写了所有我自己的TIN内容,并且100%同意许多退化的情况。由于这个原因,我永远不会离开我自己的LIB,但有些较新的CG书籍非常优秀。不确定GLU.Glunewess()显然,如果你没有一个正常工作的GL上下文,Linux上的SEGFULTS是不需要的,但它调用了glGetError。我在互联网上找到了这个信息,所以它不是100%,但SEGFULT是真实的(这正是我研究它的原因)。创建