按 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;
}
我的问题:
- 我们如何依靠 Y 顺序来判断中间顶点是左还是右?这真的很令人困惑,因为排序只对 Y 进行,没有提到 X。
- 显然,存在
BottomCompare
和MiddleCompare
变量来实现比较。在比较的前半部分('if'),MiddleCompare
等于 Middle
而 BottomCompare
等于 Bottom
。但是在后半部分('else')当Bottom
等于0
时,BottomCompare
等于3
,当MiddleCompare
等于3
时Middle
等于 0
。这是为什么?
你缺少的是:
多边形缠绕法则
triangle/polygon 的顶点应按特定顺序 CW/CCW.
你应该为线而不是点决定目标侧。
判断单点是错误的,因为有些点在两侧。
例如如果:
- 顺序是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 向量的右侧):
我正在阅读 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。
- 显然,存在
BottomCompare
和MiddleCompare
变量来实现比较。在比较的前半部分('if'),MiddleCompare
等于Middle
而BottomCompare
等于Bottom
。但是在后半部分('else')当Bottom
等于0
时,BottomCompare
等于3
,当MiddleCompare
等于3
时Middle
等于0
。这是为什么?
你缺少的是:
多边形缠绕法则
triangle/polygon 的顶点应按特定顺序 CW/CCW.
你应该为线而不是点决定目标侧。
判断单点是错误的,因为有些点在两侧。
例如如果:
- 顺序是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 向量的右侧):