我需要使用近似均匀的三角形平铺来填充任意多边形。我该怎么做?您可以提供对现有算法的引用,甚至可以提供您自己的想法或提示。
以下假定:
这不是一个容易解决的问题,我希望“启发式”解决方案可能效率最高......(对吧?)
答案 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]
数组:
polyfill2d_beautify.c(调整拓扑以获得更均匀的结果)
(注意,耳朵剪辑基于libgdx,对交叉点检查进行空间优化,可以扩展到数千个边,而不会产生如此显着的性能影响,因为剪切每个耳朵都在检查所有其他 - 点每次)。