Bresenham画圆算法

不失一般性,假设圆的圆心位于坐标原点(如果圆心不在原点,可以通过坐标平移使其与原点重合),半径为R。以原点为圆心的圆C有四条对称轴:x = 0, y = 0, x = y和x = -y。若已知圆弧上一点P1=C(x, y),利用其对称性便可以得到关于四条对称轴的其它7个点,即:

P2=C(x,-y),

P3=C(-x, y),

P4=C(-x,-y),

P5=C(y,x),

P6=C(-y,x),

P7=C(y,-x),

P8=C(-y,-x)。

这种性质称为八对称性。

因此,只要扫描转换八分之一圆弧,就可以通过圆弧的八对称性得到整个圆。

【Bresenham算法】

简单图形的扫描转换常用算法是Bresenham算法。它的思想在于用误差量来衡量点选取的逼近程度。其过程如下:

以平面二维图形的扫描转换为例,设要画的图形方程为F(x, y)=0,要画的区域为[x0, x](不妨设x方向是最大位移方向,即△x > △y),则F(x,y) 也是一个误差度量函数,我们拿离散的点值代入如果大于0则正向偏离,否则负向偏离,等于0的情况比较少,它表示的是不偏离即恰好与真实点重合。既然x是最大位移方向,那每次对x自增1,相应的y可以选择不增或增1(或-1,具体问题具体分析),选择的方法就是d = F(x + 1, y± 0.5)的正负情况进行判断从而选择y的值。

实际情况中还要考虑到浮点数的计算问题,因为基本的图形扫描转换算法最好能够硬件实现,所以摆脱浮点数是最好的,常用的方法是对d进行递推,而不是直接由F(x,y)给出(直接给出速度会慢)。

【圆的扫描转换算法】

以画圆为例,给出圆心的坐标(0, 0)和半径R,求圆图像的最佳逼近点。

圆是中心对称的特殊图形,所以可以将圆八等分,则只须对八分之一圆孤求解,其它圆孤可以由对称变换得到,我们求的八分之一圆孤为(0, R) -(R√2,R√2),可知最大位移方向是x方向,x0 = 0, y0 = R,每次对x自增,然后判断y是否减1,直到x >= y为止(从点(0, R)到圆的八分之一处就有这种情况)。误差量由F(x, y) = x^2 + y^2 - R^2给出。

先找递推关系,若当前d = F(x + 1, y - 0.5) > 0,则y须减1,则下一d值为

d =  F(x + 2, y - 1.5) = (x + 2)^2 + (y - 1.5)^2 - R^2 = (x + 1)^2 + (x - 0.5)^2 - R^2 + 2x + 3 - 2y + 2 = d + 2x - 2y + 5,若当前d = F(x + 1, y - 0.5) < 0,则y不变,只有x增1,则下一d值为d = F(x + 2, y - 0.5) = d + 2x + 3。

d的初值,d0 = F(1, R - 0.5) = 1.25 - R,则可以对d - 0.25进行判断,因为递推关系中只有整数运算,所以d - 0.25 > 0即d > 0.25,这和d > 0等价,所以d取初值1 - R。

代码:

bool CEnginApp::DrawCircle(ScPoint point,int radius,UNINT *vb_start,intlpitch)

{if (!vb_start||lpitch<=0)return false;int mx=point.x,my=point.y;int x=0,y=radius;int r=0,g=255,b=0;int d=1-radius; //起点(0,R),下一点中点(1,R-0.5),d=1*1+(R-0.5)*(R-0.5)-R*R=1.25-R,d只参与整数运算,所以小数部分可省略

while (y>x) //y>x即第一象限的第1区八分圆

{

Plot_Pixel_32(x+mx,y+my,0,r,g,b,vb_start,lpitch);

Plot_Pixel_32(y+mx,x+my,0,r,g,b,vb_start,lpitch);

Plot_Pixel_32(-x+mx,y+my,0,r,g,b,vb_start,lpitch);

Plot_Pixel_32(-y+mx,x+my,0,r,g,b,vb_start,lpitch);

Plot_Pixel_32(-x+mx,-y+my,0,r,g,b,vb_start,lpitch);

Plot_Pixel_32(-y+mx,-x+my,0,r,g,b,vb_start,lpitch);

Plot_Pixel_32(x+mx,-y+my,0,r,g,b,vb_start,lpitch);

Plot_Pixel_32(y+mx,-x+my,0,r,g,b,vb_start,lpitch);if (d<0)

{

d=d+2*x+3;

}else{

d=d+2*(x-y)+5;

y--;

}

x++;

}return true;

}

