将四边形转换为三角形条的最快方法?

时间:2012-09-02 21:27:17

标签: c algorithm geometry triangulation

将四边形(由四个x,y点组成)转换为三角形条带的最快方法是什么?我很清楚存在的一般三角测量算法,但我需要一个简短的,优化良好的算法,只处理四边形。

我目前的算法是这样做的,适用于大多数四边形,但仍会得到一些混合点:

#define fp(f) bounds.p##f

/* Sort four points in ascending order by their Y values */
point_sort4_y(&fp(1), &fp(2), &fp(3), &fp(4));

/* Bottom two */
if (fminf(-fp(1).x, -fp(2).x) == -fp(2).x)
{
    out_quad.p1 = fp(2);
    out_quad.p2 = fp(1);
}
else
{
    out_quad.p1 = fp(1);
    out_quad.p2 = fp(2);
}

/* Top two */
if (fminf(-fp(3).x, -fp(4).x) == -fp(3).x)
{
    out_quad.p3 = fp(3);
    out_quad.p4 = fp(4);
}
else
{
    out_quad.p3 = fp(4);
    out_quad.p4 = fp(3);
}

修改:我要求将单个四元组转换为一个应该由四个点组成的三角形条带。

2 个答案:

答案 0 :(得分:2)

考虑到A B C D,我们可以将其拆分为A B C, A C DA B D, D B C

比较A-CB-D的长度,并使用较短的分割边缘。换句话说,如果A B C, A C D更短,则使用A-C,否则使用A B D, D B C

答案 1 :(得分:2)

  1. 找到四边形的极值点w.r.t坐标。设为p,其中p是循环容器上的迭代器
  2. 检查p + 2是否位于{p - 1, p, p + 1}所形成的耳内。如果是,请寻求极限w.r.t.其他坐标(或从min切换到max或反之亦然)并重复步骤1.
  3. 通过切断极值点周围的“耳朵”将四边形分成两个三角形: t0 = { p - 1, p, p + 1}t1 = { p + 1, p + 2, p - 1 }
  4. 无需排序,只需找到极值即可。如果你的四边形保证是凸的(真正的四边形),那么跳过极值搜索并选择任意p

    编辑:根据评论的建议修改。评论者提出的表述也更容易实现:

    1. 给定一个四边形A, B, C, D形成对角线ACBD
    2. 如果点BD位于AC的不同侧,则AC可用于拆分四元组
    3. 将相同的推理应用于BD并点AC