欢迎来到天天文库
浏览记录
ID:44398686
大小:320.00 KB
页数:31页
时间:2019-10-21
《计算机图形学 第3章》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、第三章二维基本图形的生成重点:掌握二维图元直线、圆、区域填充、字符的生成算法。难点:理解二维图元生成的算法思想并且用C语言进行算法的实现。图元生成算法的要求:准确、亮度均匀、速度快。前面已经知道,矢量显示(随机扫描显示器)和光栅显示是两种完全不同的图形显示技术。目前,光栅显示技术占主要地位。原因:1、光栅显示可以用颜色或图案来填充一个区域;2、光栅显示以象素为单位进行读写和存储,可以实现对物体细节的描述;3、图形的任意部分均可以被移动和复制。在这一章里,主要介绍在光栅输出设备上,根据物体的坐标描述构造二维几何图形的方法。在光栅显示器上,象素是屏幕的最小显示单位,因此二维图形的构造就是找出最靠近
2、所描述几何图形的那些象素,将它们置入规定的颜色并放入帧缓存。我们知道,一幅图是由点、直线、曲线、多边形填充区域以及字符串等组成。下面将讨论这些基本图元的生成技术和算法。3.1直线的扫描转换一、数学直线在数学上,理想的直线是一条由无穷多个无限小的连续的点组成。数学直线二、光栅平面显示的直线但在光栅显示平面上,我们只能用二维光栅格网上尽可能靠近这条直线的象素点的集合来表示它。每个象素具有一定的尺寸,是显示平面上可被访问的最小单位,它的坐标x和y只能是整数,也就是说相邻象素的坐标值是阶跃的而不是连续的。光栅直线三、直线的扫描转换直线的扫描转换,就是要找出显示平面上最佳逼近理想直线的那些象素的坐标值,
3、并将这些象素置成所要求的颜色。直线的扫描转换由于一幅图中可能包含成千上万条直线,所以要求绘制算法应该:1、最接近数学上的直线;2、沿着线段分布的象素应均匀;3、画线速度尽可能的快。2.1.1生成直线的DDA算法数值微分法即DDA法(DigitalDifferentialAnalyzer)是一种基于直线的微分方程来生成直线的方法。一、直线DDA算法描述:设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得也可通过计算由y方向的增量△y引起x的改变来生成直线:可通过计算由x方向的增量△x引起y的改变来生成直线:二、直线DDA算法思想:选定x2-x1和y2-y1中较大者
4、作为步进方向(假设x2-x1较大),取该方向上的增量为一个象素单位(△x=1),然后利用式(3-1)计算另一个方向的增量(△y=△x·m=m)。通过递推公式(3-2)至(3-5),把每次计算出的(xi+1,yi+1)经取整后送到显示器输出,则得到扫描转换后的直线。之所以取x2-x1和y2-y1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还是负值。三、直线DDA算法实现:1、已知直线的两端点坐标:(x1,y1),(x2,y2)2、已知画线的颜色:color3、计算两个方向的变化量:dx=x2-x1dy
5、=y2-y14、求出两个方向最大变化量的绝对值:steps=max(
6、dx
7、,
8、dy
9、)5、计算两个方向的增量(考虑了生成方向):xin=dx/stepsyin=dy/steps6、设置初始象素坐标:x=x1,y=y17、用循环实现直线的绘制:for(i=1;i<=steps;i++){putpixel(int(x+0.5),int(y+0.5),color);/*在(x,y)处,以color色画点*/x=x+xin;y=y+yin;}四、直线DDA算法特点:该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。五、直线DDA算法程序:下面给出考虑不同斜率、不同
10、方向直线的DDA画线算法程序:#includevoidDDALine(intx1,inty1,intx2,inty2,intcolor){floatincrex,increy,x,y;intsteps,i;if(abs(x2-x1)>abs(y2-y1))steps=abs(x2-x1);elsesteps=abs(y2-y1);increx=(float)(x2-x1)/steps;increy=(float)(y2-y1)/steps;x=x1;y=y1;for(i=1;i<=steps;i++){putpixel(int(x+0.5),int(y+0.5),color
11、);//在(x,y)处,以color色画点x+=increx;y+=increy;}}3.1.2生成直线的Bresenham算法从上面介绍的DDA算法可以看到,由于在循环中涉及实型数据的加减运算,因此直线的生成速度较慢。在生成直线的算法中,Bresenham算法是最有效的算法之一。Bresenham算法是一种基于误差判别式来生成直线的方法。一、直线Bresenham算法描述:它也是采用递推步进的
此文档下载收益归作者所有