Geometry 三角光栅化问题

Geometry 三角光栅化问题,geometry,polygon,fill,convention,rasterizing,Geometry,Polygon,Fill,Convention,Rasterizing,我正在尝试编写两个函数来绘制(填充的)平顶三角形和平底三角形。然而,在大部分情况下,裂缝仍然存在于共用一条边的相邻三角形之间。我使用了一种插值技术,通过这种技术,我一行一行地光栅化三角形,在每一步计算新的左、右极限。代码中解释了其中的大部分内容,但这里是总体思路(对于平底): 1) 查找dy(高度) 2) 找到从顶部点到每个底部点的dy/dx(坡度) 3) 移动到起始行(地板(顶点)),并找到初始x起点和x终点坐标 4) 移动到下一行,计算新的起点和终点限制 我应该注意到,裂缝只出现在边上连接的

我正在尝试编写两个函数来绘制(填充的)平顶三角形和平底三角形。然而,在大部分情况下,裂缝仍然存在于共用一条边的相邻三角形之间。我使用了一种插值技术,通过这种技术,我一行一行地光栅化三角形,在每一步计算新的左、右极限。代码中解释了其中的大部分内容,但这里是总体思路(对于平底):

1) 查找dy(高度)

2) 找到从顶部点到每个底部点的dy/dx(坡度)

3) 移动到起始行(地板(顶点)),并找到初始x起点和x终点坐标

4) 移动到下一行,计算新的起点和终点限制

我应该注意到,裂缝只出现在边上连接的三角形之间,而不是顶部/底部连接。我已经这么久了,我不知道该怎么做了。我认为逻辑是可靠的,可能任何裂缝都是由于浮点错误造成的。我非常感谢您的反馈

typedef无符号整数uint32;
虚线(uint32 y、uint32 x_左、uint32 x_右)//画一条水平线
结构向量2
{
浮动x,y;
};
//--------------------------------------------------------------------------------
//从上到下绘制一个平底三角形
//--------------------------------------------------------------------------------
无效绘制底部三实体(向量2 p0、向量2 p1、向量2 p2)
{
//积分顺序:
//左下角:p0
//右下角:p1
//最高点:p2
//计算dy
float dy=p2.y-p0.y;
//左右边缘的dx/dy
浮动dxdy_左=(p0.x-p2.x)/dy;
浮点dxdy_right=(p1.x-p2.x)/dy;
//因为我们在地板上开始光栅处理(p2.y)
//我们需要改变初始的x起点和x终点
//按此因素列出的职位:
浮动y_凹凸=p2.y-地板(p2.y);
//初始开始和结束x值
float xs=p2.x+dxdy_left*y_bump;//x left(开始)
浮点xe=p2.x+dxdy_right*y_bump;//x right(end)
uint32 yb=uint32(p0.y)+1;//y底部,左上角填充约定为+1
uint32 yt=uint32(p2.y);//y顶部,使用铸件代替标准::地板
//划线
对于(uint32 i=yt;i>=yb;i--)
{
//设置左右限制,使用浇铸而不是标准::地板
uint32 left=uint32(xs)+1;//+1表示左上填充约定
uint32右=uint32(xe);
//绘制线,也可以是std::fill或简单的for循环。
行(i,左,右);
//增量限制
xs+=dxdy_左;
xe+=dxdy_右;
}
}//结束:绘制底部三实体()
//--------------------------------------------------------------------------------
//从下到上绘制平顶三角形
//--------------------------------------------------------------------------------
无效绘图\u顶部\u三实体(向量2 p0、向量2 p1、向量2 p2)
{
//积分顺序:
//左上角:p0
//右上角:p1
//底线:p2
//计算dy(高度)
float dy=p0.y-p2.y;
//左右边缘的dx/dy
浮动dxdy_左=(p0.x-p2.x)/dy;
浮点dxdy_right=(p1.x-p2.x)/dy;
//寻找移位因子
浮动y_bump=ceil(p2.y)-p2.y;
//初始开始和结束x值
float xs=p2.x+dxdy_left*y_bump;//x left(开始)
浮点xe=p2.x+dxdy_right*y_bump;//x right(end)
uint32 yb=uint32(p2.y)+1;//y底部,+1表示左上填充约定
uint32 yt=uint32(p0.y);//y顶部
//划线

对于(uint32 i=yb;i浮点错误似乎很可能发生。您需要确保两条相邻边的值相同。以这种方式累积时,使用浮点值进行修复可能有点棘手。根据需要,您有两个选项:

  • 改为使用定点。这也可能更快
  • 如果透支不是问题,您可以简单地向浮点值添加足够大的ε