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算法画圆的更多相关文章

  1. 《图形学》实验六:中点Bresenham算法画圆

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

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

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

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

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

  4. 《图形学》实验五:改进的Bresenham算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...

  5. 《图形学》实验四:中点Bresenham算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...

  6. Python使用DDA算法和中点Bresenham算法画直线

    title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...

  7. WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...

  8. Bresenham算法画填充圆及SDL代码实现

    画圆是计算机图形操作中一个非常重要的需求.普通的画圆算法需要大量的浮点数参与运算,而众所周知,浮点数的运算速度远低于整形数.而最终屏幕上影射的像素的坐标均为整形,不可能是连续的线,所以浮点数运算其实纯 ...

  9. 基于Bresenham和DDA算法画线段

    直线:y=kx+b 为了将他在显示屏上显示出来,我们需要为相应的点赋值,那么考虑到计算机的乘法执行效率,我们肯定不会选择用Y=kx+b这个表达式求值,然后进行画线段. 我们应当是将它转化为加法运算. ...

随机推荐

  1. 汉字转拼音的vc++程序源代码

    #include "StdAfx.h" #include "MyChiToLetter.h" // Download by http://www.codefan ...

  2. typedef,static,const用法

    一.typedef主要功能是定义一个已存在类型的别名,但是和宏并存 宏与typedef区别 1.宏定义只是简单的字符串替换 2.typedef定义的类型是类型的别名,typedef后面是一个整体声明, ...

  3. CUG 数学进阶

    题目链接:http://acm.cug.edu.cn/JudgeOnline/contest.php?cid=1047 . . . I 题目链接:http://acm.cug.edu.cn/Judge ...

  4. Mysql数据库中 ,涉及事物,循环添加数据

    ),),   ) BEGIN declare cnt ; declare i ; declare growthid ; DECLARE t_error INTEGER DEFAULT ;  DECLA ...

  5. A Byte of Python 笔记(12)python 标准库:sys、os,更多内容

    第14章 python 标准库 Python标准库是随Python附带安装的,它包含大量极其有用的模块. sys 模块 sys 模块包含系统对应的功能.如 sys.argv 列表包含命令行参数. # ...

  6. Bootstrap dropdown 使用

    同样是2种方式 参考http://www.bootcss.com/javascript.html#dropdowns JS方式调用 http://www.w3resource.com/twitter- ...

  7. javascript 变量 命名规范 变量的作用域

    原文:javascript 变量 命名规范 变量的作用域 大家好,我是小强老师,今天讲解的是变量 变量 小时候我们学过  这个 应用题 :  X+1=2; 问  X 等于几?  答案是 1 对了,很聪 ...

  8. 网站流量统计系统 phpMyVisites

    phpMyVisites是一个网站流量统计系统,它能够提供非常详细的统计报告和高级图形报表.phpMyVisites不是一个Apache log分析工具,它建有自己的log.它的特点包括: 安装部署: ...

  9. Qt WebKit and HTML5 geolocation | Qt Project forums | Qt Project

    Qt WebKit and HTML5 geolocation | Qt Project forums | Qt Project Qt WebKit and HTML5 geolocation   I ...

  10. C功底挑战Java菜鸟入门概念干货(二)

    (接上篇博文:C功底挑战Java菜鸟入门概念干货(一)) 一.Java面向对象程序设计-类的基本形式 1.“类”是把事物的数据与相关的功能封装在一起,形成的一种特殊结构,用以表达对真实世界的一种抽象概 ...