Bresenham算法画圆
中点画圆法中,计算判别式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算法画圆相关推荐
- bresenham算法画圆mfc实现_kd-tree理论以及在PCL 中的代码的实现
通过雷达,激光扫描,立体摄像机等三维测量设备获取的点云数据,具有数据量大,分布不均匀等特点,作为三维领域中一个重要的数据来源,点云主要是表征目标表面的海量点的集合,并不具备传统网格数据的几何拓扑信息, ...
- bresenham算法画圆c语言,bresenham画圆算法
中点画圆算法在一个方向上取单位间隔,在另一个方向的取值由两种可能取值的中点离圆的远近而定.实际处理中,用决策变量的符号来确定象素点的选择,因此算法效率较高. 设要显示圆的圆心在原点(0,0),半径为R ...
- 易懂的Bresenham 布雷森汉姆算法画圆的原理与Python编程实现教程
Bresenham 布雷森汉姆算法画圆的原理与编程实现教程 注意:Bresenham的圆算法只是中点画圆算法的优化版本.区别在于Bresenham的算法只使用整数算术,而中点画圆法仍需要浮点数.注意: ...
- 布兰森汉姆画圆matlab,bresenham算法画直线
实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...
- 画图板-- 中点算法画圆
为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...
- bresenham算法_二维光栅图形的扫描:直线的DDA、Bresenham算法与圆的生成
数值微分DDA算法 算法原理 DDA算法是一个增量算法,每一步的x.y值是用前一步的值加上一个增量来获得的,每一步在最大位移方向上加1. 优点:算法直观.易实现 缺点:有浮点数和浮点运算,效率不高 代 ...
- 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆
为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...
- 计算机图形学04:中点Bresenham算法画椭圆
作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...
- 计算机图形学E2——OpenGL Bresenham算法画直线
其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...
最新文章
- 北京协和医院骨科完成中国首例机器人全膝人工关节置换手术
- 计算机科学AP考试,AP计算机科学A和计算机原理有什么区别
- activeMq初识 - 2
- openai-gpt_为什么到处都看到GPT-3?
- 使用using关键字来自动清除对象资源
- 78. Subsets 1
- FydeOS | ChromeOS配置Flutter开发环境
- centos php ioncube_CentOS 7安装ionCube Loader为php解密组件的方法
- Linux下wm8978调试指南
- python爬取b站搜索结果播放地址_Golang 爬虫快速入门 | 获取B站全站的视频数据
- 经济学中ppf计算机会成本例题,经济学中的PPF是什么
- S-MSCKF 论文公式推导与代码解析
- 菜鸟教程android数据库,Flutter - Android 菜鸟教程打包
- 深耕技术,与实践赛跑:一文告诉你如何稳妥快速完善区块链技术并有序推动商用​?...
- UnityShader学习之路(01) 漫反射
- 廖雪峰python视频教程-廖雪峰Python教程的配套视频教程,全套完整版!
- 并发与多线程相关知识点梳理
- 基于python3.6的马蜂窝旅行模拟登陆
- Wikioi 1261 龙王的礼物
- 整理1994-2019年各省统计指标面板数据(汇总成1张EXCEL)