图形学教案 第三章(一).doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 基本图形生成算法 图形学中许多算法是与硬件有关的。在使用光栅扫描显示器(或其它通过阵列表示的设备)时,画面其实是一组离散的点(象素),并且象素是有大小的。因此光栅扫描显示器上显示的各种几何图形,都只是近似意义上的。 另外,图形输出算法与所使用的输出设备有关,比如使用某种笔式绘图仪,它有X和Y两个走笔方向。当确定A、B两个端点位置后,画线算法应确定一个走笔方向的序列,能使画笔从A点走到B点。以下左图是算法的示意,对应的走笔序列是Δx、Δy、Δx、Δx、Δy、Δx、Δx、Δy、Δx … 。注意放大看时该图形呈现为阶梯状。右图是对同一线段使用光栅扫描显示器输出(并使用画点算法)的效果。 由于画线设备目前较少使用,我们下面介绍的两个直线算法都是基于画点设备的(如光栅扫描显示器)。它们是DDA算法和Bresenham算法。书上介绍的中点画线算法本质上和Bresenham算法一致。 3.1.1 DDA画线算法 DDA (Digital Differential Analyzer)算法 假定已知线段以P0(x0,y0)、P1(x1,y1)为两个端点,并且x0≠x1 。由解析几何公式,我们得到斜率 m =Δy/Δx ,其中Δy=y1-y0 ,Δx=x1-x0 ,直线方程为 y = m·x + B 。下面为简化问题,假定|m|=1。 (由于坡度不大,不会有连续两个点的X坐标相同) 我们的目标是找到一组像素(整数坐标)近似表示该线段。也即n个点 (xi , yi) i=0,1,… n-1 的坐标。由于斜率小于等于1,此时,可使xi+1 = xi +1。 (如果Δx0, 则xi+1 = xi -1) 如果xi不是整数,我们只要先对x0四舍五入取整,再计算每个xi 。然后有 y i+1 = round(m·x i+1 + B) = round(m·(xi +1)+ B)= round(yi + m), 这里round表示四舍五入取整运算。 当|m|1时,则应使用yi+1 = yi +1。以及 xi+1 = round(xi+ h)。 (h=1/m) 这是一种最简单直接的算法,效果也是基本可以的。下面是用C语言给出的算法描述: void LineDDA(int x0,int y0,int x1,int y1,int color) { // 从参数表定义蕴含着已知端点坐标是整数坐标,但如前所述,这不是必要的 // 这里假定x0x1,-1=m=1,如果不满足,则代码要复杂一些。 int x,y; ? float dx, dy, m; ? dx= float(x1-x0); ? dy= float(y1-y0); ? m=dy/dx; ? y=y0; ? for(x=x0; x= x1, x++) // x0x1不满足时条件要改为x=x1 { Putpixel(x, int(y+0.5), color); // int(y+0.5) 相当于四舍五入取整 ?????? y+=m; // Putpixel这里仅用于在逻辑上表示画一个像素的函数。 ? } } 注:在以前TurboC上Putpixel是实际可用的函数。 如果m1,则有 ? dx= float(x1-x0); ? dy= float(y1-y0); ? h=dx/dy; ? x=x0; ? for(y=y0; y= y1, y++) { Putpixel(int(x+0.5),y,color); ?????? x += h; ? } } 这个算法简单、容易理解,效率较高。但必须处理器具有处理浮点数的能力。下面的Bresenham画线算法,可以只用整数加法和进位操作完成计算,所以成为经典。 3.1.3 Bresenham画线算法 Bresenham算法是计算机图形学领域使用最广泛的直线生成算法。假设直线斜率 k ? [0, 1]。Bresenham画线算法的基本原理是:按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。 因为斜率较小,所以每条垂直线上最多选取一个像素。如果像素点 Pi-1 (xi-1,yi-1) 是已经选定的离直线最近的像素点,现在要决定下一个像素点Pi是Ti 还是Si 。如图3-5所示。 其中,Pi (xi , yi),xi =xi-1+1, 当Pi=Ti时,yi = yi-1 +1 ;当Pi=Si时,yi = yi-1 显然,无论下一个像素点是Ti还是Si ,x方向都增1,即xi =xi-1+1,要决定的是y方向是否增1。由图3-5不难看出; 若s t , 则Si比较靠近理想直线,应选Si ; 若s≥t,则Ti比较靠近理想直线,应选Ti

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档