4-二维线画图元与其属性.pptVIP

  1. 1、本文档共137页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4-二维线画图元与其属性

二维输出图元及其属性;提出问题;直线生成算法 圆弧生成算法 椭圆生成算法 其它输出图元的生成 输出图元的属性 字符的生成;学习目标;图形设计中最基本的图形元素是点、直线、圆、曲线。任何复杂的图形均可看成是点和直线组成。本质上,物体的形状和颜色可用像素矩阵或直线段和多边形填充区域等基本几何结构来描述。通常,图形编程软件包提供使用输出图元的基本几何结构来描述场景和将输出图元组合成更复杂结构的功能。点和直线段是最简单的几何成分。 ;4.1 点和直线;画直线;点的坐标 点在屏幕上的位置坐标用像素为单位,点的像素坐标只能是整数。 而理论上的点的坐标根据直线方程可以为任何实数,而点的像素坐标受设备坐标系的制约,只能为整数。;本章将讨论光栅系统上设备级图元生成算法,物体坐标用整数的设备坐标指定。目前我们假定象素位置根据水平扫描线和垂直扫描线的交叉定义,如图。 装载指定位置象素的颜色到帧缓存用函数:setPixel(x,y)或setPixel(x,y,color) 读取指定位置象素的颜色用函数: getPixel(x,y);光栅扫描转换的定义 根据图形的几何描述,确定在二维的像素矩阵上那些像素正好在图形上或最靠近图形,这一过程就称为光栅扫描转换。 评价光栅扫描转换算法优劣的标准 a.显示图形的精度。 b.算法的时间复杂性。 c.算法的空间复杂性。;4.2 直线生成算法; 对于任何沿直线给定的x方向上的增量△x,可从方程(4-2)计算出对应的y方向上的增量△y: △y=m△x (4-4) 同样,可以得出对应于指定y方向上的增量△y, 可从方程(4-2)计算出对应的x向上的增量△x △x=△y/m (4-5);对于模拟显示设备,方程(4-4)(4-5)使决定偏转电压变化的基础。 a.当|m|1, △x 可以设置为正比于一水平偏转电压, △y则可以根据公式计算。 b.当|m|1, △y 可以设置为正比于一水平偏转电压, △x则可以根据公式计算。;对于光栅显示器,直线用象素点来画,在水平或垂直上的步长△x / △y受象素间距限制。即需要在直线上不同的位置取样,并在每个样本点上取最接近直线的点。如图:;常用直线生成算法;DDA(digital differential analyzer)方法是利用方程(4-4)或(4-5)计算△x或△y的一个线段扫描转换算法。在一个坐标轴上以单位间隔取样,以决定另一个坐标轴上最靠近线段路径的对应整数值。 对于0≤m≤1,则在单位x间隔(△x=1)取样并计算每个顺序的y值: yk+1=yk+ m (4-6) 下标k取整数,从起点开始递增至末点。由于m可是0到1之间的任意实数,所以计算出的y值必须取整。;对于1≤m的直线段,则将x和y的规则交换,即在单位y间隔(△y=1)取样,并计算每个连续的x值: xk+1=xk+ 1/m (4-7) 方程(4-6)和(4-7)基于线段从左端点到右端点进行处理的假设。假设这个过程相反,即起始点在右侧,那么,△x=-1,并且 yk+1=yk - m (4-8) 或△y=-1,且 xk+1=xk- 1/m (4-9) 方程(4-6)至(4-9)也可用于计算负斜率的线段的像素位置。 ;一般地: 画直线的DDA算法可表示为: 若|m|≤1:xk+1=xk+1,yk+1=yk+m ;xaxb or : xk+1=xk-1,yk+1=yk-m ;xaxb 若|m|≥1:yk+1=yk+1,xk+1=xk+1/m;yayb or :yk+1=yk-1,yk+1=yk-1/m ; yayb;DDA算法的C实现 #define Round(a) ((int)(a+0.5)) void lineDDA(int xa,int ya,int xb,int yb) { int dx=xb-xa,dy=yb-ya,steps,k; float xIncrement,yIncrement,x=xa,y=ya; if (abs(dx)abs(dy)) steps=abs(dx); else steps=abs(dy); ; xIncrement=dx/(float)steps; yIncrement=dy/(float)steps; setpixel(Round(x),Round(y),RED); for(k=0;ksteps;k++) { x+=xIncrement; y+=yIncrement; setpixel(Round(x),Round(y),RED); } } ;分析从(0,0)到(20,10)的直线段和从(20,

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档