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

时间: 2024-10-06 01:09:52

《图形学》实验七:中点Bresenham算法画椭圆的相关文章

《图形学》实验六:中点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 R 8 7 8 void Init() //其它初始化 9 { 10 glClearColor(1.0f,1.0f,1.0f,1.0f); //设置背景颜色,完全不透明 11 glColor3f

《图形学》实验四:中点Bresenham算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: 1 //中点Bresenham算法生成直线 2 #include <gl/glut.h> 3 #include <math.h> 4 5 #define WIDTH 500 //窗口宽度 6 #define HEIGHT 500 //窗口高度 7 #define DRAWLINE1 MidpointBresenham(100,200,200,100); //画直线 8

《图形学》实验五:改进的Bresenham算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: 1 //中点Bresenham算法生成直线 2 #include <gl/glut.h> 3 #include <math.h> 4 5 #define WIDTH 500 //窗口宽度 6 #define HEIGHT 500 //窗口高度 7 #define DRAWLINE ProBresenham(100,100,400,400); //画直线 8 9 #pr

中点Bresenham算法光栅化画直线(个人总结精简版)代码超短!速度极快!

中点Bresenham算法光栅化画直线,每次只位移一个像素,精度高!此源码借助直线 y=x 做了一些转换,简化了主位移的处理,每次移动只需要 加减操作, 不需要乘除!速度极快!! 原理在最后,下面先贴上核心代码~ void Bresenham_LineTo(CDC *pDC, int x1, int y1, int x2, int y2) //中点Bresenham算法光栅化画直线 { float k = 1.0*(y2 - y1) / (x2 - x1); //斜率 int flag = 0;

「图形学」直线扫描——Bresenham算法改进了中点Bresenham算法?

前言 博主目前在学习<计算机图形学基础>这本书,使用的是第二版. 此书第五章开始讲解基本图形生成算法. 在5.1.3 Bresenham算法中,如是写到: 虽然中点Bresenham算法是一种效率非常高的算法,但也还有改进的余地. 而后,开始介绍Bresenham算法. 思考 然而通过学习和理解,博主发现这两种算法的原理完全相同: 每次在最大位移方向上走一步,而另一个方向上走步还是不走步取决于误差项的判别. 于是博主产生了疑问: Bresenham算法真的改进了中点Bresenham算法吗?

Assignment 3 在OpenGL中使用Bresenham算法画圆

一.      任务目标 利用OpenGL,实现Bresenham算法画圆. 二.      任务要求 使用整数来确定点的位置. 标出圆心.(不太明白show的含义,于是我在圆心处画了一个点来表示.) 使用至少16个点表示一个圆. 三.      使用平台 Windows 8.1 Visual Studio 2012 四.      实现简述 与Bresenham直线算法类似,采用的是中点画圆算法. 定义圆的一个函数 可根据f(x, y)符号判断点(x, y)的位置: 于是假设点pi(xi, y

《图形学》实验三:DDA算法画直线

开发环境: VC++6.0,OpenGL 实验内容: 使用DDA算法画直线. 实验结果: 代码: 1 #include <gl/glut.h> 2 #include <math.h> 3 4 #define WIDTH 500 //窗口宽度 5 #define HEIGHT 500 //窗口高度 6 7 #define DRAWLINE1 DDALine(100,200,200,100); //画直线 8 #define DRAWLINE2 DDALine(200,100,450,

Bresenham算法画填充圆及SDL代码实现

画圆是计算机图形操作中一个非常重要的需求.普通的画圆算法需要大量的浮点数参与运算,而众所周知,浮点数的运算速度远低于整形数.而最终屏幕上影射的像素的坐标均为整形,不可能是连续的线,所以浮点数运算其实纯属浪费.下面介绍的Bresenham算法就是根据上文的原理设计.该算法原应用于直线的绘制,但由于圆的八分对称性,该算法也适用与圆(曲线图形)的绘制. 该算法主要是这样的原理:找出一个1/8的圆弧,用快速的增量计算找出下一个点.同时利用圆的八分对称性,找出8个点(包括该点),进行绘制. 这里给出示例的

计算机图形学 - 圆的中点生成算法验证

算法描述: 圆的中点生成算法 如果我们构造函数 F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 . 与中点画线法一样,构造判别式: d=F(M)=F(xp+1,yp-0.5)=(xp+1)2+(yp-0.5)2-R2 若d<0,则应取P1为下一像素,而且再下一像素的判别式为: d=F(xp+2,yp-0.5)=(xp+2)2+(yp-0.5)2-R2=d+2xp+3 若d≥0,则应取P2为下一像素,而且下一像