中点画线算法(计算机图形学)

0.画线算法

0.DDA(digital differential analyzer)

A.基本原理

画线时,会给出两个端点(x0,y0),(xend,yend)据此计算出斜率m,然后


从(x0,y0)开始x方向按1递增,y值按上计算,直至xi=xend。这里之所以使用上式,而不直接使用y=m*x+b计算,应该是因为上式少一次乘法运算速度更快吧。计算得到的y若不是整数,则四舍五入处理。

另外:

当m小于1时,x为主变量,x加1递增,y按上式计算;当m大于1时,y为主变量,y加1递增,x按上式计算。不知道为什么要这么做,应该是为了统一规则吧。

B.伪码

void lineDDA(int x0,int y0,int xend,int yend)
{
	int dx=xend-x0;
	int dy=yend-y0;
	int x=x0;
	int y=y0;
	int step=abs(dx)>abs(dy)?abs(dx):abs(dy);
	float incrementx=(float)dx/step;
	float incrementy=(float)dy/step;
	SetPixel(round(x),round(y));
	for(int i=0;i

C.缺陷

由于上一个点的坐标值会影响到下一个点的坐标值,不断的对坐标值取整(即使是四舍五入)也会使得整条线偏离理想直线(这个误差是积累的)。另外四舍五入取整比较耗时(这个不知如何证明)。

1.中点bresenham

相对于DDA而言:同样取值是四舍五入(理想直线点大于中点取大的,小于中点取小的),不同的是决策的式子不再是round函数,这样计算耗时相对较小;还有就是中点bresenham的每个点是理想直线点与中点比较取得近似值,它的误差不会积累,而DDA上点的值会影响到下点的值,误差会积累。

A.基本原理

中点画线算法(计算机图形学)_第1张图片

B.中点bresenham画线算法基本思路

//假设该线段位于第一象限内,且斜率为0~1之间(决定了主方向为x),设起点为(x0,y0),终点为(xend,yend) 
//根据对称性,可推导致全象限内线段
//线段为y=kx+1 
//相邻的下一点坐标不是(xi+1,yi+1),就是(xi+1,yi) 
1.画起点(x0,y0).
2.准备画下一个点。横坐标增1,判断如果到达终点,则完成。否则: 
	2.1直线(y=kx+1) 与直线(x=xi+1)的交点A (xi+1,k*(xi+1)+1)的纵坐标大于M (xi+1,yi+0.5)的纵坐标,则下一点为(xi+1,yi+1)
	2.2否则下一点为(xi+1,yi) 
3.画点
4.跳回第2步
5.结束 
 
   

C.递推

中点画线算法(计算机图形学)_第2张图片

D.伪码

void Bresenham(Node vstart,Node vend)
{
	double k=(vend.y-vstart.y)/(vend.x-vstart.x);
	double d=k-0.5;//赋初值
	int x=vstart.x;
	int y=vstart.y;
	DrawPixel(x,y);//画点 
	while(x!=vend.x)
	{
		x++;
		if(d>=0)//A-M>0,交点距离上面的点更近,A-M=0时,当然希望更快的接近终点,故选上面的点 
		{
			y++;//选择上面的点
			d=d+k-1//下下个要画的判断依据。点A与终点M的差距 
		} 
		else//A-M<0,交点距离下面的点更近 
		{
			d=d+k;
		} 
		DrawPixel(x,y);
	}
}
 
   
2.并行画线算法

np个处理器,将原本的直线分成np段,每段执行bresenham画线算法。其中每段的段长(除却最后一段):(xend-x0+(np-1))/np,此处之所以要加上(np-1),是为了保证,除完之后的  段长 * 段数 <= xend - x0。根据段长计算出每段的起终点,然后就可以按照bresenham算法画线了。

1.圆生成算法

0.基本画法

绘制等距点,等距点之间以线段链接,逼近正圆。通常会使用圆的对称性来减少三角函数的使用,用以加快绘制速度。

1.中点画圆算法

与基本画法的区别:可以采用增量方式判断和求得点坐标,无需使用三角函数和四舍五入的round函数,增加了计算速度。

A.基本思路

中点画线算法(计算机图形学)_第3张图片

B.步骤

//输入半径r和圆心(xc,yc),并得到圆周上的第一个点(x0,y0)=(0,r)(先计算圆心为0,0的八分之一的圆弧的点,再利用对称性计算其他八点,再移过去)
//计算决策参数初始值为 p0=5/4-r
//在每一个xk为止,从k=0开始测试,
//////////若pk<0,则圆心在0,0的圆的下一个点为(x[k+1],y[k]),p[k+1]=p[k]+2x[k+1]+1
//////////否则,下一个点为(x[k+1],y[k]-1),并且p[k+1]=p[k]+2x[k+1]+1-2y[k+1],其中x[k+1]=x[k]+1,y[k+1]=y[k]-1
//利用计算其他八个圆弧的对称点
//移到圆心(xc,yc)的圆上
//重复循环,直至x>=y 
C.各项证明

中点画线算法(计算机图形学)_第4张图片

2.椭圆生成算法

A.椭圆特性

中点画线算法(计算机图形学)_第5张图片

B.基本原理

基本原理跟生成圆一样,都是想要生成一个可以增量的决策式,希望通过迭代加减乘除来代替三角运算或者开根号等复杂运算,同时希望这个加减乘除又不会积累误差,导致图形严重偏离理想椭圆

中点的画法,本质还是四舍五入,做法和生成圆一样,生成函数判别式f,通过f的值的符号判断取哪个点,自增1的那个变量由斜率k来判断(其实只要同一形式就行?)。

中点画线算法(计算机图形学)_第6张图片

C.并行曲线画法

和并行直线画法相似,不再赘述

3..以上画线算法学习心得

1.以斜率k为判断决定一边自增1的变量(x或y)。

2.寻找可以叠加的判断式(决策式)用以代替四舍五入函数来选择点(增加运算速度)。一般  f  = 现实点(x(或y)自增1,y(或x)先维持不动)-  理想点,或其的其他变形(如椭圆和圆的决策式)。

3.得出位置。


你可能感兴趣的:(计算机图形学,图像处理,计算机视觉)