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 ",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("请输入直线的起始点坐标,结束坐标: "); 133 scanf("%d%d%d%d",&x,&y,&endx,&endy); 134 Spoint(); 135 init(); //初始化数据 136 glutDisplayFunc(&myDisplay); //调用函数 137 glutMainLoop(); //开始程序 138 return 0; 139 }