按 Y 排序三角形顶点时知道中间顶点是左还是右?

Knowing if middle vertex is left or right when sorting a triangle vertices by Y?

我正在阅读 Chris Hecker's Texture Mapping articles 并且对于我的生活我无法理解他如何使用顶点的 Y 顺序来确定中间顶点是在左边还是右边。

排序代码:

    if (Y0 < Y1)
    {
        if (Y2 < Y0)
        {
            Top = 2; Middle = 0; Bottom = 1;
            MiddleCompare = 0; BottomCompare = 1;
        }
        else
        {
            Top = 0;
            if (Y1 < Y2)
            {
                Middle = 1; Bottom = 2;
                MiddleCompare = 1; BottomCompare = 2;
            }
            else
            {
                Middle = 2; Bottom = 1;
                MiddleCompare = 2; BottomCompare = 1;
            }
        }
    }
    else
    {
        if (Y2 < Y1)
        {
            Top = 2; Middle = 1; Bottom = 0;
            MiddleCompare = 1; BottomCompare = 0;
        }
        else
        {
            Top = 1;
            if (Y0 < Y2)
            {
                Middle = 0; Bottom = 2;
                MiddleCompare = 3; BottomCompare = 2;
            }
            else
            {
                Middle = 2; Bottom = 0;
                MiddleCompare = 2; BottomCompare = 3;
            }
        }
    }

然后他写道:

if (BottomCompare > MiddleCompare)
{
    MiddleIsLeft = 0;
    Left = &TopToBottom; Right = &TopToMiddle;
}
else
{
    MiddleIsLeft = 1;
    Left = &TopToMiddle; Right = &TopToBottom;
}

我的问题:

你缺少的是:

  1. 多边形缠绕法则

    triangle/polygon 的顶点应按特定顺序 CW/CCW.

  2. 你应该为线而不是点决定目标侧。

    判断单点是错误的,因为有些点在两侧。

例如如果:

  • 顺序是CW
  • x+轴向右
  • y+轴下降
  • 顶点是A,B,C

然后你从y轴的变化决定left/right边。因此,在栅格化任何轮廓 (AB,BC,CA) 时,您会看到第一个点和最后一个点之间的 y 变化。例如 AB 行:

dy = (B.y-A.y)
if (dy> 0) right
if (dy< 0) left
if (dy==0) both

有关详细信息,请参阅相关内容 Q/A closed convex polygon filling.

编辑:Spektre的回答我来不及了,但我不想扔掉我的手绘图:)

看来你漏掉了重要的部分:三角形的顶点是按顺时针方向编号的。所以知道 Y 顺序可以拒绝不可能的变体。

*Compare 的值 3 用于提供循环顺序。

Y0 < Y1 的示例。对于顺时针顺序,点 2 可能位于标记区域之一(在 P0-P1 向量的右侧):