第一个是DDA直线扫描算法,其基本思想是根据直线的点斜式来实现
第二个是重点画线算法,其基本思想是直线的一般方程ax+by+c=0
第三个是Bresenham算法
三个算法的共同特点是都使用了增量的思想
#include <GL/glut.h>
#include <stdio.h>
void DDAlien(int x1, int y1, int x2, int y2)
{
int x;
float dx, dy,k,y;
dy = y2 - y1;
dx = x2 - x1;
k = dy / dx;
y = y1;
glBegin(GL_POINTS);
for (x = x1; x <= x2; x++)
{
//drawPixels(x, int(y + 0.5), color);
glColor3i(1, 0, 0);
glVertex2i(x, int(y + 0.5));
y = y + k;
}
glEnd();
}
void MidpointLine(int x1, int y1, int x2, int y2)
{
int a, b, d1, d2, d, x, y;
a = y1 - y2;
b = x2 - x1;
d = 2 * a + b;
d1 = a * 2;
d2 = 2 * (a + b);
x = x1;
y = y1;
glBegin(GL_POINTS); // 开始绘制线段
// 画线
glColor3i(255, 0, 0);
glVertex2i(x, y);
while (x <= x2)
{
if (d < 0)
{
// 画线 (x++,y++)
x++;
y++;
d += d2;
}
else
{
// 画线(x++,y)
x++;
d += d1;
}
// 画线
glColor3i(255, 0, 0);
glVertex2i(x, y);
}
glEnd(); // 结束绘制线段
}
// 用整数代理浮点数运算提高效率
void BresenHamline(int x1, int y1, int x2, int y2)
{
glBegin(GL_POINTS);
int x, y, dx, dy, e;
dx = x2 - x1;
dy = y2 - y1;
e = -dx;
x = x1;
y = y1;
while (x <= x2)
{
glColor3i(255, 0, 0);
glVertex2i(x, y);
x++;
e += 2 * dy;
if (e >= 0)
{
y++;
e = e - 2 * dx;
}
}
glEnd();
}
void myDisplay(void)
{
glClearColor(1.0, 1.0, 1.0, 1.0); // 设置清除颜色为白色
glClear(GL_COLOR_BUFFER_BIT);
//glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
//DDAlien(0,0,100,100,1);
//MidpointLine(100, 100, 300, 300);
BresenHamline(100, 100, 300, 300);
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("第一个OpenGL程序");
glutDisplayFunc(&myDisplay);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 400, 0, 400, -1, 1); // 设置投影矩阵
glMatrixMode(GL_MODELVIEW);
glutMainLoop();
return 0;
}