计算机图形学——DDA & Bresenham算法学习

一:DDA算法

(一)什么是DDA

在计算机图形中主要用来绘制直线,相对于其他算法,原理相对简单,主要是利用直线方程 y=kx+b 对任意直线进行扫描转化。

(二)DDA基本算法思想
  • 已知直线的两个端点(x0,y0) (x1,y1)
  • 确定扫描的主位移方向并计算steps=max((x1-x0),(y1-y0))
  • 分别计算x和y的偏移量dx,dy
  • 通过迭代的思想,不断更新起点的坐标
(三)DDA存在的缺陷
  • 由于取得的点是理想值,所以要将点的坐标四舍五入
  • 四舍五入操作和浮点数操作导致运算效率低下
  • 不太适合硬件生产线
(四)代码实现
void DDA_DrawLIne(int x0, int y0,int x1,int y1)
{
	double x,y,dx,dy;
	double steps;
	int color=RGB(255,0,0);
	steps=fabs(x1-x0)>fabs(y1-y0)?fabs(x1-x0):fabs(y1-y0);
	dx=(x1-x0)/steps;
	dy=(y1-y0)/steps;
	x=x0;
	y=y0;
	CDC *pDC=GetDC();
	for(int i=0;i<steps;i++)
	{
		// 对x,y分别进行四舍五入取得最佳逼近像素
		pDC->SetPixel(int(x+0.5),int(y+0.5),color);
		//更新点的坐标
		x+=dx;
		y+=dy;
	}
	ReleaseDC(pDC);
}

二:Bresenham算法

(一)什么是Bresenham

依据计算机图形学中显示器的像素点的特性,将以整数的形式对点的坐标进行计算,预估下一个点的位置,构造方程F(x,y)=y-kx-b 并将它作为判别式。

(二)Bresenham基本算法思想

依据k值的范围划分为8中情况,如下图
在这里插入图片描述
在这里插入图片描述

d0=0.5-k;                           e0=dx-2*dy
d>=0时d=d-k ; x=x+1;                e>=0e=e-2*dy; x=x+1;
d<0d=d+1-k; x=x+1; y=y+1;         e<0e=e+2*dx-2*dy; x=x+1; y=y+1;

在这里插入图片描述
在这里插入图片描述

d0=1+0.5k                        e0=2*dx+dy; (注意:dx为负值,两边同乘不等式变号)
d>=0d=d+1+k; y=y+1; x=x-1;      e<=0e=e+2*dx+2*dy; y=y+1; x=x-1;
d<0d=d+1; y=y+1;                e>0e=e+2*dx; y=y+1;

在这里插入图片描述

d0=0.5+k;                         e0=dx+2*dy;  (同样,dx为负值)
d>=0d=d+k; x=x-1;              e<=0e=e+2*dy; x=x-1;
d<0d=d+1+k; x=x-1; y=y+1;       e>0e=e+2*dx+2*dy;  x=x-1; y=y+1;

在这里插入图片描述

d0=k-0.5;                         e0=2*dy-dx;  (dx为负值)
d>=0d=d+k-1; x=x-1; y=y-1;      e<=0e=e+2*dy-2*dx; x=x-1; y=y-1;
d<0d=d+k; x=x-1;               e>0e=e+2*dy; x=x-1;

在这里插入图片描述

d0=0.5k-1;                        e0=dy-2*dx; ( dx为负值)
d>=0d=d-1; y=y-1;              e<=0e=e-2*dx; y=y-1;
d<0d=d+k-1; y=y-1; x=x-1;       e>0e=e+2*dy-2*dx; y=y-1; x=x-1;

在这里插入图片描述

d0=-1-0.5k;                       e0=-2*dx-dy;
d>=0d=d-1; y=y-1;              e>=0e=e-2*dx; y=y-1;
d<0d=d-1-k; y=y-1; x=x+1;       e<0e=e-2*dx-2*dy; y=y-1; x=x+1;

在这里插入图片描述

d0=-0.5-k;                        e0=-dx-2*dy;
d>=0d=d-1-k; x=x+1; y=y-1;      e>=0e=e-2*dx-2*dy; x=x+1; y=y-1;
d<0d=d-k; x=x+1;              e<0e=e-2*dy; x=x+1;
(三)代码实现
void Bresenham_Line(int x0, int y0, int x1, int y1)
{
	int x,y=y0;
	double k,d;
	k=(y1-y0)/(x1-x0);
	CDC *pDC=GetDC();
	d=0.5-k;
	for(x=x0;x<x1;x++)
	{
		pDC->SetPixel(x,y,RGB(255,0,0));
		if(d>=0) d=d-k;
		else{
			d=d+1-k;	
			y+=1; 
		}
	}
	ReleaseDC(pDC);
}

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值