基本图形生成算法解释.ppt

  1. 1、本文档共75页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.1 图形生成的概念 点的生成 点是图形中最基本的图元,直线、曲线以及其它的图元都是点的集合。 在几何学中,一个点既没有大小,也没有维数,点只是表示坐标系统中一个位置。 在计算机图形学中,点是用数值坐标来表示的。在直角坐标系中点由(x,y) 两个数值组成的坐标表示,在三维坐标系中点是由(x,y,z)三个数值组成的坐标表示。 在输出设备上输出一个点,就要把应用程序中的坐标信息转换成所用输出设备的相应位置。对于一个CRT监视器来说,输出一个点就是要在指定的屏幕位置上打上电子束,使该位置上的荧光点亮。 在PC机中,点亮屏幕上一个点是由BIOS控制完成的,各种程序语言中都有描点语句。例如C语言为putpixel(x,y,color) ,putpixel(放,摆-像素)。 3.2 直线的扫描转换 在数学上,理想的直线是没有宽度的、由无数个点构成的集合。当我们对直线进行光栅化时,只能在显示器所给定的有限个像素组成的矩阵中,确定最佳逼近该直线的一组像素,并且按扫描线顺序对这些像素进行写操作,这就是通常所说的直线的扫描转换。 通常用于直线光栅化的算法有数值微分法(DDA)、中点画线法和Bresenham画线算法。 直线光栅化算法 直线段生成 求与直线段充分接近的像素集 已知一条直线段L(P0, P1),其端点坐标为:P0 (x0, y0), P1(x1, y1)。可计算出直线的斜率k为: 假定端点坐标均为整数,取直线起点P0 (x0, y0)作为初始坐标。画线过程从x的左端点x0开始,向x右端点步进,每步x递增1,计算相应的y坐标, y=kx+b,取像素点(x,round(y))作为当前点的坐标。 问题:每步需要用到浮点数的乘法、加法和取整运算,效率不高。怎么办?? 增量算法 因为: y=kx+b,所以: yi+1=kxi+1+b=k(xi+1)+b=kxi+b+k =yi+k (xi,yi)→(xi+1,yi+k) 例:画直线段P0(0,0)--P1(5,2) 解:斜率K=2/5=0.4,所以X方向每次步长为1,Y方向递增K。初始点为(0,0)。 x int(y+0.5) ? y 0 0 0 1 0 0.4 2 1 0.8 3 1 1.2 4 2 1.6 5 2 2.0 程序实现: void DDALine(int x0,int y0,int x1,int y1,int color) { int x; float dx,dy,k,y; dx=x1-x0; dy=y1-y0; k=dy/dx; y=y0; for(x=x0;x=x1;) { drawpixel(x,int(y+0.5),Color); x++; y=y+k; } } 3.2.1 数值微分法(DDA法) 通常情况下,直线的方向分为8个不同的区域,每个区域的处理方法有所不同。K=△y/△x 3.2.1 数值微分法(DDA法) 设直线的起点和终点分别为(x0,y0)和(x1,y1) 则直线方程为F(x,y)=ax+by+c=0 (1) ∴欲判断中点M点是在Q点上方还是在Q点下方,只需: 将中点M坐标代入(1)式,并判断其符号 即可确定像素点的选取。构造如下判别式:采用增量计算 d=F(M)=F(x+1, y+0.5)=a(x+1)+b(y+0.5)+c 在d≥0的情况下(M在直线上(Q点)或上方),取正右方像素P1 在d0的情况下(M在直线(Q点)下方),取 右上方像素P2 若d0-M在直线下方-取P2; 此时再下一个象素的判别式为 d2= F(x+2, y+1.5) =a(x+2)+b(y+1.5)+c = a(x+1)+b(y+0.5)+c +a +b =d+a+b ; 增量为a+b 画线从(x0, y0)开始,d的初值(F(x,y)=a*x+b*y+c) d0=F(x0+1, y0+0.5)= a(x0 +1)+b(y0+0.5)+c = ax0 +a+by0+0.5b+c = ax0+by0+c+a+0.5b =F(x0, y0)+a+0.5b = a+0.5b 注:由于( x0, y0)在直线上,故F(x0, y0)=0 所以,d的初始值d0 = a+0.5b 由于只用d 的符号作判断,为了只包含整数运算, 可以用2d代替d

文档评论(0)

知识宝库 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档