计算机图形学常用算法及代码大全

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2。1。1 生成直线的DDA算法

数值微分法即DDA法(Digital Differential Analyzer),是一种基于直线的微分方程来生成直线的方法.

一、直线DDA算法描述:

设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得

= m =直线的斜率(2-1)可通过计算由x方向的增量△x引起y的改变来生成直线:

x i+1=x i+△x (2-2)

y i+1=y i+△y=y i+△x·m (2-3) 也可通过计算由y方向的增量△y引起x的改变来生成直线:

y i+1=y i+△y (2-4)

x i+1=x i+△x=x i+△y/m (2-5) 式(2-2)至(2-5)是递推的.

二、直线DDA算法思想:

选定x2-x1和y2-y1中较大者作为步进方向(假设x2-x1较大),取该方向上的增量为一个象素单位(△x=1),然后利用式(2-1)计算另一个方向的增量(△y=△x·m=m)。通过递推公式(2-2)至(2-5),把每次计算出的(x i+1,y i+1)经取整后送到显示器输出,则得到扫描转换后的直线。

之所以取x2-x1和y2-y1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。

另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还是负值。

三、直线DDA算法实现:

1、已知直线的两端点坐标:(x1,y1),(x2,y2)

2、已知画线的颜色:color

3、计算两个方向的变化量:dx=x2-x1

dy=y2-y1

4、求出两个方向最大变化量的绝对值:

steps=max(|dx|,|dy|)

5、计算两个方向的增量(考虑了生成方向):

xin=dx/steps

yin=dy/steps

6、设置初始象素坐标:x=x1,y=y1

7、用循环实现直线的绘制:

for(i=1;i〈=steps;i++)

{putpixel(x,y,color);/*在(x,y)处,以color色画点*/

x=x+xin;

y=y+yin;

}

五、直线DDA算法特点:

该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。

//@brief 浮点数转整数的宏

实现代码

#define FloatToInteger(fNum) ((fNum〉0)?static_cast〈int〉

(fNum+0.5):static_cast(fNum-0。5))

/*!

*@brief DDA画线函数

*

* @param pDC [in]窗口DC

*@param BeginPt [in]直线起点

*@param EndPt [in]直线终点

* @param LineCor [in]直线颜色

* @return 无

*/

void CDrawMsg::DDA_DrawLine(CDC *pDC,CPoint &BeginPt,CPoint &EndPt,COLORREF LineCor)

l ong YDis = (EndPt。y — BeginPt.y);

l ong XDis = (EndPt。x—BeginPt.x);

l ong MaxStep = max(abs(XDis),abs(YDis)); // 步进的步数

f loat fXUnitLen = 1.0f;// X方向的单位步进

f loat fYUnitLen = 1。0f; // Y方向的单位步进

f YUnitLen = static_cast(MaxStep);

f XUnitLen = static_cast〈float〉(XDis)/static_cast(MaxStep);

// 设置起点像素颜色

p DC—〉SetPixel(BeginPt.x,BeginPt.y,LineCor);

f loat x = static_cast

f loat y = static_cast

// 循环步进

f or (lon

g i = 1;i〈=MaxStep;i++)

{

x = x + fXUnitLen;

y = y + fYUnitLen;

pDC—〉SetPixel(FloatToInteger(x),FloatToInteger(y),LineCor);

}

}

2。1.2 生成直线的B resenham算法

从上面介绍的DDA算法可以看到,由于在循环中涉及实型数据的加减运算,因此直线的生成速度较慢。

在生成直线的算法中,B resenham算法是最有效的算法之一。B resenham算法是一种基于误差判别式来生成直线的方法。

一、直线Bresenham算法描述:

它也是采用递推步进的办法,令每次最大变化方向的坐标步进一个象素,同时另一个方向的坐标依据误差判别式的符号来决定是否也要步进一个象素.

我们首先讨论m=△y/△x,当0≤m≤1且x1〈x2时的B resenham算法。从DDA直线算法可知这些条件成立时,公式(2-2)、(2-3)可写成:

x i+1=x i+1 (2-6)

y i+1=y i+m(2-7)

有两种B resenham算法思想,它们各自从不同角度介绍了B resenham算法思想,得出的误差判别式都是一样的。

相关文档
最新文档