開發環境:
VC++6.0,OpenGL
實驗內容:
使用中點Bresenham算法畫橢圓。
實驗結果:
代碼:
1 #include <gl/glut.h>
2
3 #define WIDTH 500
4 #define HEIGHT 500
5 #define OFFSET 15 //偏移量,偏移到原點
6 #define A 6
7 #define B 5
8
9 void Init() //其它初始化
10 { 11 glClearColor(1.0f,1.0f,1.0f,1.0f); //設置背景顏色,完全不透明
12 glColor3f(1.0f,0.0f,0.0f); //設置畫筆顏色
13
14 glMatrixMode(GL_PROJECTION); 15 glLoadIdentity(); 16 gluOrtho2D(0.0, 30.0, 0.0, 30.0); 17 glMatrixMode(GL_MODELVIEW); 18 } 19
20 void MidBresenhamEllipse(int a,int b) //中點Bresenham算法畫橢圓
21 { 22 int x,y; 23 float d1,d2; 24 x = 0;y = b; 25 d1=b*b+a*a*(-b+0.25); 26 glPointSize(5); //設置畫筆尺寸
27
28 glBegin(GL_POINTS); 29 glVertex2i(OFFSET+x,OFFSET+y); 30 glVertex2i(OFFSET-x,OFFSET-y); 31 glVertex2i(OFFSET-x,OFFSET+y); 32 glVertex2i(OFFSET+x,OFFSET-y); 33 glEnd(); 34
35 while(b*b*(x+1) < a*a*(y-0.5)){ 36 if(d1<=0){ 37 d1+=b*b*(2*x+3); 38 x++; 39 } 40 else{ 41 d1+=b*b*(2*x+3)+a*a*(-2*y+2); 42 x++; 43 y--; 44 } 45 glBegin(GL_POINTS); 46 glVertex2i(OFFSET+x,OFFSET+y); 47 glVertex2i(OFFSET-x,OFFSET-y); 48 glVertex2i(OFFSET-x,OFFSET+y); 49 glVertex2i(OFFSET+x,OFFSET-y); 50 glEnd(); 51 }//while上半部分
52 d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b; 53 while(y>0){ 54 if(d2<=0){ 55 d2+=b*b*(2*x+2)+a*a*(-2*y+3); 56 x++,y--; 57 } 58 else{ 59 d2+=a*a*(-2*y+3); 60 y--; 61 } 62 glBegin(GL_POINTS); 63 glVertex2i(OFFSET+x,OFFSET+y); 64 glVertex2i(OFFSET-x,OFFSET-y); 65 glVertex2i(OFFSET-x,OFFSET+y); 66 glVertex2i(OFFSET+x,OFFSET-y); 67 glEnd(); 68 } 69 } 70
71 void Display() 72 { 73 glClear(GL_COLOR_BUFFER_BIT); //清空顏色堆棧
74
75 MidBresenhamEllipse(A,B); //畫一個半徑為8的橢圓
76
77 glFlush(); //清空緩沖區指令
78 } 79
80 int main(int argc,char** argv) 81 { 82 glutInit(&argc,argv); 83 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化顯示模式
84 glutInitWindowSize(WIDTH,HEIGHT); //初始化窗口大小
85 glutInitWindowPosition(200,100); //初始化窗口出現位置
86 glutCreateWindow("中點Bresenham畫橢圓"); //初始化窗口標題
87
88 glutDisplayFunc(Display); //注冊顯示函數
89 Init(); //其它初始化
90 glutMainLoop(); //進入程序循環
91
92 return 0; 93 }
Freecode : www.cnblogs.com/yym2013