这里不仔细讲原理,只是把我写的算法发出来,跟大家分享下,如果有错误的话,还请大家告诉我,如果写的不好,也请指出来,一起讨论进步。

算法步骤:

(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),否则结束。

下面是算法:

  1. #include <GL/freeglut.h>
  2. void init (void)
  3. {
  4. glClearColor (0.0f, 0.0f, 0.0f, 1.0f);
  5. }
  6.  
  7. void drawEllipse (int a, int b, int xLoc, int yLoc)
  8. {
  9. glPushMatrix ();
  10. int x, y;
  11. float d1, d2, aa, bb;
  12. aa = a * a;
  13. bb = b * b;
  14. d1 = bb + aa * (-b + 0.25);
  15. glTranslatef ((GLfloat) xLoc, (GLfloat) yLoc, 0.0f);
  16. x = 0;
  17. y = b;
  18. glBegin (GL_POINTS);
  19. glVertex2i ( x, y);
  20. glVertex2i (-x, y);
  21. glVertex2i (-x, -y);
  22. glVertex2i ( x, -y);
  23. while (bb * (x + 1) < aa * (y - 0.5))
  24. {
  25. if (d1 <= -0.000001)
  26. {
  27. d1 += bb * ((x << 1) + 3);
  28.  
  29. }
  30. else
  31. {
  32. d1 += bb * ((x << 1) + 3) + aa * (2 - (y << 1));
  33. -- y;
  34. }
  35. ++ x;
  36. glVertex2i ( x, y);
  37. glVertex2i (-x, y);
  38. glVertex2i (-x, -y);
  39. glVertex2i ( x, -y);
  40. }
  41. d2 = bb * (0.25 * x) + aa * (1 - (y << 1));
  42. while (y > 0)
  43. {
  44. if (d2 <= -0.000001)
  45. {
  46. ++ x;
  47. d2 += bb * ((x + 1) << 1) + aa * (3 - (y << 1));
  48. }
  49. else
  50. {
  51. d2 += aa * (3 - (y << 1));
  52. }
  53. -- y;
  54. glVertex2i ( x, y);
  55. glVertex2i (-x, -y);
  56. glVertex2i (-x, y);
  57. glVertex2i ( x, -y);
  58. }
  59. glEnd ();
  60. glPopMatrix ();
  61. }
  62.  
  63. void display (void)
  64. {
  65. glClear (GL_COLOR_BUFFER_BIT);
  66. glLoadIdentity ();
  67. glColor3f (1.0f, 0.0f, 0.0f);
  68. // draw a ellipse
  69. drawEllipse (200, 300, 50, 50);
  70. glutSwapBuffers ();
  71. }
  72.  
  73. void reshape (int w, int h)
  74. {
  75. glViewport (0, 0, (GLsizei) w, (GLsizei) h);
  76. glMatrixMode (GL_PROJECTION);
  77. glLoadIdentity ();
  78. if (w <= h)
  79. {
  80. gluOrtho2D (-600.0, 600.0, -600.0 * (GLfloat) h / (GLfloat) w, 600.0 * (GLfloat) h / (GLfloat) w);
  81. }
  82. else
  83. {
  84. gluOrtho2D (-600.0 * (GLfloat) w / (GLfloat) h,600.0 * (GLfloat) w / (GLfloat) h, -600.0, 600.0);
  85. }
  86. glMatrixMode (GL_MODELVIEW);
  87. glLoadIdentity ();
  88. }
  89. void keyboard (unsigned char key, int x, int y)
  90. {
  91. switch (key)
  92. {
  93. case 27: // 'VK_ESCAPE'
  94. exit (0);
  95. break;
  96. default:
  97. break;
  98. }
  99. }
  100. int main (int argc, char ** argv)
  101. {
  102. glutInit (&argc, argv);
  103. glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
  104. glutInitWindowSize (600, 600);
  105. glutCreateWindow ("Bresenham ellipse");
  106. init ();
  107. glutReshapeFunc (reshape);
  108. glutDisplayFunc (display);
  109. glutKeyboardFunc (keyboard);
  110. glutMainLoop ();
  111. return 0;
  112. }

