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

本文详细介绍了计算机图形学中的一种基本算法——DDA(Digital Differential Analyzer),用于生成直线。DDA算法基于直线的微分方程,通过计算x和y方向的增量来逐像素绘制直线。文章阐述了算法思想、实现步骤,并提供了C++代码示例。该算法虽然简单易懂,但在处理速度上相对较慢,适用于教学和理解直线生成原理。
摘要由CSDN通过智能技术生成

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

2.1.1 生成直线的DDA算法

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

一、直线DDA算法描述:

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

= m =直线的斜率

(2-1)

可通过计算由x方向的增量△x引起y的改变来生成直线:

xi+1=xi+△x

(2-2)

yi+1=yi+△y=yi+△x·m

(2-3)

也可通过计算由y方向的增量△y引起x的改变来生成直线:

yi+1=yi+△y

(2-4)

xi+1=xi+△x=xi+△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),把每次计算出的(xi+1,yi+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算法特点:

该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。#define FloatToInteger(fNum) ((fNum>0)?static_cast(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)

{

long YDis = (EndPt.y - BeginPt.y);

long XDis = (EndPt.x-BeginPt.x);

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

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

float fYUnitLen = 1.0f; // Y方向的单位步进

fYUnitLen = static_cast(YDis)/static_cast(MaxStep);

fXUnitLen = static_cast(XDis)/static_cast(MaxStep);

// 设置起点像素颜色

pDC->SetPixel(BeginPt.x,BeginPt.y,LineCor);

float x = static_cast(BeginPt.x);

float y = static_cast(BeginPt.y);

// 循环步进

for (long i = 1;i<=MaxStep;i++)

{

x = x + fXUnitLen;

y = y + fYUnitLen;

pDC->SetPixel(FloatToInteger(x),FloatToInteger(y),LineCor);

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值