Bresenham画椭圆算法
这里不仔细讲原理,只是把我写的算法发出来,跟大家分享下,如果有错误的话,还请大家告诉我,如果写的不好,也请指出来,一起讨论进步。
算法步骤:
(1) 输入椭圆的长半轴a和短半轴b。
(2) 计算初始值d = b*b + a * a * (-b + 0.25), x = 0, y = b。
(3) 绘制点 (x, y)及其在四分象限上的另外3个对称点。
(4) 判断d的符号。若d <= 0,则先将d更新为d + b * b * (2 * x + 3),再将 (x, y)更新为(x+1, y);否则先将d更新为d + b * b * (2 * x + 3) + a * a (-2 * y + 2),再将(x, y)更新为(x+1, y-1)。
(5) 当b*b * (x+1) < a * a * (y - 0.5)时,重复步骤(3)和(4),否则转到步骤(6)。
(6) 用上半部分计算的最后点(x, y)来计算下半部分中d的初值: d = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1) - a * a * b * b。
(7) 绘制点(x, y)及其在四分象限上的另外3个对称点。
(8) 判断d的符号。若d <= 0,则先将d更新为d + b * b * (2 * xi + 2) + a * a * (-2 * yi + 3), 再将(x, y)更新为(x+1, y-1);否则先将d更新为d + a * a * (-2 * yi + 3),再将(x, y)更新为(x, y-1)。
(9) 当y >= 0, 重复步骤(7)和(8),否则结束。
下面是算法:
- #include <GL/freeglut.h>
- void init (void)
- {
- glClearColor (0.0f, 0.0f, 0.0f, 1.0f);
- }
- void drawEllipse (int a, int b, int xLoc, int yLoc)
- {
- glPushMatrix ();
- int x, y;
- float d1, d2, aa, bb;
- aa = a * a;
- bb = b * b;
- d1 = bb + aa * (-b + 0.25);
- glTranslatef ((GLfloat) xLoc, (GLfloat) yLoc, 0.0f);
- x = 0;
- y = b;
- glBegin (GL_POINTS);
- glVertex2i ( x, y);
- glVertex2i (-x, y);
- glVertex2i (-x, -y);
- glVertex2i ( x, -y);
- while (bb * (x + 1) < aa * (y - 0.5))
- {
- if (d1 <= -0.000001)
- {
- d1 += bb * ((x << 1) + 3);
- }
- else
- {
- d1 += bb * ((x << 1) + 3) + aa * (2 - (y << 1));
- -- y;
- }
- ++ x;
- glVertex2i ( x, y);
- glVertex2i (-x, y);
- glVertex2i (-x, -y);
- glVertex2i ( x, -y);
- }
- d2 = bb * (0.25 * x) + aa * (1 - (y << 1));
- while (y > 0)
- {
- if (d2 <= -0.000001)
- {
- ++ x;
- d2 += bb * ((x + 1) << 1) + aa * (3 - (y << 1));
- }
- else
- {
- d2 += aa * (3 - (y << 1));
- }
- -- y;
- glVertex2i ( x, y);
- glVertex2i (-x, -y);
- glVertex2i (-x, y);
- glVertex2i ( x, -y);
- }
- glEnd ();
- glPopMatrix ();
- }
- void display (void)
- {
- glClear (GL_COLOR_BUFFER_BIT);
- glLoadIdentity ();
- glColor3f (1.0f, 0.0f, 0.0f);
- // draw a ellipse
- drawEllipse (200, 300, 50, 50);
- glutSwapBuffers ();
- }
- void reshape (int w, int h)
- {
- glViewport (0, 0, (GLsizei) w, (GLsizei) h);
- glMatrixMode (GL_PROJECTION);
- glLoadIdentity ();
- if (w <= h)
- {
- gluOrtho2D (-600.0, 600.0, -600.0 * (GLfloat) h / (GLfloat) w, 600.0 * (GLfloat) h / (GLfloat) w);
- }
- else
- {
- gluOrtho2D (-600.0 * (GLfloat) w / (GLfloat) h,600.0 * (GLfloat) w / (GLfloat) h, -600.0, 600.0);
- }
- glMatrixMode (GL_MODELVIEW);
- glLoadIdentity ();
- }
- void keyboard (unsigned char key, int x, int y)
- {
- switch (key)
- {
- case 27: // 'VK_ESCAPE'
- exit (0);
- break;
- default:
- break;
- }
- }
- int main (int argc, char ** argv)
- {
- glutInit (&argc, argv);
- glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
- glutInitWindowSize (600, 600);
- glutCreateWindow ("Bresenham ellipse");
- init ();
- glutReshapeFunc (reshape);
- glutDisplayFunc (display);
- glutKeyboardFunc (keyboard);
- glutMainLoop ();
- return 0;
- }
Bresenham画椭圆算法的更多相关文章
- Bresenham画线算法
[Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 通过lower与upper的差,可以知道哪一个点更接近线段: 参考:<计算机图形 ...
- 《图形学》实验七:中点Bresenham算法画椭圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...
- Bresenham直线算法与画圆算法
在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...
- Bresenham画直线,任意斜率
function DrawLineBresenham(x1,y1,x2,y2) %sort by x,sure x1<x2. if x1>x2 tmp=x1; x1=x2; x2=tmp; ...
- 两种画线算法(DDA&Bersenham)
DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = ...
- 计算机图形学DDA画线法+中点画线法+Bresenham画线法
#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...
- Bresenham快速画直线算法
现在的计算机的图像的都是用像素表示的,无论是点.直线.圆或其他图形最终都会以点的形式显示.人们看到屏幕的直线只不过是模拟出来的,人眼不能分辨出来而已.那么计算机是如何画直线的呢,其实有比较多的算法,这 ...
- Canvas画椭圆的方法
虽然标题是画椭圆,但是我们先来说说Canvas中的圆 相信大家对于Canvas画圆都不陌生 oGC.arc(400, 300, 100, 0, 2*Math.PI, false); 如上所示,直接 ...
- [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)
上一节链接:http://www.cnblogs.com/zjutlitao/p/4116783.html 前言: 在上一节中我们已经大致介绍了该软件的是什么.可以干什么以及界面的大致样子.此外还详细 ...
随机推荐
- 使用three.js实现机器人手臂的运动效果
Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.你可以在它的主页上看到许多精彩的演示.不过,这款引擎目前还处在比较不成熟的开发阶段 ...
- Android Studio和eclipse混淆打包总结
最近项目有点闲,考虑到以前的项目没有做过混淆,只是用了加固软件进行加固,为了安全性,准备给项目加上,这里做个总结,都经本人亲自在项目实践,说是为了安全性,这好像说大了,一来项目中没用到什么特别的技术, ...
- one plus 1(一加1)刷 kali nethunter 教程
刚刚入手的一加1,刷成了h2os再进行的本次刷机. 用到以下资源: 链接:http://pan.baidu.com/s/1o7S0xzs 密码:2gvm 好了,开始正题,如果你的系统不是H2OS建议先 ...
- python基础(4):条件语句与循环语句
今天我们看看条件语句与循环语句. 预习: 1.使用while循环输出1 2 3 4 5 6 8 9 10 2.求1-100的所有数的和 3.输出 1-100 内的所有奇数 4.输出 1-100 内的所 ...
- 浅谈viewport
我们通常在写移动端页面时,往往都会在html页面中加入这样一段话 <meta name="viewport" content="width=device-width ...
- STL—内存的配置与释放
上一篇我们介绍了STL对象的构造与析构,这篇介绍STL内存的配置与释放. STL有两级空间配置器,默认是使用第二级.第二级空间配置器会在某些情况下去调用第一级空间配置器.空间配置器都是在allocat ...
- Redis数据类型之ZSet(五)
前言:有序集合zset跟其他类型一样,同样有几种编码方式.主要有两种编码方式,REDIS_ENCODING_ZIPLIST和REDIS_ENCODING_SKIPLIST.ziplist可以表示较小的 ...
- Python零基础学习系列之二--Python介绍及环境搭建
1-1.Python简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.像P ...
- 服务器运行环境部署(PHP)
1.使用的是腾讯云服务器,系统为centOS: 2.LAMP环境配置查看:https://cloud.tencent.com/document/product/213/8043: 3.mysql-se ...
- POJ3614 Sunscreen 优先队列+贪心
Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her ...