c语言dda画线算法的实现,计算机图形学(二)输出图元_3_画线算法_2_DDA算法

本文详细介绍了数字微分分析仪(DDA)算法,一种用于线段扫描转换的方法。DDA算法通过计算x或y的单位间隔取样,确定线段在另一个坐标轴上的像素位置。针对不同斜率的线段,算法采用不同的取样和增量策略。虽然DDA简化了计算,但在长线段上可能会出现取整误差。为了提高性能,可以将增量分解为整数和小数部分,实现全整数计算。
摘要由CSDN通过智能技术生成

DDA算法

数字微分分析仪(digital differential analyzer, DDA)方法是一种线段扫描转换算法。基于使用等式(3.4)或等式(3.5)计算的&x或&y。

在一个坐标轴上以单位间隔对线段取样,从而确定还有一个坐标轴上最靠近线路径的相应整数值。首先考虑如图3.6所看到的的具有正斜率的线段。比如。如果斜率小于等于1。则以单位x间隔(&x = 1)取样,并逐个计算每个y值:

495831cf34999e368062fd77b9b204b6.png

下标k取整数值,从第一个点1開始递增直至最后端点。因为m能够是0与1之间的随意实数。所以计算出的y值必须取整。对于具有大于l的正斜率的线段,则交换x和y的位置。也就是以单位Y间隔(&y = 1)取样,并计算每个连续的x值:

435f4d8174186b209808c33f23711842.png

此时,每个计算出的x值要沿y扫描线舍入到近期的像素位置。 等式(3.6)和等式(3.7)基于从左端点到右端点处理线段的如果(參见图3.6)。假如这个过程中的处理方向相反。即起始端点在右側。那么&x = -1,而且

038465a88c56766320c2ac02d806b3d4.png

或者(当斜率大于1时)是&y = -1。而且

60570259a990cd02ab7fd0c4e853cebb.png

等式(3.6)和等式(3.9)也能够用来计算具有负斜率的线段的像素位置。假如斜率的绝对值小于1。而且起始端点在左側。可设置&x = 1并用等式(3.6)计算y值。当起始端点在右側(具有相同斜率)时。我们可设置&x = -1而且由等式(3.8 )得到y的位置。

相同,负斜率的绝对值大于1时,能够使用&y = -1和等式(3.9)或者&y = 1和等式(3.7)进行计算。

这个算法能够概括为以下的过程:输人线段两个端点的像素位置,端点位置间的水平和垂直差值赋给參数dx和dy。绝对值大的參数确定參数steps的值。从像素位置(x0, y0)開始,确定沿线段生成下一个像素位置的每一步所需的偏移量。并循环上述过程steps次。

假如dx的绝对值大于dy的绝对值,且x0小于xEnd。那么x和y方向的增量值分别为1和m。假如x方向的变化较大,但x0大于xEnd。那么就採用减量-1和-m来生成线段上的每个点。

在其它情况下,y方向使用单位增量(或减量),x方向使用1/m的增量(或减量)。#include

#include

inline int round(const float a) {return int (a + 0.5);}

void lineDDA(int x0,int y0,int xEnd,int yEnd){

int dx = xEnd - x0, dy = yEnd - y0,steps, k ;

float xIncrement, yIncrement,x = x0,y = y0;

if(fabs(dx)>fabs(dr))

steps = fabs(dx);

else

steps = fabs(dy);

xIncrement = float (dx) / float (steps);

yIncrement = float (dy) / float (steps);

setPixel (round(x),round(y));

for(k = 0;k

x += xIncrement;

y += yIncrement;

setPixel(round(x),round(y));

}

}

DDA方法计算像素位置要比直接使用直线方程(3.1 )计算的速度更快。

它利用光栅特性消除了直线方程(3.1 )中的乘法,而在x或Y方向使用合适的增量。从而沿线路径逐步得到各像素的位置。但在浮点增量的连续迭加中,取整误差的积累使得对于较长线段所计算的像素位置偏离实际线段。

而且该过程中的取整操作和浮点运算仍然十分耗时。我们能够通过将增量m和1/m分离成整数和小数部分,从而使全部的计算都简化为整数操作来改善DDA算法的性能。在以后将讨论用整数步长计算1

/m增量的方法。在下一节中。我们考虑既能用于直线又能用于曲线的更通用的扫描线程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值