《精》计算机图形学-第二章基本图形的生成与计算.ppt

《精》计算机图形学-第二章基本图形的生成与计算.ppt

  1. 1、本文档共58页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 基本图形的生成与计算 本章主要阅读文献资料: 1、刘大有主编: 《计算机图形学》(第1版),机械工业出版社,2003年8月版。 2、陈传波,陆枫编著: 《计算机图形学基础》(第1版),电子工业出版社,2002年3月版。 3、孙家广等:《计算机图形学》(新版),清华大学出版社,1999年。 图形的扫描转换 图形的扫描转换 在光栅显示器上显示的任何一种图形,实际上都是一些具有一种或多种颜色的像素的集合。确定一个像素集合及其颜色,用于显示一个图形的过程,称为图形的扫描转换或光栅化。 图形的扫描转换(光栅化):确定一个像素集合,用于显示一个图形的过程。步骤如下: 1、确定有关像素。 2、用图形的颜色或其它属性,对像素进行写操作。 所以扫描转换的主要工作是确定最佳逼近于图形的像素集。 对一维图形,不考虑线宽,则用一个像素宽的直线来显示图形。二维图形的光栅化,即区域的填充:确定区域所对应的像素集,并用所要求的颜色或图案显示。 任何图形的光栅化,必须显示在一个窗口内,否则不予显示。即确定一个图形的哪些部分在窗口内,哪些在窗口外,即裁剪。裁剪通常在扫描转换之前进行。 2-1 直线的扫描转换 在数学上,理想的直线是没有宽度的,由无数个点构成的集合。我们只能在显示器所给定的有限个象素组成的矩阵中,确定最佳逼近于该直线的一组象素,并且按扫描顺序,用当前的写方式,对这些象素进行写操作。 生成图形的常用算法有: 数值微分法 中点画线法 Bresenham直线生成算法 2-1 直线的扫描转换 一、数值微分法 数值微分法(digital differential analyzer,DDA) 假定直线的起点、终点分别为:(x0,y0), (x1,y1),且都为整数。 2-1 直线的扫描转换 一、数值微分法 1、直接求交法 求表示直线段P0P1的像素集的最简单方法是利用直线方程直接计算。 假设待扫描转换的直线段为P0(x0,y0)P1(x1,y1),端点坐标均为整数 再令△x=x1-x0, △y=y1-y0, 斜率k=△y/△x, 直线方程为y=kx+B。 从直线的起点开始,确定最佳逼近于直线的直线,确定最佳逼近于直线的y坐标。 让x从起点到终点变化,x每增加1对应的y坐标为y=kx+B 2-1 直线的扫描转换 一、数值微分法 但是由于y值由y=kx+B计算而来,可能为浮点数,需要对y值取整 对某个xi它所对应的yi=kxi+B的结果进行四舍五入,记为yi,r=round(yi)=(int)(yi+0.5),故对直线段P0P1扫描实际得到像素集为{(xi,yi,r)} ,其中yi,r是yi四舍五入所得的整数值。 这个方法直观,但效率太低,因为每一步需要一次浮点乘法和一次四舍五入取整运算。 2-1 直线的扫描转换 一、数值微分法 2、增量算法 注意到公式 yi+1=kxi+1+B = k(xi+△x)+B = kxi+B+k△x = yi+k△x 因此当△x=1时, 有yi+1=yi+k 2-1 直线的扫描转换 一、数值微分法 所以:当x每递增1,y递增k(即直线斜率); 注意上述分析的算法仅适用于?k? ≤1的情形。在这种情况下,x每增加1,y最多增加1。 当 ?k? ?1时,必须把x,y地位互换,大家自己依此处理,要保证任意两点连线正确显示。 2-1 直线的扫描转换 一、数值微分法 增量算法:在一个迭代算法中,如果每一步的x、y值是用前一步的值加上一个增量来获得,则称为增量算法。 DDA算法的本质是用数值方法解微分方程,通过同时对x和y各增加一个小增量,计算下一步的x,y值,因此DDA算法就是一个增量算法。 缺点: 在此算法中,y、m必须是float,且每一步都必须对y进行舍入取整,不利于硬件实现。 2-1 直线的扫描转换 一、数值微分法 扫描转换直线段的DDA算法: void DDALine(int x0,int y0,int x1,int y1,int color) ? int x; float dx, dy, y, k; dx = x1-x0; dy=y1-y0; k=dy/dx; y=y0; for (x=x0; x=x1; x++) ? drawpixel (x, (int)(y+0.5), color);/*以颜色color显示象素*/ y=y+k; ? ? 2-1 直线的扫描转换 一、数值微分法 例:画直线段P0(0,0)--P1(5,2) x int(y+0.5) y+0.5 0 0 0+0.5 1 0 0.4+0.5 2 1

文档评论(0)

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

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

1亿VIP精品文档

相关文档