效果图:

参考:

java用中点画圆法_Bresenham画圆算法 与中点画圆法相关推荐

  1. 【计算机图形学】小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解

    小白谈计算机图形学(二)画圆篇之中点画圆法,Bresenham画圆算法,椭圆实操,线型处理详解 引言 如何画圆 基本思想 中点画圆法 中点画圆基本思路 中点画圆改进 Bresenham画圆算法 Bre ...

  2. python3画圆、直线_Bresenham直线算法与画圆算法

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

  3. matlab八分之一中点画圆算法,中点八分画圆算法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #define W 800 #define H 600 void drawCircle(SDL_Renderer* r ...

  4. mfc 画圆算法 画椭圆算法

    mfc画圆算法 求半径:圆心一点:m_ptOrigin1,圆上一点:m_ptOrigin2 注释:这里的m_ptOrigin1,m_ptOrigin2均为Cpoint类型 R=int(sqrt(pow ...

  5. 中点Bresenham画圆算法|MFC|计算机图形学

    中点Bresenham画圆算法|MFC|计算机图形学 Bresenham中点画圆算法 计算机图形学-基本图元的生成-圆 基于学习直线的生成算法后,又展开了圆.椭圆的讲解: 此次试验是简单的MFC应用, ...

  6. Bresenham 画圆算法原理

    文章目录 前言 Bresenham 画圆算法原理 两个近似 构造判别式 圆与网格点的关系 关系由来 关系含义 pip_ipi​ 递推 画圆 程序伪码 圆与网格点的关系图示 前言 首先简要介绍一下生成圆 ...

  7. Bresenham画圆算法

    Bresenham 画圆算法适合于生成整圆,它使用8路对称法,只计算出90°~45°内的点,移动方向为+x,-y. 递推公式: 完整代码: 加上Sleep函数,减慢画圆速度,以便观察画圆过程. #in ...

  8. C语言——中点画圆算法和Bresenham画圆算法(easyx图形库)

    一.中点画圆法 首先是中点画圆法,考虑圆心在原点,半径为R的圆在第一象限内的八分之一圆弧,从点(0, R)到点(R/ , R/ )顺时针方向确定这段圆弧.假定某点Pi(xi, yi)已经是该圆弧上最接 ...

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

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

最新文章

  1. openresty开发系列35--openresty执行流程之5内容content阶段
  2. java循环队列配对_循环队列 链式队列 的jJAVA实现
  3. [SDOI2006] 保安站岗
  4. java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/FilterRegistrationBean
  5. WebDAV方式访问Exchange 2003收件箱程序
  6. NET问答: 如何取消或中止 Task 执行 ?
  7. gradle是否可以编译c语言,build.gradle按条件编译与cmake配置
  8. python 坐标轴刻度 格式_matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)...
  9. apache poi使用例_POI 与 JXL 054
  10. 介绍 SQL Server 的安全配置
  11. 无人驾驶(基于计算机视觉的高精度地图)
  12. 数学连乘和累加运算符号_2020中考数学 初中数学有理数计算(干货)
  13. 计蒜客 16876 韩梅梅的抽象画
  14. 通达信登录服务器文件夹,我也搞定了通达信交易系统多帐号登录交易!
  15. java groovy 乱码_解决Groovy复制文件的乱码
  16. 快手、抖音、微视类短视频APP源码开发SDK接入教程,7步就能搞定短视频APP开发制作
  17. biopython有什么用_Biopython介绍
  18. XtraReport打印二维码
  19. windows11便签在哪里,win11怎么新建便签
  20. Oracle分区之五:创建分区索引总结

热门文章

  1. Windows下Oracle安装图解----oracle-win-64-11g 详细安装步骤
  2. 红米手机出现内部储存空间不足的解决方法
  3. Django来敲门~第一部分【6.2 HTML视图模板】
  4. 家里有一对音箱一个功放,想连接手机,有什么好的方案?
  5. 玩火线精英显示服务器链接失败,火线精英手机版登录失败进不去解决办法
  6. 车载Camera术语大全
  7. python两个除号什么意思_python除号_python中除号_python中的除号 - 云+社区 - 腾讯云...
  8. Ableton Live 11 Suite for Mac(音乐制作软件)
  9. [git版本管理]使用Gitee配合GitKraken管理私有项目
  10. 编码速度非常慢_非 iPhone12 用户谨慎购买苹果无线充电器,速度非常慢