第一个是DDA直线扫描算法,其基本思想是根据直线的点斜式来实现
第二个是重点画线算法,其基本思想是直线的一般方程ax+by+c=0
第三个是Bresenham算法
三个算法的共同特点是都使用了增量的思想
- #include
- #include
- 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;
- }