Bresenham画椭圆算法的更多相关文章

  1. Bresenham画线算法

    [Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 通过lower与upper的差,可以知道哪一个点更接近线段: 参考:<计算机图形 ...

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

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...

  3. Bresenham直线算法与画圆算法

    在我们内部开发使用的一个工具中,我们需要几乎从 0 开始实现一个高效的二维图像渲染引擎.比较幸运的是,我们只需要画直线.圆以及矩形,其中比较复杂的是画直线和圆.画直线和圆已经有非常多的成熟的算法了,我 ...

  4. Bresenham画直线,任意斜率

    function DrawLineBresenham(x1,y1,x2,y2) %sort by x,sure x1<x2. if x1>x2 tmp=x1; x1=x2; x2=tmp; ...

  5. 两种画线算法(DDA&Bersenham)

    DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = ...

  6. 计算机图形学DDA画线法+中点画线法+Bresenham画线法

    #include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...

  7. Bresenham快速画直线算法

    现在的计算机的图像的都是用像素表示的,无论是点.直线.圆或其他图形最终都会以点的形式显示.人们看到屏幕的直线只不过是模拟出来的,人眼不能分辨出来而已.那么计算机是如何画直线的呢,其实有比较多的算法,这 ...

  8. Canvas画椭圆的方法

    虽然标题是画椭圆,但是我们先来说说Canvas中的圆 相信大家对于Canvas画圆都不陌生   oGC.arc(400, 300, 100, 0, 2*Math.PI, false); 如上所示,直接 ...

  9. [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)

    上一节链接:http://www.cnblogs.com/zjutlitao/p/4116783.html 前言: 在上一节中我们已经大致介绍了该软件的是什么.可以干什么以及界面的大致样子.此外还详细 ...

随机推荐

  1. 使用three.js实现机器人手臂的运动效果

    Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.你可以在它的主页上看到许多精彩的演示.不过,这款引擎目前还处在比较不成熟的开发阶段 ...

  2. Android Studio和eclipse混淆打包总结

    最近项目有点闲,考虑到以前的项目没有做过混淆,只是用了加固软件进行加固,为了安全性,准备给项目加上,这里做个总结,都经本人亲自在项目实践,说是为了安全性,这好像说大了,一来项目中没用到什么特别的技术, ...

  3. one plus 1(一加1)刷 kali nethunter 教程

    刚刚入手的一加1,刷成了h2os再进行的本次刷机. 用到以下资源: 链接:http://pan.baidu.com/s/1o7S0xzs 密码:2gvm 好了,开始正题,如果你的系统不是H2OS建议先 ...

  4. python基础(4):条件语句与循环语句

    今天我们看看条件语句与循环语句. 预习: 1.使用while循环输出1 2 3 4 5 6 8 9 10 2.求1-100的所有数的和 3.输出 1-100 内的所有奇数 4.输出 1-100 内的所 ...

  5. 浅谈viewport

    我们通常在写移动端页面时,往往都会在html页面中加入这样一段话 <meta name="viewport" content="width=device-width ...

  6. STL—内存的配置与释放

    上一篇我们介绍了STL对象的构造与析构,这篇介绍STL内存的配置与释放. STL有两级空间配置器,默认是使用第二级.第二级空间配置器会在某些情况下去调用第一级空间配置器.空间配置器都是在allocat ...

  7. Redis数据类型之ZSet(五)

    前言:有序集合zset跟其他类型一样,同样有几种编码方式.主要有两种编码方式,REDIS_ENCODING_ZIPLIST和REDIS_ENCODING_SKIPLIST.ziplist可以表示较小的 ...

  8. Python零基础学习系列之二--Python介绍及环境搭建

    1-1.Python简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.像P ...

  9. 服务器运行环境部署(PHP)

    1.使用的是腾讯云服务器,系统为centOS: 2.LAMP环境配置查看:https://cloud.tencent.com/document/product/213/8043: 3.mysql-se ...

  10. POJ3614 Sunscreen 优先队列+贪心

    Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her ...