在通过Y对三角形顶点进行排序时,知道中间顶点是左还是右?

时间:2016-04-25 00:59:14

标签: c++ sorting math rendering

我正在阅读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;
}

我的问题:

  • 我们如何依靠Y顺序判断中间顶点是左还是右?它真的很混乱,因为排序只在Y上完成,没有提到X.
  • 显然,存在BottomCompareMiddleCompare变量来实现比较。在比较的前半部分(&#39; if&#39;),MiddleCompare等于MiddleBottomCompare等于Bottom。但是当BottomCompare等于3时,下半部分(&#39;其他&#39;)Bottom等于0,而MiddleCompare等于{{1}当3等于Middle时。那是为什么?

2 个答案:

答案 0 :(得分:2)

你缺少的是:

  1. 多边形缠绕规则。

    三角形/多边形的顶点应按特定顺序 CW / CCW

  2. 您应该确定行的目标面而不是点。

    决定单点是错误的,因为双方都有一些观点。

  3. 例如,如果:

    • 订单 CW
    • x+轴正确
    • y+轴下降
    • 顶点为A,B,C

    example

    然后根据y轴的变化确定左/右侧。因此,在栅格化任何轮廓(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

答案 1 :(得分:1)

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

您似乎错过了重要部分:三角形顶点以顺时针方式编号。因此,了解Y顺序可以拒绝不可能的变体。

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

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

enter image description here