《圖形學》實驗七:中點Bresenham算法畫橢圓


開發環境:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM