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

C 将四边形转换为三角形条带的最快方法?,c,algorithm,geometry,triangulation,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), &

将由四个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);
}
编辑:我问的是如何将一个四边形转换为一个三角形条带,该条带应包含四个点。

给定一个四边形a B C D,我们可以将其拆分为B C、a C D或a B D、D B C

比较A-C和B-D的长度,并使用较短的长度作为分割边。换句话说,如果A-C较短,则使用bc,如果A-C较短,则使用cd,否则使用bd,dbc。

给定一个四元组abcd,我们可以将其拆分为bc、cd或abd、dbc

比较A-C和B-D的长度,并使用较短的长度作为分割边。换句话说,如果A-C较短,则使用bc,cd,否则使用bd,dc

定位四元w.r.t坐标的极值点。设为p,其中p是循环容器上的迭代器 检查p+2是否位于{p-1,p,p+1}形成的耳朵内。如果是,寻求极值w.r.t.其他坐标或从最小值切换到最大值,反之亦然,并重复步骤1。 通过切断极值点周围的耳朵,将四边形分割为两个三角形: t0={p-1,p,p+1}和 t1={p+1,p+2,p-1} 不需要排序,只需找到极值。如果您的四边形保证是凸实四边形,则跳过极值搜索并选择任意p

编辑:根据评论中的建议进行修改。此外,评论者建议的表述更易于实施:

给定一个四边形,a,B,C,D构成对角线AC和BD 如果点B和D位于AC的不同侧面,则AC可用于分割四边形 将相同的推理应用于BD和A点和C点 定位四元w.r.t坐标的极值点。设为p,其中p是循环容器上的迭代器 检查p+2是否位于{p-1,p,p+1}形成的耳朵内。如果是,寻求极值w.r.t.其他坐标或从最小值切换到最大值,反之亦然,并重复步骤1。 通过切断极值点周围的耳朵,将四边形分割为两个三角形: t0={p-1,p,p+1}和 t1={p+1,p+2,p-1} 不需要排序,只需找到极值。如果您的四边形保证是凸实四边形,则跳过极值搜索并选择任意p

编辑:根据评论中的建议进行修改。此外,评论者建议的表述更易于实施:

给定一个四边形,a,B,C,D构成对角线AC和BD 如果点B和D位于AC的不同侧面,则AC可用于分割四边形 将相同的推理应用于BD和A点和C点
你是在问一辆四轮马车吗?还是四边形网格?目前什么情况不适合你?如果是前者,你为什么要把一个四边形做成一个三角形的条带呢?你似乎不知道点的顺序,因为如果你知道顺序的话,创建条带是很容易的。是吗?你是在问一辆四轮马车吗?还是四边形网格?目前什么情况不适合你?如果是前者,你为什么要把一个四边形做成一个三角形的条带呢?你似乎不知道点的顺序,因为如果你知道顺序的话,创建条带是很容易的。是吗?不幸的是,这不适用于凹四边形是的,我知道这不是一个真正的四边形。例如A=0,0b=5,0c=4,1d=5,2,然后AC=SQR17 BD=SQR4,但实际上需要在较长的边上分割,否则DBC位于四边形之外。对于那些想用它来处理任何四边形的读者来说,请使用我在答案中给出的算法。适用于具有恒定时间复杂度的简单凹凸四边形,无需任何乘法或平方根。只是简单的比较。不幸的是,这不适用于凹四边形是的,我知道这不是一个真正的四边形。例如A=0,0b=5,0c=4,1d=5,2,然后AC=SQR17 BD=SQR4,但实际上需要在较长的边上分割,否则DBC位于四边形之外。对于那些想用它来处理任何四边形的读者来说,请使用我在答案中给出的算法。适用于具有恒定时间复杂度的简单凹凸四边形,无需任何乘法或平方根。只是简单的比较。一个极值点w.r.t.维度是一个四边形的顶点,其各自的坐标值为最大值或最小值。它保证是凸的。你是指位于边界框上的顶点吗?不是指四边形的顶点。这适用于任何简单多边形。我可能不清楚。您的意思是找到位于四边形边界框的一个面上的四边形顶点,使其至少一个坐标成为极值吗?如果不是,我还是不知道
理解你们所说的具有各自坐标的最大值或最小值的四边形顶点是什么意思。另外,这也适用于非平面四边形吗?我不认为这是正确的,因为极端点不一定是耳朵。例如,在2D中,我可以旋转箭头,即凹形四边形,s.t.箭头尖端处于极值,但步骤2不会给出正确的分割。更保守的方法是,首先选取一条对角线,然后测试其他两个顶点是否都位于支撑该对角线的直线的同一侧。极值点w.r.t.尺寸是具有各自坐标最大值或最小值的四边形顶点。它保证是凸的。你是指位于边界框上的顶点吗?不是指四边形的顶点。这适用于任何简单多边形。我可能不清楚。您的意思是找到位于四边形边界框的一个面上的四边形顶点,使其至少一个坐标成为极值吗?若并没有,我还是不明白你们所说的四边形顶点是什么意思,它们的坐标值是最大的还是最小的。另外,这也适用于非平面四边形吗?我不认为这是正确的,因为极端点不一定是耳朵。例如,在2D中,我可以旋转箭头,即凹形四边形,s.t.箭头尖端处于极值,但步骤2不会给出正确的分割。更保守的方法是首先拾取一条对角线,然后测试其他两个顶点是否都位于支撑该对角线的直线的同一侧。