標籤:
開發環境:
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
《圖形學》實驗七:中點Bresenham演算法畫橢圓