网站大量收购闲置独家精品文档,联系QQ:2885784924

计算机图形生成算法(线).ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 计算机图形生成算法 ?内容: 目标:掌握二维图形学的基本思想,理解扫描转换法生成图形的基本原理。 要求:掌握图形的扫描转换、区域填充、裁剪、反走样等概念。 掌握直线段的扫描转换算法、区域填充的扫描线算法、多边形裁剪算法、反走样的基本思想。 熟悉多边形的扫描转换算法、区域采样的基本思想。 了解圆弧的扫描转换算法、字符的基本概念。 第三章 输出图元 直线段扫描转换 DDA算法 Bresenham画线算法 中点画线法 圆弧扫描转换 Bresenham画圆算法 中点画圆算法 椭圆弧扫描转换 填充区域图元 输出图元 输出图元是基本几何结构。 输出图元种类:点、直线线段、圆、圆锥曲线、二次曲面、样条线段、多边形填色区域、字符串等。 图元的生成   所谓图元的生成,是指完成图元的参数表示形式(由图形软件包的使用者指定)到点阵表示形式(光栅显示系统刷新时所需的表示形式)的转换。通常也称扫描转换图元。 扫描转换 顶点(参数) 表示的图形 用户 点阵表示 的图形 光栅显示系统 光栅化 像素逼近示意图 可寻址点,即显示器可以找到的点,(x,y)整数地址 一个象素,占有一定面积 3.1 直线的扫描转换算法 直线的绘制要求: 1.直线要直 2.直线上的点要准确,即无不定向性和断裂情况 3.直线的亮度、色泽要均匀 4.画线的速度要快 5.要求不同直线可具有不同的色泽、亮度、线型等 直线的扫描转换算法 提出问题:对于给定直线两端点P0(x0,y0)和P1(x1,y1),如何在屏幕上画出该直线。 三个常用算法: 数值微分法(DDA) Bresenham算法 中点画线法 已知端点A(x1, y1)、 B(x2, y2), 直线的微分方程: dy/dx=(y2-y1)/(x2-x1)=常数=m yi+1=yi+ (y2-y1)/(x2-x1)*Δx = yi + m* Δx yi =m xi + B yi+1 = m xi +1 + B = m (xi + Δx ) +B A(x1,y1) B(x2,y2) Pi (xi,yi) Pi+1 (xi+1,yi+1) dy=k·dx dx 3.1.1 DDA算法(Digital Differential Algorithm)   通过同时对x,y各增加一个小的增量,计算下一步的x,y值。在一个迭代算法中,如果每一步的x,y值是用前一步的值加上一个增量来获得,那么这种算法称为增量算法。 光栅中 Δx=1 直线的递推公式 yi+1=yi+ (y2-y1)/(x2-x1) xi+1=xi+1 double x=x1, y=y1; m=(y2-y1)/(x2-x1); int k=abs(x2-x1); for( int i=0; ik; i++) { x=x+1; y=y+m; } 如果x2x1≥0, y2y1≥0 o x y k1 讨论: o x y k1 xi+1=xi+1 yi+1=yi+k yi+1=yi+1 xi+1=xi+1/k (xi,yi) (xi+1,yi+1) (xi,yi) (xi+1,yi+1) 因而造成隔行显示 解决办法: 将y看作自变量 结论:第一象限的直线DDA算法: (round(xi+1), yi+1) yi+1=yi+1 xi+1=xi+1/k k1 (xi+1,round(yi+1)) xi+1=xi+1 yi+1=yi+k k1 逼近直线的 象素点的坐标 直线上点的坐标 递推公式 直线的斜率 起点(x1, y1),终点(x2, y2)(x2 x1, y2 y1) 以(x1, y1)为起点 DDA算法的优、缺点 DDA算法的本质: 效率低,不利于硬件实现 直观可行   DDA算法也是一个增量算法。 缺陷: 做除法; 须采用浮点数据计算 要取整数-算法效率不高 算法程序实现 k=abs(x2-x1); if(abs(y2-y1)k) double deltx=(x2-x1)/k; double delty=(y2-y1)/k; for(int i=0;i=k;i++) { x+=deltx;//x=x+deltx; y+=delty;//y=y+delty; } k=abs(y2-y1); setpixel((int)x,(int)y,2);   用数值方法解微分方程(数值微分法) x=x1; y=y1; 1.问题的提出 2.基本思想 a.效率的意义 b.希望找到一个简单的判决条件,迅速确定直线上的点。 借助于一个决策变量 d的正负符号 ,来确定下一个该点亮的象素点。   最逼近Pi+1点的象

文档评论(0)

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

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

1亿VIP精品文档

相关文档