我继承了一些在三角形之间旋转边缘的遗留代码,以改善拓扑分布, 这种算法运行良好,但计算量很大。
由两个共享边缘的三角形组成的四边形的psudo代码是:
/* split 0-2 */
score_02 = (area(v0, v1, v2) / perimeter(v0, v1, v2)) +
(area(v0, v2, v3) / perimeter(v0, v2, v3));
/* split 1-3 */
score_13 = (area(v1, v2, v3) / perimeter(v1, v2, v3)) +
(area(v0, v1, v3) / perimeter(v0, v1, v3));
/* negative number when (0-2) is an improved state */
result = score_13 - score_02;
这非常有效,可以在2D三角区域上进行精细镶嵌(参见示例)。
我主要担心的是效率不高(外围计算涉及6个平方根调用)。
在(上图)之后,在放松(下方)之后,还有其他/更好的方法来计算放松状态,例如:
未能使用好方法可能:
已经指出(在现在删除的答案中)可以使用简单的最短边法,但这并不能提供良好的分布(注意边界处的瘦三角形)例如:
注1)这可能是一个众所周知的问题,因为它没有记录在 代码,搜索它并不容易:)
注2)到目前为止,我还没有认真研究另一种方法,我可以这样做并在此发表调查结果。
答案 0 :(得分:1)
您可以尝试生成受约束的delaunay三角剖分。对于给定的点集,这可能是“最好的”(可证明的)三角测量。
如果你可以在内部或边缘(称为steiner点)添加更多点(不改变形状),你可以保证更好的三角形(就最小内角和面积而言)。
请参阅:http://www.cs.cmu.edu/~quake/triangle.defs.html#conform。
CGAL有这些实现。
答案 1 :(得分:0)
您发布的代码做出决定"翻转或不翻转"三角形之间的共享边缘。它选择了两种可能性中最正常的三角形(等边是最好的):有或没有边缘翻转。
这个"最常见的"标准基于关系区域/周边。你不需要价值;只需要option1 - option2
结果的符号。
所以你不需要平根。使用平方项就足够了。
如果您对该区域使用Heron's formula,则可以检查一些性能改进。您可以先计算周长的平方,然后在该公式中使用它。
实现更好的正三角形的其他方法是使用 Delaunay 条件,这会产生具有相同周长的最大区域。如果第四点位于由其他三个点限定的外接圆内,则测试肉正在翻转边缘。
此测试的典型名称是" InCircle"。它是决定因素的结果(见Wikipedia)。必须以逆时针顺序输入三个点,或者行列式的符号发生变化。这个决定因素的唯一缺点是当三个点接近共线时它的数值问题。