通过平铺三角形来细分任意多边形

时间:2010-01-04 13:01:00

标签: algorithm language-agnostic topology graphics tesselation

我需要使用近似均匀的三角形平铺来填充任意多边形。我该怎么做?您可以提供对现有算法的引用,甚至可以提供您自己的想法或提示。

以下假定:

  • 多边形可能是凸的(但如果你想出一个适用于凹形的算法,可以获得奖励点)
  • 多边形具有任意数量的边(3或更多)
  • 曲面细分量(最好是算法添加的顶点数)应该参数化
  • 多边形的边缘可以除以算法
  • 三角形的大小和形状应该几乎是均匀的(即角落倾向于60度)
  • 优选地,顶点处的数字边缘应该是很少而不是很多。这可能会从前一点开始(即,算法应该生成“干净网格”)。

这不是一个容易解决的问题,我希望“启发式”解决方案可能效率最高......(对吧?)

4 个答案:

答案 0 :(得分:4)

在算法上实际上听起来并不复杂。或者我错过了什么?

一些伪代码:

  • 将一个轴对齐的封闭方块紧紧围绕多边形放置。
  • 将每个方格细分为四个子节点(四叉树状),其中迭代次数决定了您的“镶嵌量”。
  • 每个得到的正方形要么干净利落在多边形之外(=忽略),要么干净利落在多边形内部(=沿对角线分割成两个三角形的结果)或者与多边形相交。
  • 交叉方块的确切情况留给读者练习。 ;-) [此时此刻,至少。]

它会为您提供45°/ 45°/ 90°角的三角形。如果你想要尽可能接近60°,你应该首先用六边形镶嵌多边形的表面(六边形的大小是你的“镶嵌量”)然后检查六个60°/ 60°中的每一个组成这些六边形的/ 60°三角形。对于这些三角形,您可以使用上面伪代码中的方块进行相同的操作,除了您不需要将多边形中的方块分开,因为它们本身就是三角形。

这有什么帮助吗?应该适用于任何多边形(凸/凹/带孔),我认为,假设您对交叉正方形/三角形的确切处理这样的多边形。

答案 1 :(得分:4)

Triangle能做你想做的吗?

(该网站上的算法解释比我能想到的更好。)

答案 2 :(得分:3)

正如Jason Orendorff指出的那样,你应该尝试使用Triangle来生成高质量的网格物体。它有很多选项,您可以尝试获得各向同性网格。然后,您可以尝试使用迭代算法来创建以良好为中心的三角测量。更多详情列于this publications page。我已经实现了2007年的论文“以中心为中心的平面三角测量 - 一种迭代方法”,它在中等大小的网格上给出了不错的结果。良好居中的三角测量是三角形的所有外心都位于相应三角形内部的三角形。由于您需要稍微不同的内容,因此您可以尝试更改所涉及的错误指标。您可以在三角形中找到“非同余”的度量并最小化该错误。很可能这样的误差函数将是非凸的,因此所描述的非线性共轭梯度优化就像你所做的一样。

答案 3 :(得分:1)

这可以使用简单的耳夹法(假设我们不需要支撑孔)来实现凹/凸多边形。

这是两个步骤,因此迭代剪辑“最佳”效果可能更有效。为获得更均匀的结果,您不必重新安排拓扑作为第二次通过(YMMV)。
(请注意,这里使用的两个步骤的原因是不总是需要计算更均匀的分布。)

完全披露,当我需要一个用于实时建模应用程序的多边形的快速镶嵌器时,我自己遇到了这个问题。

用C编写的工作实现,其中包含并返回POD' float[2]数组,填入uint[3]数组:

(注意,耳朵剪辑基于libgdx,对交叉点检查进行空间优化,可以扩展到数千个边,而不会产生如此显着的性能影响,因为剪切每个耳朵都在检查所有其他 - 点每次)。

example output