1 / 43
文档名称:

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

格式:doc   大小:46KB   页数:43页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

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

上传人:wz_198614 2017/6/8 文件大小:46 KB

下载得到文件列表

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

文档介绍

文档介绍:------------------------------------------------------------------------------------------------ ——————————————————————————————————————计算机图形学常用算法及代码大全 生成直线的 DDA 算法数值微分法即 DDA 法(Digital Differential Analyzer) , 是一种基于直线的微分方程来生成直线的方法。一、直线 DDA 算法描述: 设(x1 , y1) 和(x2 , y2) 分别为所求直线的起点和终点坐标, 由直线的微分方程得可通过计算由 x 方向的增量△x 引起 y 的改变来生成直线: 也可通过计算由 y 方向的增量△y 引起 x 的改变来生成直线: 式(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 算法特点: 该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。//***@brief 浮点数转整数的宏实现代码#define FloatToInteger(fNum) ------------------------------------------------------------------------------------------------ ——————————————————————————————————————((fNum>0)?static_cast<int>(fNum+):static_cast<int>(fN um-)) /*! * ***@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 = ( - ); long XDis = (-); long MaxStep = max(abs(XDis),abs(YDis)); // 步进的步数 float fXUnitLen = ; //X 方向的单位步进 float fYUnitLen = ; //Y 方向的单位步进 fYUnitLen = static_cast<float>(YDis)/static_cast<float>(MaxStep); ----------------------------------------