Geometry 给定一个不规则多边形';s顶点列表,如何创建内部三角形以高效地构建平面3D网格?

Geometry 给定一个不规则多边形';s顶点列表,如何创建内部三角形以高效地构建平面3D网格?,geometry,unity3d,computational-geometry,polygons,Geometry,Unity3d,Computational Geometry,Polygons,我使用的是Unity,但解决方案应该是通用的。 我将从鼠标单击中获得用户输入,鼠标单击定义了闭合不规则多边形的顶点列表。 顶点将定义平面三维网格的外边缘 要按程序生成Unity中的网格,我必须指定所有顶点以及它们如何连接以形成三角形 所以,对于凸多边形来说,这很简单,我只需要制作顶点为1,2,3,然后是1,3,4的三角形,形成类似孔雀尾巴的形状 但对于凹多边形来说,这并不是那么简单。 是否有一种有效的算法来查找内部三角形?您可以使用一个受约束的(实现起来并不简单!)。和中提供了良好的库实现,提供

我使用的是Unity,但解决方案应该是通用的。 我将从鼠标单击中获得用户输入,鼠标单击定义了闭合不规则多边形的顶点列表。 顶点将定义平面三维网格的外边缘

要按程序生成Unity中的网格,我必须指定所有顶点以及它们如何连接以形成三角形

所以,对于凸多边形来说,这很简单,我只需要制作顶点为1,2,3,然后是1,3,4的三角形,形成类似孔雀尾巴的形状

但对于凹多边形来说,这并不是那么简单。
是否有一种有效的算法来查找内部三角形?

您可以使用一个受约束的(实现起来并不简单!)。和中提供了良好的库实现,提供了高效的
O(n*log(n))
实现

如果顶点集很小,也可以使用该算法,尽管它不一定会给出Delaunay三角剖分(通常会生成次优三角形),并在
O(n^2)
中运行。不过,自己实现是相当容易的


由于输入顶点存在于三维空间中的平面上,因此可以通过投影到平面上,计算二维中的三角剖分,然后将相同的网格拓扑应用于三维顶点集来获得二维问题

有一个多边形社区脚本,但我个人没有使用过。它既适用于三维点,也适用于二维点


如果我想将问题限制在2D,我过去使用过的一个技巧是找到3D数据中变化最大的两个轴,并将它们设置为“X”和“Y”

我已经实现了如下的耳朵剪辑算法:

  • 在顶点上迭代,直到找到凸顶点v
  • 检查多边形上的任何点是否位于三角形(v-1、v、v+1)内。如果有,则需要沿顶点v和离直线最远的点(v-1,v+1)分割多边形。递归地计算两个分区
  • 如果围绕顶点v的三角形不包含其他顶点,请将该三角形添加到输出列表并删除顶点v,重复此操作直到完成
  • 注:

  • 这本质上是一个二维操作,即使在处理三维面时也是如此。要考虑2D中的问题,简单地忽略具有最大绝对值的面法线的矢量坐标。(这是将三维面“投影”到二维坐标的方式)。例如,如果面具有法线(0,1,0),则将忽略y坐标并在x、z平面中工作
  • 要确定哪些顶点是凸的,首先需要知道多边形的缠绕。您可以通过查找多边形中最左侧(最小的x坐标)顶点来确定这一点(通过查找最小的y来断开连接)。这样的顶点始终是凸的,因此该顶点的缠绕使您获得多边形的缠绕
  • 您可以使用带符号的三角形面积方程确定缠绕和/或凸度。请参阅:。根据多边形的缠绕,所有具有正面积(逆时针缠绕)或负面积(顺时针缠绕)的凸三角形
  • 三角形中的点公式由有符号三角形面积公式构造而成。请参阅:
  • 在步骤2中,需要确定哪一个顶点(v)离直线最远,可以通过形成三角形(L0、v、L1)并检查哪一个具有最大面积(绝对值,除非假设特定的缠绕方向)来确定
  • 对于自交多边形,此算法没有很好的定义,并且由于浮点精度的性质,您可能会遇到这种情况。可以为稳定性实施一些保护措施:-一个点不应被视为在三角形内,除非它是凹点。(这种情况表示自相交,不应沿此顶点分割集合)。您可能会遇到一种情况,即分区是完全凹的(即,它的缠绕方式与原始多边形的缠绕方式不同)。这个分区应该被丢弃
  • 由于该算法是循环的,并且涉及到对集合的分区,因此使用具有阵列的双向链接列表结构进行存储是非常高效的。然后,您可以在0(1)中对集合进行分区,但是该算法仍具有平均O(n^2)运行时间。最佳情况下的运行时间实际上是一个需要多次分区的集合,因为这样可以快速减少比较的次数