这篇主要讲扫描转换方法光栅化2d三角形

之前我们已经完成了线段的绘制,而三角形其实3条线段的首尾相连,所以我们只要给出三个不在同一直线的顶点就能绘制三角形

一、完善画线算法

Bresenham算法是种相对高效的算法,但目前我项目中的这一算法在顶点x坐标或y坐标相同时还无法完成绘制。所以这一情况下,我选择DDA算法取代。

如下


void DrawLine(point_t v1, point_t v2, color_t c)
{
if (v1.x == v2.x || v1.y == v2.y)
{
DrawLineDDA2d(v1, v2, c);
}
else
{
DrawLineBre(v1, v2, c);
}
}

这样一来就完成了相对高效且完全通用的画线算法

二、用画线算法绘制三角形

算法很简单,就是绘制三条首尾相连的三角形

void DrawTriangle(point_t v1, point_t v2, point_t v3,color_t c)
{
if (v1.x == v2.x&&v1.x == v3.x) return;
if (v1.y == v2.y&&v1.y == v3.y) return;
DrawLine(v1, v2,c);
DrawLine(v2, v3,c);
DrawLine(v3, v1,c);
}

接下来在重绘函数里测试代码

// 重绘函数
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT); // 清屏幕

glBegin(GL_POINTS);
point_t v1{ 10,15 };
point_t v2{ 400,405 };
point_t v3{ 100,405 };
color_t c{ 1.0,1.0,0,1.0 };//黄色
DrawTriangle(v1, v2, v3, c);
glEnd();
glFlush(); // 将所有输出到显示屏上
}

光栅渲染器(三)光栅化2D三角形_扫描转换

奇怪这个三角形怎么只有线段,好吧,我们需要填充三角形

三、通过扫描转换算法填充三角形