基于Bresenham算法画圆
bresenham算法画圆思想与上篇 bresenham算法画线段 思想是一致的
画圆x^2+y^2=R^2
将他分为8个部分,如上图
1.
只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这个圆
X变化从0->R
那为什么不采用从-R->R呢,
Y=+-sqrt(R^2-x^2);
dy/dx=-x/(sqrt(R^2-x^2)) =-x/y
所以采用从-R到R,每次横坐标增1,计算量大,而且在(x=+-R,y=0)处,x的很小变化就引起了y的很大变化。
所以不是采用x从-R--->R变化。而是采用1/8画圆法。
2.
在2这1/8圆周上,x值单调增加,y值单调递减,且fabs(dx/dy)=fabs(-x/y)<=1;所以圆周上相应点的y值变化小于1.
假设当前点为(x1,y1)这下个点为(x1+1,y1)或(x1+1,y1-1)
d1=(x1+1)^2+y1^2-R^2;
d2=R^2-(x1+1)^2-(y1-1)^2;
p=d1-d2 若p>0 选点(x1+1,y1-1)否则选点(x1+1,y1)
p=2(x1+1)^2+2y1^2-2y1-2R^2+1
接下来就是求p了。
P1=3-2R(坐标为x=0,y=R)
然后仿照线段算法得出p(i+1)=p(i)+4(Xi-Yi)+10(pi>0)否则P(i+1)=p(i)+4Xi+6
这样就可以成功画出1/8圆弧了
3.接下来的问题,是剩下的部分怎么处理,
有两种方法:
方法一:存储器将前1/8的坐标存储起来,然后通过镜像求出其他圆弧坐标,调整顺序输出,即可得到。
方法二:分别求出对应的8个圆弧的算法式,一次画弧。
算法比较:前者算法比较简单,但是存储数据,需要较大的RAM,一旦在计算高精度,大半径的圆时,数据存储量就比较大,可能就需要扩充RAM。后者代码比较多,占用较多的程序存储空间。
然后从控制理论角度考虑:前者是先计算后执行,实时性比较差,后者运算和控制交叉进行。但不会减少总时间。
综上所述,当圆的精度低时,可以采用方法一。当圆精度高,半径大,或者对运动过程中实时性要求比较高时,采用方法二。
在实际的实现过程中,发现按照方法二实现,圆无法画整。因为每次后面1/8圆弧都是与前面的1/8圆弧最好一个点相接的,这样累积下来,势必造成首尾无法相接,最后是采用方法一和方法二结合实现方法二的,即画一半圆,然后利用对称性实现的【即方法一的思想】。
方法一代码实现:
方法二代码是实现:
说明:上述代码实现均是基于stm32处理器,tftLCD2.8寸屏上实现的
关于p的求法如果有疑问,可以参考上篇文章基于Bresenham和DDA算法画线段
对于屏上画点,对各坐标点赋值有疑问的可以参考这篇资料看看bresenham直线算法与画圆算法
下面两幅图,是方法二实现的两种比较,如果采用单一的 画8个圆弧,会出现累积误差,圆无法闭合。
图1
图 2
基于Bresenham算法画圆的更多相关文章
- 《图形学》实验六:中点Bresenham算法画圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...
- 【转】【OPenGL】OPenGL 画图板-- 中点算法画圆
为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置). 圆心位于原点的圆有四条对称轴x=0,y= ...
- 《图形学》实验七:中点Bresenham算法画椭圆
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...
- 《图形学》实验五:改进的Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...
- 《图形学》实验四:中点Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...
- Python使用DDA算法和中点Bresenham算法画直线
title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...
- WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...
- Bresenham算法画填充圆及SDL代码实现
画圆是计算机图形操作中一个非常重要的需求.普通的画圆算法需要大量的浮点数参与运算,而众所周知,浮点数的运算速度远低于整形数.而最终屏幕上影射的像素的坐标均为整形,不可能是连续的线,所以浮点数运算其实纯 ...
- 基于Bresenham和DDA算法画线段
直线:y=kx+b 为了将他在显示屏上显示出来,我们需要为相应的点赋值,那么考虑到计算机的乘法执行效率,我们肯定不会选择用Y=kx+b这个表达式求值,然后进行画线段. 我们应当是将它转化为加法运算. ...
随机推荐
- ExtJS001HelloWorld弹窗
html页面 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...
- C++基础知识梳理--C++的6个默认函数
C++有六个默认函数:分别是 1.default构造函数; 2.默认拷贝构造函数; 3.默认析构函数; 4.赋值运算符; 5.取值运算符; 6.取值运算符const; // 这两个类的效果相同 cla ...
- js常用的一些正则验证文本框
只允许输入数字和-onKeyUp="value=value.replace(/[^-\d]/g,'')" onafterpaste="value=value.replac ...
- HDU1257-最少拦截系统
描述: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来 ...
- centos6.5 升级python 到 python 2.7.11 安装 pip
1.首先官方下载源码,然后安装(./configure,make all,make install,make clean,make distclean) 注意:需要先安装zlib-devel,open ...
- 获取执行计划——EXPLAN PLAN
一般获取执行计划有四种途径:1.执行explain plan,查询结果输出表.2.查询动态性能视图,它显示缓存在库缓存中的执行计划(有时查不出结果是因为执行计划已经不在库缓存中).3.查询AWR或St ...
- [cocos2d-x] 让精灵响应触摸 并把方向旋转到相对应的角度
在cocos2d-x里面 想要把一个精灵从原位置移动到用户所触摸到的点 , 并且把精灵的方向旋转相对应的弧度,可以参考一下我的做法 我这里的精灵是用一条鱼, 用户触摸后鱼就移动到所触摸的点, 并且移 ...
- poj 3422 Kaka's Matrix Travels 费用流
题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...
- 转: css3动画简介以及动画库animate.css的使用
~~~ transition animation 和 animate.css 在这个年代,你要是不懂一点点css3的知识,你都不好意思说你是个美工.美你妹啊,请叫我前端工程师好不好.呃..好吧,攻城 ...
- java 值传递和引用传递。
java中 基本类型的参数传递是值传递,即前后两个方法的变量不相干,被调方法参数值改变不影响调用方法的传参数值. 引用数据类型的参数传递是 传递的是参数的地址.即被调方法修改参数值会,调用方法里会跟着 ...