中点画圆法中,计算判别式d使用了浮点运算,影响了圆的生成效率。如果能将判别式规约到整数运算,则可以简化计算,提高效率。于是人们针对中点画圆法进行了多种改进,其中一种方式是将d的初始值由1.25 – R改成1 – R,考虑到圆的半径R总是大于2,因此这个修改不会影响d的初始值的符号,同时可以避免浮点运算。还有一种方法是将d的计算放大两倍,同时将初始值改成3 – 2R,这样避免了浮点运算,乘二运算也可以用移位快速代替,采用3 – 2R为初始值的改进算法,又称为Bresenham算法:

void Bresenham_Circle(int xc, int yc, int r){int x, y, d;x = 0;y = r;d = 3 - 2 * r;CirclePlot(xc, yc, x, y);while (x < y){if (d < 0){d = d + 4 * x + 6;}else{d = d + 4 * (x - y) + 10;y--;}x++;CirclePlot(xc, yc, x, y);}
}

通过EasyX实现:

#include <graphics.h>
#include <conio.h>// 使用 Bresenham 画圆法
void Circle_Bresenham(int x, int y, int r, int color)
{int tx = 0, ty = r, d = 3 - 2 * r;while (tx <= ty){// 利用圆的八分对称性画点putpixel(x + tx, y + ty, color);putpixel(x + tx, y - ty, color);putpixel(x - tx, y + ty, color);putpixel(x - tx, y - ty, color);putpixel(x + ty, y + tx, color);putpixel(x + ty, y - tx, color);putpixel(x - ty, y + tx, color);putpixel(x - ty, y - tx, color);if (d < 0)      // 取上面的点d += 4 * tx + 6;else         // 取下面的点d += 4 * (tx - ty) + 10, ty--;tx++;}
}// 主函数
int main()
{initgraph(640, 480);// 测试画圆Circle_Bresenham(320, 240, 200, RED);Circle_Bresenham(320, 240, 101, RED);// 按任意键退出_getch();closegraph();return 0;
}

结果如下:

参考资料:

https://blog.csdn.net/MMogega/article/details/53055625?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

https://codebus.cn/yangw/a/bresenham-s-circle-algorithm

Bresenham算法画圆相关推荐

  1. bresenham算法画圆mfc实现_kd-tree理论以及在PCL 中的代码的实现

    通过雷达,激光扫描,立体摄像机等三维测量设备获取的点云数据,具有数据量大,分布不均匀等特点,作为三维领域中一个重要的数据来源,点云主要是表征目标表面的海量点的集合,并不具备传统网格数据的几何拓扑信息, ...

  2. bresenham算法画圆c语言,bresenham画圆算法

    中点画圆算法在一个方向上取单位间隔,在另一个方向的取值由两种可能取值的中点离圆的远近而定.实际处理中,用决策变量的符号来确定象素点的选择,因此算法效率较高. 设要显示圆的圆心在原点(0,0),半径为R ...

  3. 易懂的Bresenham 布雷森汉姆算法画圆的原理与Python编程实现教程

    Bresenham 布雷森汉姆算法画圆的原理与编程实现教程 注意:Bresenham的圆算法只是中点画圆算法的优化版本.区别在于Bresenham的算法只使用整数算术,而中点画圆法仍需要浮点数.注意: ...

  4. 布兰森汉姆画圆matlab,bresenham算法画直线

    实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...

  5. 画图板-- 中点算法画圆

    为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...

  6. bresenham算法_二维光栅图形的扫描:直线的DDA、Bresenham算法与圆的生成

    数值微分DDA算法 算法原理 DDA算法是一个增量算法,每一步的x.y值是用前一步的值加上一个增量来获得的,每一步在最大位移方向上加1. 优点:算法直观.易实现 缺点:有浮点数和浮点运算,效率不高 代 ...

  7. 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆

    为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...

  8. 计算机图形学04:中点Bresenham算法画椭圆

    作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

  9. 计算机图形学E2——OpenGL Bresenham算法画直线

    其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...

最新文章

  1. 北京协和医院骨科完成中国首例机器人全膝人工关节置换手术
  2. 计算机科学AP考试,AP计算机科学A和计算机原理有什么区别
  3. activeMq初识 - 2
  4. openai-gpt_为什么到处都看到GPT-3?
  5. 使用using关键字来自动清除对象资源
  6. 78. Subsets 1
  7. FydeOS | ChromeOS配置Flutter开发环境
  8. centos php ioncube_CentOS 7安装ionCube Loader为php解密组件的方法
  9. Linux下wm8978调试指南
  10. python爬取b站搜索结果播放地址_Golang 爬虫快速入门 | 获取B站全站的视频数据
  11. 经济学中ppf计算机会成本例题,经济学中的PPF是什么
  12. S-MSCKF 论文公式推导与代码解析
  13. 菜鸟教程android数据库,Flutter - Android 菜鸟教程打包
  14. 深耕技术,与实践赛跑:一文告诉你如何稳妥快速完善区块链技术并有序推动商用​?...
  15. UnityShader学习之路(01) 漫反射
  16. 廖雪峰python视频教程-廖雪峰Python教程的配套视频教程,全套完整版!
  17. 并发与多线程相关知识点梳理
  18. 基于python3.6的马蜂窝旅行模拟登陆
  19. Wikioi 1261 龙王的礼物
  20. 整理1994-2019年各省统计指标面板数据(汇总成1张EXCEL)

热门文章

  1. PhpStorm破解版及使用教程
  2. CSS3 greyscale 实现元素转换成黑白色(灰色、置灰)
  3. 数据库Schema模式的理解——模式与数据库的区别
  4. Java如何实现文档在线预览
  5. MySQL组复制学习笔记(基于MySQL 8+) -- 使用篇
  6. 安装 webpack 的各种方法
  7. 如何建立一个强大的公关策略
  8. 坎 坎为水 坎上坎下
  9. 共享单车显示不在服务器内,注意了,共享单车可不要随便骑,这七个规定先了解了再说...
  10. 各省市考研网上确认(现场确认)时间一览