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

第3章 基本图形生成 计算机图形学实用技术 知识(第3版)课件.ppt

第3章 基本图形生成 计算机图形学实用技术 知识(第3版)课件.ppt

  1. 1、本文档共200页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章 基本图形生成 计算机图形学实用技术 知识(第3版)课件.ppt

第3章 基本图形生成 ; Visual C++的CDC图形程序库已提供了画线、画圆和椭圆、填充等基本图形的绘制函数,它们实质上是按计算机图形标准并以C++的语法约定提供给用户使用的标准图形生成算法。因此,从实用的角度出发,用户只需完全按照C++的语法约定使用这些图形程序库,就没有必要学习基本图形的生成原理及算法。; 第二,Visual C++虽然提供了许多绘图函数,但总有满足不了用户特殊绘图要求的时候。如果仅仅学会使用Visual C++的绘图函数,不掌握基本图形生成原理及算法,那么你就永远无法超越Visual C++的限制。 ; 众所周知,计算机内部存储和使用的数据是二进制数(由0和1组成)。目前我们使用的主要图形输出设备显示器(一般为光栅图形显示器)和打印机(点阵、喷墨、激光打印机)本质上是一种画点设备,是由一定数量的网格状细小光点(光点称为像素,光点的数量称为分辨率),使其某些像素亮(二进值为1),某些像素不亮(二进值为0)来显示图形或文字的。因此,所谓的基本图形生成原理是指在点阵输出设备的情况下,如何对一条斜的直线或弯曲的曲线尽可能快地输出其最接近理想的直线或曲线,即如何以最快的速度确定最佳逼近于图形的像素集,如图3-1所示 ;图3-1 直线与曲线扫描转换 ;解析几何问题 ;解1):给定线段的两个端点(x1, y1)和(x2, y2), 可以计算出斜率可k和截距如下: k =△y/△x = (y2 – y1) / (x2 – x1) b = y1 – k·x1 (3-2) ;解2):假设直线的起点和终点分别为(x1,y1)和(x2,y2),利用1)的端点的斜率表示及其方程,非常方便地求的一组参数: a = y1 - y2,b = x2 - x1,c = x1y2 - x2y1。;直线生成算法主要思想; 针对上述式(3-3)中P1或P2点的选择,我们会有不同的方法。这就是本章将要叙述的数值微分法、中点画线法以及Bresenham画线算法。 为此,只需让x从起点到终点每次增加(或减少)1,首先,我们可以用(3.1.1)式计算对应的y值,再用putpixel (x, int (y+0.5), color)函数输出该像素的颜色值即可。这里用int来取整是因为像素的坐标值都是整数的。但是,用这种方法画线效率太低,这是因为每步都需要一个浮点乘法运算和一个四舍???入运算。;3.1.1 数值微分法 ; 对于具有斜率绝对值|k|1的线段,可以让x从起点到终点变化,每步递增(或递减)1,即令△x =±1,则△y =±k。若前一次的直线上像素点坐标为 (xi,yi),这一次的直线上像素点坐标为 (xi+1,yi+1),则xi+1 = xi±1,yi+1 = yi±k。随后用putpixel 函数输出该像素的颜色值即可。见图3-4。;图3-4 数值微分法示意图 ; 上述采用的增量计算方法称为数值微分算法(Digital Differential Analyzer简称DDA)。以下是用数值微分算法(DDA)生成直线(斜率在0~l)的C语言描述。;3.1.2 中点画线法 ;3.1.2 中点画线的改进算法 ; 下面来讨论中点画线法的具体实现。; 构造判别式 d=F(M)=F(xk+1, yk+0.5)=a(xk+1)+b(yk+0.5)+c; 由于d是xk和yk的线性函数,可采用增量计算,以便提高运算效率。; 再看d的初始值。直线的第一个像素为左端点(x1, y1) ,所以相应的判别式值为 d0 = F(x1+1, y1+0.5)=a(x1+1)+b(y1+0.5)+c = (ax1+by1+c)+a+0.5b = F(x1,y1)+a+0.5b 由于(x1, y1)在直线上,故F (x1, y1) = 0。因此,d的初始值为d0 = a+0.5b。; void MPLine (int x1, int y1, int x2, int y2, int color) { int x, y, a, b, d , d1, d2; a = y1 – y2; b = x2 – x1; y = y1; d = 2 * a + b; dl = 2 * a; d2 = 2 *(a + b); for(x=x1;x=x2;x++) { putpixel (x, y, color); i

文档评论(0)

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

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

1亿VIP精品文档

相关文档