Bresenham算法

Posted pb2016

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bresenham算法相关的知识,希望对你有一定的参考价值。

  1 /*************************************************************
  2      pb-图形学题2
  3      Bresenham算法
  4      用Bresenham算法画出0<k<1区间的直线,再对称到其它所有k
  5      斜率的直线
  6 
  7 *************************************************************/
  8 
  9 
 10 #include <GL/glut.h>
 11 #include<cstdio>
 12 #include<cmath>
 13 
 14 int x,y,endx,endy,p;
 15 
 16 void init()
 17 {
 18     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);                 //什么单缓存的东西,现在不懂什么意思,就当通用条件
 19     glutInitWindowPosition(100, 100);                            //图片出现的位置
 20     glutInitWindowSize(400, 300);                                //图片的长和宽
 21     glutCreateWindow("pb-图形学题1");                            //图片的名字
 22 
 23     glClearColor(0.0, 0.0, 0.0, 0.0);
 24     glMatrixMode(GL_PROJECTION);
 25     gluOrtho2D(-10000, 10000, -10000, 10000); 
 26 
 27     glRectf(-0.5f, -0.5f, 0.5f, 0.5f); 
 28     glClear(GL_COLOR_BUFFER_BIT);
 29     glColor3f(1.0, 0.0, 0.0);                                    //线的颜色
 30 }
 31 
 32 
 33 void setPixel (GLint x,GLint y,GLint nx,GLint ny)               //描点函数,表示从x,y到nx,ny的矩形全部涂色
 34 {
 35     glBegin(GL_LINES);
 36        glVertex2i(x, y);
 37        glVertex2i(nx,ny);
 38     glEnd();
 39 }
 40 
 41 //交换坐标。
 42 void swap(int &x,int &y)
 43 {
 44     x^=y;
 45     y^=x;
 46     x^=y;
 47 }
 48 
 49 
 50 //求k得范围,p=1表示 0<k<1; p=2表示 k>1; p=3 表示 -1<k<0; p=4表示 k<-1;
 51 //并把初始坐标映射的0<k<1。
 52 void Spoint()
 53 {
 54    if ((endx-x)*(endy-y)>0)
 55     {
 56         if (abs(endx-x)-abs(endy-y)>=0) p=1;
 57         else 
 58         {
 59             p=2;
 60             swap(x,y);
 61             swap(endx,endy);
 62         }
 63     }
 64     else
 65     {
 66            if (abs(endx-x)-abs(endy-y)>=0) 
 67            {
 68                p=3;
 69                y=-y;
 70                endy=-endy;
 71            }
 72            else 
 73            {
 74                p=4;
 75                x=-x;
 76                endx=-endx;
 77                swap(x,y);
 78                swap(endx,endy);
 79            }
 80     }
 81 }
 82 
 83 
 84 //根据k判断对称范围,再描点。
 85 void setpoint(int x0,int y0,int x1,int y1)
 86 {
 87     if (p==1) setPixel (x0,y0,x1,y1);
 88     if (p==2) setPixel (y0,x0,y1,x1);
 89     if (p==3) setPixel (x0,-y0,x1,-y1);
 90     if (p==4) setPixel (-y0,x0,-y1,x1);
 91 }
 92 
 93 //Bresenham算法。
 94 void myDisplay(void)                                             
 95 { 
 96 
 97     int dx=abs(x-endx),dy=abs(y-endy);
 98     int d=2*dy-dx;
 99     int tdy=2*dy,tdx=2*(dy-dx);
100     if (x>endx)
101     {
102         swap(x,endx);
103         swap(y,endy);
104     }
105     int x0=x,y0=y;
106     while (x<endx)
107     {
108     //    printf("****%d***%d\n",x,y);
109         x0=x+1;
110         if (d<0)
111         {
112             y0=y;
113             d+=tdy;
114         }
115         else
116         {
117             y0=y+1;
118             d+=tdx;
119         }
120         setpoint(x,y,x0,y0);
121         x=x0;
122         y=y0;
123     }
124     glFlush();                                                   //不知道什么东西,一定要写。
125  }
126 
127 
128 
129  int main(int argc, char *argv[])
130  {
131      glutInit(&argc, argv);
132      printf("请输入直线的起始点坐标,结束坐标:\n");
133      scanf("%d%d%d%d",&x,&y,&endx,&endy);
134      Spoint();
135      init();                                                     //初始化数据
136      glutDisplayFunc(&myDisplay);                                //调用函数                    
137      glutMainLoop();                                             //开始程序
138      return 0; 
139  }

 

以上是关于Bresenham算法的主要内容,如果未能解决你的问题,请参考以下文章

Bresenham 的线条绘制算法

直线光栅化-Bresenham算法

直线的中点Bresenham算法的实现

用C++如何实现bresenham画线算法?计算机图形学上面有个drawpixel的函数。不知道怎么用。

Python使用DDA算法和中点Bresenham算法画直线

bresenham算法的介绍