《图形学》实验七:中点Bresenham算法画椭圆

开发环境:

VC++6.0,OpenGL

实验内容:

使用中点Bresenham算法画椭圆。

实验结果:

《图形学》实验七:中点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

你可能感兴趣的:(res)