CG第3章电子教案.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
华中理工大学计算机学院 陆枫 99-7 1999年7月 第3章 基本图形生成算法 3.1 直线的扫描转换 直线的扫描转换就是如何快速找到一组最佳逼近 直线的像素点,以便在光栅图形显示器上显示直 线的过程。 3.1.1 数值微分法 DDA法 max |△x|,|△y| |△x|,即|k|≤1的情况: void DDAline int x0 , int y0 , int x1 , int y1 , int color int dx , dy , n , k; float x , y , xIncre , yIncre; dx x1-x0; dy y1-y0; x x0; y y0; if abs dx abs dy n abs dx ; else n abs dy ; if n! 0 xIncre float dx/ float n; yIncre float dy/ float n; for k 0; k n; k++ putpixel int x+0.5 , int y+0.5 , color ; x+ xIncre; y+ yIncre; 例1:利用DDA算法扫描转换直线段P0P1,其 中P0为 0,0 ,P1为 8,5 。 特点: 算法简单、直观 计算速度慢且不利于硬件实现 3.1.2 中点画线算法 直线的方程 基本原理:每次在最大位移方向上走一步,而另一个 方向是走步还是不走步取决于误差项的判别。 假定0≤k≤1,x是最大位移方向 判别式: 初始值d的计算 由于我们用的只是d的符号,用2d△x代替d 来摆脱小数。 d0 0.5-k变为d △x-2△y d 0时,d d+1-k变为d d+2△x-2△y d 0时,d d-k变为d d-2△y 0≤k≤1时中点画线算法的算法步骤为: 1.输入直线的两端点P0 x0,y0 和P1 x1,y1 。 2.计算初始值△x、△y、d △x-2△y、x x0、y y0。 3.绘制点 x,y 。判断d的符号。 若d 0,则 x,y 更新为 x+1,y+1 ,d更新为 d+2△x-2△y; 否则 x,y 更新为 x+1,y , d更新为d-2△y。 4.当直线没有画完时,重复步骤3。否则结束。 void Mid-line int x0 , int y0 , int x1 , int y1 , int color int dx , dy , d , UpIncre , DownIncre , x , y; if x0 x1 x x1; x1 x0; x0 x; y y1; y1 y0; y0 y; x x0; y y0; dx x1-x0; dy y1-y0; d dx-2*dy; UpIncre 2*dx-2*dy; DownIncre -2*dy; while x x1 putpixel x,y,color ; x++; if d 0 y++; d+ UpIncre; else d+ DownIncre; 例2:利用中点画线算法扫描转换直线段P0P1,其中P0为 0,0 , P1为 6,5 。 3.1.3 Bresenham算法 假定直线段的0≤k≤1 基本原理: 改进1:令e d-0.5 算法步骤: 1.输入直线的两端点P0 x0,y0 和P1 x1,y1 。 2.计算初始值△x、△y、e -△x、x x0、y y0。 3.绘制点 x,y 。 4.e更新为e+2△y,判断e的符号。若e 0,则 x,y 更新为 x+1,y+1 ,同时将e更新为e-2△x;否则 x,y 更新为 x+1,y 。 5.当直线没有画完时,重复步骤3和4。否则结束。 void Bresenham-line int x0,int y0,int x1,int y1,int color int x , y , dx , dy , e; dx x1-x0; dy y1-y0 e -dx; x x0; y y0; while x x1 putpixel x,y,color ; x++; e e+2*dy; if e 0 y++; e e-2*dx; 3.2 圆的扫描转换 解决的问题: 绘出圆心在原点, 半径为整数R的 圆:x2+y2 R2。 八分法画圆的程序 void circlepoint int x,int y,int color putpixel x,y,color ; putpixel y,x,color ; putpixel -y,x,color ; putpixel -x,y,color ; putpixel -x,-y,color ; putpixel -y

文档评论(0)

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

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

1亿VIP精品文档

相关文档