Bresenham画线算法

Bresenham直线算法是计算机图形学中绘制直线的一种经典算法。

该算法的迭代公式:
Bresenham画线算法_第1张图片
完整代码:
实现0

#include
void lineBres(int x1, int y1, int x2, int y2)
{
 int dx = abs(x2 - x1);    //dx的绝对值
 int dy = abs(y2 - y1);    //dy的绝对值
 int p = 2 * dy - dx;      //定义初始值
 int twody = 2 * dy, twodxdy = 2 * (dy - dx);
 int x, y;      //当前位置
 int xEnd;      //结束x
 if (x1 > x2) { x = x2; y = y2; xEnd = x1; }     //保证直线方向是从左到右
 else { x = x1; y = y1; xEnd = x2; }
 glVertex2i(x, y);    //画出第一个点
 while (x < xEnd) {
  x++;
  if (p < 0) p += twody;
  else {
   y++;
   p += twodxdy;
  }
  glVertex2i(x, y);
 }
}
void display(void) {
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(0.0, 0.0f, 1.0f);     //设置当前颜色为蓝色
 glBegin(GL_POINTS);     //GL_POINTS :把每一个顶点作为一个点进行处理
 lineBres(20, 20, 200, 300);
 glEnd();
 glFlush();
}
int main(int argc, char *argv[])
{
 glutInit(&argc, argv);   //初始化 GLUT 库
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  //设置初始显示模式
 glutInitWindowPosition(50, 50); //设置初始窗口的位置
 glutInitWindowSize(400, 400); //设置初始窗口的大小
 glutCreateWindow("Bresenham算法画直线");
 glMatrixMode(GL_PROJECTION);//对投影矩阵堆栈应用随后的矩阵操
 glLoadIdentity();        //将当前变换矩阵替换为单位矩阵
 gluOrtho2D(0.0, 400.0, 0.0, 400.0); //定义二维正视投影矩阵
 glutDisplayFunc(display);
 glutMainLoop();
 return 0;
}

运行结果:
Bresenham画线算法_第2张图片

你可能感兴趣的:(Bresenham画线算法)