当前位置: 首页>编程语言>正文

Bresenham的圆算法python bresenham算法画圆原理


文章目录

  • 前言
  • Bresenham 画圆算法原理
  • 两个近似
  • 构造判别式
  • 圆与网格点的关系
  • 关系由来
  • 关系含义
  • pi
  • 画圆
  • 程序伪码
  • 圆与网格点的关系图示


前言

首先简要介绍一下生成圆的方法:

  1. 直接利用圆的方程生成圆
  2. 利用圆的对称性生成圆

方法一由于会涉及到浮点运算等因素,不采取该方案。

ps. 这部分想要知道为什么可以参考 计算机图形学 圆及椭圆的扫描转换_百度文库 前面一点。

方法二的原理如下图,利用圆的对称性,我们只需要对一个八分圆进行扫描转换。

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_斜率,第1张

在这里我们不妨选择第一象限上斜率绝对值小于1的那八分圆进行扫描转换,以及假设圆心为 (0, 0) 。也就是下图。

友情提示:圆在某点的斜率是该点处切线斜率。圆心不在 (0, 0) 处的点可以通过平移得到。

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_像素点_02,第2张

Bresenham 画圆算法原理

如下图,在 0≤x≤y 的 1/8 圆周上,像素坐标 x 值单调增加,y 值单调减少。

设第 i 步已确定Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_斜率_03,第3张是要画圆上的像素点,看第 i+1 步像素点Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_04,第4张应如何确定。下一个像素点只能是Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_05,第5张或者Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_06,第6张中的一个 。

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_像素点_07,第7张

具体选哪个就得看 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_08,第8张

  1. Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_09,第9张 更小,下一个像素点就选 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_10,第10张
  2. Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_像素点_11,第11张 更小,下一个像素点就选 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_12,第12张
  3. 一样大,选哪个都行。

比较方法就是做差:Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_13,第13张,然后将结果与0进行比较。

那么问题是 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_08,第8张

两个近似

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_像素点_15,第15张

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_16,第16张

近似方法:
将 CH 近似为 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_17,第17张
将 DB 近似为 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_18,第18张

由大图显而易见可以知道 CH 和 DB 的值:
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_像素点_19,第19张
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_20,第20张

这里由于涉及到了根号运算,因此又做了一个近似:
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_21,第21张
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_22,第22张

构造判别式

我们不妨构造如下判别式
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_23,第23张
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_24,第24张
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_25,第25张

圆与网格点的关系

关系由来

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_26,第26张

圆与网格点有且仅有上述5种关系,情况分别如上:

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_27,第27张

其中的BCEF均为该网格上的中点。

首先,我们得再次强调的一点是,在 0≤x≤y 的 1/8 圆周上的每点的斜率绝对值都小于1。即它们与 x 轴负方向的倾角都不能超过图中的 FE 线段。

由于,我们现在点亮的点是 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_28,第28张 ,所以圆与 x=1 的交点应该在 BF 之间。由于此段圆弧的斜率均小于1,因此圆与 x=2 的交点应该在 CE 之间,由此上上图中的 5 条圆弧都有了解释:
圆弧1:圆与 x=1 的交点在 BP 间,且该圆斜率变化很小(半径很大)
圆弧4,5:我个人认为是在接近 y=x 这条直线处的网格可以产生这种情况

关系含义

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_26,第26张

构造判别式:Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_30,第30张

  1. 精确圆弧是③,则Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_31,第31张
    Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_像素点_32,第32张
    Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_33,第33张
  2. 若精确圆弧是①或②,显然H是应选择点,而此时Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_34,第34张,必有Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_35,第35张
  3. 若精确圆弧是④或⑤,显然D是应选择点,而此时Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_36,第36张,必有Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_37,第37张

得出结论:Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_38,第38张 做判别量,Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_39,第39张 时,选H点为下一个像素点,Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_40,第40张

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_38,第38张

因为 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_38,第38张 代表此次选择哪个点的判别式,如果我们知道下一次选点的判别式和其关系就可以节省很多思考。所以我们要从 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_38,第38张 计算 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_44,第44张
ps. 对 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_44,第44张 数学意义的解释:此次点亮的点我们称做Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_像素点_46,第46张,下一次点亮的点我们就称做 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_47,第47张Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_48,第48张 的值和 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_49,第49张 是有递推关系的(Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_50,第50张 ,见关系由来下的图)。而此次我们将判断点亮哪个点的判别式记作 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_38,第38张,类似的,下次判断点亮哪个点的判别式我们就记作 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_44,第44张
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_23,第23张
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_24,第24张
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_25,第25张

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_56,第56张
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_57,第57张

  1. Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_像素点_58,第58张 时,应选D点,此时 D 点的 y 坐标和 P 的 y 坐标的关系是 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_59,第59张,带入上式有:
    Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_斜率_60,第60张
  2. Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_35,第35张 时,应选H点,此时 H 点的 y 坐标和 P 的 y 坐标的关系是 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham的圆算法python_62,第62张,带入上式有:
    Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_Bresenham 画圆算法_63,第63张

画圆

画圆的起始点是(0, R),即 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_斜率_64,第64张,带入前式。即令 i=1 ,就得到:
Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_65,第65张
剩下的递推就行。

程序伪码

void BresenhamCircle(int R){     
	int x,y,p;
	x=0;  y=R;
	p=3-2*R;
	for(;x<=y;x++){       
		SetPixel(x,y);
		if(p>=0){
			p+=4*(x-y)+10;
			y--;
		}
		else {
			p+=4*x+6;
		}
	}
}

根据对称性,只需修改语句 SetPixel(x,y),画八个对称的点,就可以画出全部圆周。若加一个平移,就可以画出圆心在任意位置的圆周

圆与网格点的关系图示

情况一:Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_66,第66张
其中 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_67,第67张

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_斜率_68,第68张

情况五:Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_66,第66张,那条横线是 y=77.5
其中 Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_扫描转换_70,第70张

Bresenham的圆算法python bresenham算法画圆原理,Bresenham的圆算法python bresenham算法画圆原理_像素点_71,第71张

时间有限,姑且只画这俩。



https://www.xamrdz.com/lan/55m1932545.html

相关文章: