用于计算最多“偶数”的算法镶嵌三角形边的方向?

时间:2017-09-14 06:38:06

标签: algorithm computational-geometry

我继承了一些在三角形之间旋转边缘的遗留代码,以改善拓扑分布, 这种算法运行良好,但计算量很大。

由两个共享边缘的三角形组成的四边形的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个平方根调用)。

(上图)之后,在放松(下方)之后,还有其他/更好的方法来计算放松状态,例如:

example of tessellation

未能使用好方法可能:

  • 导致其中一个三角形具有零区域
    (取决于输出的用途,这可能具有级联效果 - 具有零区域法线的面,例如,当使用时不容易处理输入其他过程)。
  • 不良分割可能会导致映射纹理失真或变形严重。

已经指出(在现在删除的答案中)可以使用简单的最短边法,但这并不能提供良好的分布(注意边界处的瘦三角形)例如:tessellation with points for each face

注1)这可能是一个众所周知的问题,因为它没有记录在 代码,搜索它并不容易:)

注2)到目前为止,我还没有认真研究另一种方法,我可以这样做并在此发表调查结果。

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)。必须以逆时针顺序输入三个点,或者行列式的符号发生变化。这个决定因素的唯一缺点是当三个点接近共线时它的数值问题。