收藏 分享(赏)

计算机图形学.ppt

上传人:kuailexingkong 文档编号:1725246 上传时间:2018-08-20 格式:PPT 页数:127 大小:6.60MB
下载 相关 举报
计算机图形学.ppt_第1页
第1页 / 共127页
计算机图形学.ppt_第2页
第2页 / 共127页
计算机图形学.ppt_第3页
第3页 / 共127页
计算机图形学.ppt_第4页
第4页 / 共127页
计算机图形学.ppt_第5页
第5页 / 共127页
点击查看更多>>
资源描述

1、计算机绘图,重庆大学软件学院 主讲:杨梦宁 65112774,2018/8/20,基本图形的生成算法,2,第二章 基本图形的生成算法,2.1 直线绘制算法 2.2 圆的生成 2.3 椭圆的生成 2.4 区域填充 2.5 种子填充 2.6 字符,重 点:掌握二维图元直线、圆、区域填充、字符的生成算法。 难 点:理解二维图元生成的算法思想并且用程序进行算法的实现。,2018/8/20,基本图形的生成算法,3,图元生成算法的要求:准确、亮度均匀、速度快。,2018/8/20,基本图形的生成算法,4,2.1 直线的绘制算法(Line Drawing Algorithms),直线的扫描转换DDA算法中

2、点算法Bresenham算法,2018/8/20,基本图形的生成算法,5,直线的扫描转换 (Scan conversion),数学直线 在数学上,理想的直线是一条没有宽度,由无穷多个无限小的连续的点组成。,2018/8/20,基本图形的生成算法,6,光栅平面显示的图形 在光栅显示平面上,我们只能用二维光栅网格上尽可能靠近这条直线的象素集合来表示它。每个象素具有一定的尺寸,是显示平面上可被访问的最小单位,它的坐标x和y只能是整数,也就是说相邻象素的坐标值是阶跃的而不是连续的。,这里将像素的几何形 状看作中心为网格点 (x,y)的圆点。,2018/8/20,基本图形的生成算法,7,直线的扫描转换

3、就是要找出显示平面上最佳逼近理想直线的那些象素的坐标值,并将这些象素置成所要求的颜色。,How do we choose which pixels to turn on?,2018/8/20,基本图形的生成算法,8,Line Equations,Lets quickly review the equations involved in drawing lines,Slope-intercept line equation:,where:,2018/8/20,基本图形的生成算法,9,Lines & Slopes,The slope of a line (m) is defined by its

4、start and end coordinates(坐标) The diagram below shows some examples of lines and their slopes,2018/8/20,基本图形的生成算法,10,We could simply work out the corresponding y coordinate for each unit x coordinate Lets consider the following example:,A Very Simple Solution (cont),A Very Simple Solution (cont),Fir

5、st work out m and b:,Now for each x value work out the y value:,2018/8/20,基本图形的生成算法,12,A Very Simple Solution (cont),Now just round off the results and turn on these pixels to draw our line,0,1,2,3,4,5,6,7,8,0,1,2,3,4,5,6,7,2018/8/20,基本图形的生成算法,13,A Very Simple Solution (cont),However, this approach

6、is just way too slow In particular look out for: The equation y = mx + b requires the multiplication of m by x Rounding off the resulting y coordinates We need a faster solution,2018/8/20,基本图形的生成算法,14,The DDA Algorithm,The digital differential analyzer (DDA) algorithm takes an incremental (增量式)appro

7、ach in order to speed up scan conversion Simply calculate yk+1 based on yk,The original differential analyzer was a physical machine developed by Vannevar Bush at MIT in the 1930s in order to solve ordinary differential (常微分) equations.,2018/8/20,基本图形的生成算法,15,即:当x每递增1,y递增k,(即直线斜率);取象素点(x, round(y)作为

8、当 前点的坐标。,2018/8/20,基本图形的生成算法,16,The DDA Algorithm (cont),Again the values calculated by the equations used by the DDA algorithm must be rounded to match pixel values,(xk, yk),(xk+1, yk+k),(xk, round(yk),(xk+1, round(yk+k),(xk, yk),(xk+ 1/k, yk+1),(round(xk), yk),(round(xk+ 1/k), yk+1),2018/8/20,基本图形

9、的生成算法,17,DDA算法: DDALine(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; int xfloat dx,dy,k,ydx=x1-x0; dy=y1-y0;k=dy/dx;y=y0;for(x=x0;x=x1;x+)drawpixel(x,int(y+0.5),color);y=y+k; ,K1 (x=1, y=k),问题:为什么k?,若k,上述算法会出现什么情况?应如何处理?,2018/8/20,基本图形的生成算法,18,特点:该算法简单,实现容易,但y与k必须用浮点数表示,而且每一步都要对y进行四舍五入后取整,这使得它不利于硬件实现。,

10、当k 1时,x每增加1,y最多增加1。 当 k 1时,必须把x,y地位互换,例:画直线段P0(0,0)-P1(5,2)k=dy/dx=0.4 x y int(y+0.5) 0 0 0 1 0.4 0 2 0.8 1 3 1.2 1 4 1.6 2 5 2.0 2,DDALine(x0,y0,x1,y1,color) int x0,y0,x1,y1,color; int xfloat dx,dy,k,ydx=x1-x0; dy=y1-y0;k=dy/dx;y=y0;for(x=x0;x=x1;x+)drawpixel(x,int(y+0.5),color);y=y+k; ,2018/8/20,基

11、本图形的生成算法,20,1、已知直线的两端点坐标:(x1,y1),(x2,y2) 2、已知画线的颜色:color 3、计算两个方向的变化量:dx=x2x1 dy=y2y1 4、求出两个方向最大变化量的绝对值: steps=max(|dx|,|dy|) 5、计算两个方向的增量(考虑了生成方向): xin=dx/steps yin=dy/steps 6、设置初始象素坐标:x=x1,y=y1 7、用循环实现直线的绘制:,2018/8/20,基本图形的生成算法,21,DDA Algorithm Example,Lets try out the following examples:,2018/8/20

12、,基本图形的生成算法,22,The Bresenham Line Algorithm,The Bresenham algorithm is another incremental scan conversion algorithm The big advantage of this algorithm is that it uses only integer calculations,2018/8/20,基本图形的生成算法,23,The Big Idea,Move across the x axis in unit intervals and at each step choose betwe

13、en two different y coordinates,For example, from position (2, 3) we have to choose between (3, 3) and (3, 4) We would like the point that is closer to the original line,2018/8/20,基本图形的生成算法,24,Bresenham算法, 基本思想过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。该算法的巧妙之处在于采用增量计算,使

14、得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求象素。,2018/8/20,基本图形的生成算法,25, 算法实现,设A为CD边的中点,正确的选择: 若B点在A点上方,选择D点; 否则,选C点。,先考虑斜率k=dy/dx1的直线。设直线 方程为 k = dy/dx。 假设当前像素的x坐标已经确定为xi,其y坐标为yi,由于坐标(xi,yi)(i=0,1,)只能取整数,那么下一个像素的x坐标 为而yi1的坐标有两种可能: 1) 保持不变,即y i1yi; 2) y坐标递增1,即y i1yi1。,2018/8/20,基本图形的生成算法,26,设直线方程为: 其中k=dy/dx。 因为直线

15、的起始点在象素中心,所以误差项d的初值d00。 X下标每增加1,d的值相应递增直线的斜率值k,即ddk。 一旦d1,就把它减去1,这样保证d在0、1之间。 当d0.5时,最接近于当前象素的右上方象素 而当d0.5时,更接近于右下方象素为方便计算,令ed-0.5, e的初值为-0.5,增量为k。 当e0时,取当前象素 的右上方象素 而当e0时,更接近于右方象素,例:Line: P0(0, 0), P1(5,2)k=dy/dx=0.4x y e0 0 -0.51 0 -0.12 1 -0.73 1 -0.34 2 -0.9 5 2 -0.5,void Bresenhamline (int x0,i

16、nt y0,int x1, int y1,int color) int x, y, dx, dy;float k, e;dx = x1-x0, dy = y1- y0, k=dy/dx; e=-0.5, x=x0, y=y0; for (i=0; idx; i+) drawpixel (x, y, color); x=x+1,e=e+k;if (e0) y+, e=e-1;,2018/8/20,基本图形的生成算法,28,Bresenham Line Algorithm Summary,The Bresenham line algorithm has the following advantag

17、es: An fast incremental algorithm Uses only integer calculations Comparing this to the DDA algorithm, DDA has the following problems: Accumulation of round-off errors can make the pixelated line drift away from what was intended The rounding operations and floating point arithmetic involved are time

18、 consuming,2018/8/20,基本图形的生成算法,29,Bresenham Exercise,Go through the steps of the Bresenham line drawing algorithm for a line going from (21,12) to (29,16),2018/8/20,基本图形的生成算法,30,Bresenham Exercise,2018/8/20,基本图形的生成算法,31,A Simple Circle Drawing Algorithm,The equation for a circle is:where r is the ra

19、dius of the circle So, we can write a simple circle drawing algorithm by solving the equation for y at unit x intervals using:,2018/8/20,基本图形的生成算法,32,A Simple Circle Drawing Algorithm (cont),2018/8/20,基本图形的生成算法,33,A Simple Circle Drawing Algorithm (cont),However, unsurprisingly this is not a brillia

20、nt solution! Firstly, the resulting circle has large gaps where the slope approaches the vertical Secondly, the calculations are not very efficient The square (multiply) operations The square root operation try really hard to avoid these! We need a more efficient, more accurate solution,2018/8/20,基本

21、图形的生成算法,34,Eight-Way Symmetry,The first thing we can notice to make our circle drawing algorithm more efficient is that circles centred at (0, 0) have eight-way symmetry(对称),圆弧的扫描转换算法,只要能画出八分之一的圆弧,就可以利用对称性的原理得到整个圆弧。,这里仅讨论圆心位于坐标原点的圆的扫描转换算法,对于圆心不在原点的圆,可先用平移变换,将它的圆心平移到原点,然后进行扫描转换,最后再平移到原来的位置。,2018/8/20

22、,基本图形的生成算法,36,Mid-Point Circle Algorithm,Similarly to the case with lines, there is an incremental algorithm for drawing circles the mid-point circle algorithm In the mid-point circle algorithm we use eight-way symmetry so only ever calculate the points for the top right eighth of a circle, and then

23、 use symmetry to get the rest of the points,The mid-point circle algorithm was developed by Jack Bresenham, who we heard about earlier,2018/8/20,基本图形的生成算法,37,Mid-Point Circle Algorithm (cont),考虑中心在原点,半径为R的第二个8分圆 Assume that we have just plotted point (xk, yk) The next point is a choice between (xk+1

24、, yk) and (xk+1, yk-1) We would like to choose the point that is nearest to the actual circle So how do we make this choice?,2018/8/20,基本图形的生成算法,38,Mid-Point Circle Algorithm (cont),构造判别式(圆方程)判断点在圆内、圆上、圆外,2018/8/20,基本图形的生成算法,39,其中M是P1和P2的中点。,当d0时,M在圆外,表明P2点离圆更近,应取P2点;当d=0时,在P1点与P2点之中随便取一个即可,我们约定取P2点

25、。,Mid-Point Circle Algorithm (cont),2018/8/20,基本图形的生成算法,40,若 d=0, 则应取P2为下一象素,而且下一象素的判别式为 第 一个象素是(0,R),判别式d的初始值为,2018/8/20,基本图形的生成算法,41,算法过程,MidPointCircle(int r int color) int x,y;float d;x=0; y=r; d=1.25-r;circlepoints (x,y,color); while(x=y) if(d0) d+=2*x+3;else d+=2*(x-y)+5; y-;x+;circlepoints (x

26、,y,color);,2018/8/20,基本图形的生成算法,42,例:半径为6,利用中点画圆法算法所画的点,2018/8/20,基本图形的生成算法,43,为了进一步提高算法的效率,可以将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。 初始化运算使用e=d-0.25代替d,对应于 e=1-R,2018/8/20,基本图形的生成算法,44,Mid-Point Circle Algorithm Example,To see the mid-point circle algorithm in action lets use it to draw a circle

27、centred at (0,0) with radius 10,Mid-Point Circle Algorithm Example (cont),2018/8/20,基本图形的生成算法,46,Mid-Point Circle Algorithm Exercise,Use the mid-point circle algorithm to draw the circle centred at (0,0) with radius 15,Mid-Point Circle Algorithm Example (cont),2018/8/20,基本图形的生成算法,48,Mid-Point Circle

28、 Algorithm Summary,The key insights in the mid-point circle algorithm are: Eight-way symmetry can hugely(巨大的) reduce the work in drawing a circle Moving in unit steps along the x axis at each point along the circles edge we need to choose between two possible y coordinates,2018/8/20,基本图形的生成算法,49,以点(

29、0,R)为起点按顺时针方向生成圆,则在第一象限内y是x的单调递减函数。假设圆心和起点均精确地落在像素中心上。如果已经知道圆弧上的一点(xi,yi),下一像素的选取有三种可能:正右方像素H右下角像素D正下方像素V,生成圆弧的Bresenham法,2018/8/20,基本图形的生成算法,50,这三个像素的偏差的平方为:,令,构造函数 :,2018/8/20,基本图形的生成算法,51,=,=,2018/8/20,基本图形的生成算法,52,a) 如果取正右方像素(H)为下一个像素点,则第(i+1)个像素的坐标和有关的偏差的递推公式为: b) 如果取右下角的像素(D)为下一个像素点,则第(i+1)个像素

30、的坐标和有关的偏差的递推公式为:c) 如果取正下方的像素(V)为下一个像素点,则第(i+1)个像素的坐标和有关的偏差的递推公式为:,2018/8/20,基本图形的生成算法,53,用delta 1表示,用delta表示,用delta 2表示,Bresenham_Circle(r,color) int r,color int x,y,delta,delta 1,delta 2,direction;x=0; y=r;delta = 2*(1-r); /d的初始值Limit =0;while (y=Limit) drwpixel(x,y,color)if (delta 0)delta 2 = 2*(d

31、elta x)-1; / 取D点if(delta 2 0) direction =2;else direction =3; /取V点,Elsedirection =2; Switch (direction)case 1: x+;delta +=2*x+1;break;case 2: x+;y-;delta +=2*(x-y+1);break;case 3: y-;delta +=(-2*y+1);break;/* switch */*while*/ /*Bresenham_Circle*/,2018/8/20,基本图形的生成算法,55,2.3 椭圆的生成算法,F(x,y)=b2x2+a2y2-

32、a2b2=0椭圆的对称性,只考虑第一象限椭圆弧生成,分上下两部分,以切线斜率为-1的点作为分界点。 椭圆上一点处的法向量:N(x,y) = (F)x i + (F)y j = 2b2 x i + 2a2 y j在上部分(区域2),法向量的y向分量较大,斜率K满足|k|1, |y|x|,所以y方向为主位移方向。,Y方向分量,法向量,X方向分量,2018/8/20,基本图形的生成算法,56,椭圆的中点画法,与圆弧中点算法类似:确定一个象素后,接着在两个候选象素的中点计算一个判别式的值,由判别式的符号确定更近的点先讨论椭圆弧的上部分(Xp,Yp)中点(Xp+1,Yp-0.5),椭圆方程:F(x,y)

33、=b2x2+a2y2-a2b2=0,2018/8/20,基本图形的生成算法,57,根据d1的符号来决定下一像素是取正右方的那个,还是右上方的那个。 若d10,中点在椭圆内,取正右方象素,判别式更新为:d1=F(Xp+2,Yp-0.5)=d1+b2(2Xp+3)d1的增量为b2(2Xp+3) 当d10,中点在椭圆外,取右下方象素,更新判别式:d1=F(Xp+2,Yp-1.5)=d1+b2(2Xp+3)+a2(-2Yp+2)d1的增量为b2(2Xp+3)+a2(-2Yp+2),判别式的初始值:,2018/8/20,基本图形的生成算法,58,从椭圆弧的上半部分转入下半部分判断条件:,上半部分椭圆弧一

34、点P(xi,yi),中点M(xi+1,yi-0.5),满足x方向分量小于y方向分量:,而在下一个中点,不等号改变方向,说明椭圆弧从上半部分转入到下半部分,2018/8/20,基本图形的生成算法,59,再来推导椭圆弧下半部分的绘制公式,判别式:,若d20,取Pl(xp,yp-1) 若d20,取Pr(xp+1,yp-1),2018/8/20,基本图形的生成算法,60,误差项的递推 d20:,2018/8/20,基本图形的生成算法,61,d20:,用上半部分计算的最后点(x,y)来计算下半部分 中d的初值:,2018/8/20,基本图形的生成算法,62,P(xi,yi),Pu(xi1,yi),Pl(

35、xi,yi1),M(xi1,yi0.5),Pd(xi1,yi1)= Pr(xi1,yi1),M(xi0.5,yi1),下半部分的初值,2018/8/20,基本图形的生成算法,63,注意: 1)上半部分的终止判别 2)下半部分误差项的初值 算法步骤: 1.输入椭圆的长半轴a和短半轴b。 2.计算初始值d=b2+a2(-b+0.25)、x=0、y=b。 3.绘制点(x,y)及其在四分象限上的另外三个对称点。 4.判断d的符号。若d0,则先将d更新为d+b2(2x+3),再将(x,y)更新为(x+1,y);否则先将d更新为d+b2(2x+3)+a2(-2y+2),再将(x,y)更新为(x+1,y-1

36、)。 5.当b2(x+1)a2(y-0.5)时,重复步骤3和4。否则转到步骤6。 6.用上半部分计算的最后点(x,y)来计算下半部分中d的初值:,判断法向量的y分量比x分量大,否则,椭圆弧从上半部分转入下半部分,2018/8/20,基本图形的生成算法,65,Filling Polygons,So we can figure out how to draw lines and circles How do we go about drawing polygons? We use an incremental algorithm known as the scan-line algorithm,2

37、018/8/20,基本图形的生成算法,66,2.3 多边形的扫描转换(polygon scan conversion),多边形分为凸多边形、凹多边形、含内环的多边形。 凸多边形是指任意两顶点间的连线均在多边形内; 凹多边形是指任意两顶点间的连线有不在多边形内的部分; 含内环的多边形则是指多边形内再套有多边形,多边形内的多边形也叫内环,内环之间不能相交。,多边形 :由一系列首尾相连的直线段构成的图形称为多边形。,2018/8/20,基本图形的生成算法,67,多边形的表示方法,多边形有两种重要的表示方法:顶点表示和点阵表示。 顶点表示是用多边形的顶点序列来表示多边形。这种表示直观、几何意义强、占内

38、存少,易于进行几何变换,被广泛用于各种几何造型系统中; 点阵表示是用位于多边形内的象素集合来刻画多边形。这种表示丢失了许多几何信息(如边界、顶点),但它是光栅显示图形所需要的表示形式。,多边形的扫描转换: 把多边形的顶点表示转换为点阵表示。,2018/8/20,基本图形的生成算法,68,多边形的扫描转换算法,1)扫描线算法 目标:利用相邻像素之间的连贯性,提高算法效率 处理对象:非自交多边形 (边与边之间除了顶点外无其它交点),2018/8/20,基本图形的生成算法,69,多边形的扫描转换算法,基本思想: 按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充

39、工作。 对于一条扫描线填充过程可以分为四个步骤: 求交:计算扫描线与多边形各边的交点; 排序:把所有交点按x值递增顺序排序; 配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间, 着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。,2018/8/20,基本图形的生成算法,70,一个多边形与若干扫描线,求交排序配对着色,2018/8/20,基本图形的生成算法,71,存在问题1:当扫描线与多边形顶点相交时,交点的取舍问题。,2018/8/20,基本图形的生成算法,72,解决方法:当扫描线与多边形的顶点相交时, 若共享顶点的两条边分别落在扫描线的两

40、边,交点只算一个; 若共享顶点的两条边在扫描线的同一边,这时交点作为零个或两个。 具体实现时,只需检查顶点的两条边的另外两个端点的y值。按这两个y值中大于交点y值的个数是0,1,2来决定。,2018/8/20,基本图形的生成算法,73,0,1,1,1,1,0,2,2,2,2018/8/20,基本图形的生成算法,74, 解决方法:边界象素:规定落在右上边界的象素不予填充。具体实现时,只要对扫描线与多边形的相交区间左闭右开,存在问题2:边界上象素的取舍问题,避免填充扩大化。,2018/8/20,基本图形的生成算法,75,边相关扫描线填充算法描述,扫描线的相关性:某条扫描线上相邻的象素,几乎都具有同

41、样的内外性质,这种性质只有遇到多边形边线与该扫描线的交点时才会发生改变。 边的相关性:由于相邻扫描线上的交点是与多边形的边线相关的。对同一条边,前一条扫描线yi与该边的交点为xi,而后一条扫描线与该边的交点则为 ,利用这种相关性可以省去大量的求交运算。,2018/8/20,基本图形的生成算法,76,边相关扫描线填充算法的实现需要建立两个表: 新边表(NET)和活动边表(AET),1 新边表(New Edge Table) 用来对除水平边外的所有边进行登记, 来建立边的记录。边的记录定义为:,x :当前扫描线与边的交点坐标 x :从当前扫描线到下一条扫描线间x的增量 ymax :该边所交的最高扫

42、描线号,2018/8/20,基本图形的生成算法,77,新边表的构造: (1)首先构造一个纵向扫描线链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点称为一个桶,对应多边形覆盖的每一条扫描线。桶的数据结构定义如下:,Class Bucket public:Bucket();Virtual Bucket();int ScanLine /扫描线AET *P; / 桶上的边表指针Bucket *next; ;,2018/8/20,基本图形的生成算法,78,(2)将每条边的信息链入与该边最小y坐标(ymin )相对应的桶处。也就是说,若某边的较低端点为ymin,则该边就放在相应的扫描线桶中。

43、(3)每条边的数据形成一个结点,内容包括:该扫描线与该边的初始交点x(即较低端点的x值), 1/k,以及该边的最大y值ymax。(4)同一桶中若干条边按X|ymax由小到大排序,若X|ymax 相等,则按照1/k由小到大排序。,2018/8/20,基本图形的生成算法,79,2、活动边表(AET:Active Edge Table) NET表建立以后,就可以开始扫描转换了。对不同的扫描线,与之相交的边线也是不同的,当对某一条扫描线进行扫描转换时,我们只需要考虑与它相交的那些边线,为此需要建立一个只与当前扫描线相交的边记录链表,称之为活动边表。,(a)扫描线6的活性边表:,(b)扫描线7的活性边表

44、:,2018/8/20,基本图形的生成算法,80,设该边的直线方程为:ax+by+c=0,当前扫描线及下一条扫描线与边的 交点分别为(xi, yi ), (xi+1 ,yi+1) 则:由此可得:其中 , 为常数。,算法过程 :,1、根据给出的多边形顶点坐标,建立NET表;求出顶点坐标中最大y值ymax和最小y值ymin。 2、初始化AET表指针,使它为空。 3、执行下列步骤直至NET和AET都为空3.1、如NET中的第y类非空,则将其中的所有边取出并插入AET中;3.2、如果有新边插入AET,则对AET中各边排序;3.3、对AET中的边两两配对,(1和2为一对,3和4为一对,),将每对边中x坐

45、标按规则取整,获得有效的填充区段,再填充3.4、将当前扫描线纵坐标y值递值1;3.5、如果AET表中某记录的ymax=y,则删除该记录 (因为每条边被看作下闭上开的);3.6、对AET中剩下的每一条边的x递增1/k,即x = x+ 1/k ,2018/8/20,基本图形的生成算法,82,如何合并NET AET,(a) 多边形,(b) NET表,(c) AET表,2018/8/20,基本图形的生成算法,83,2)边缘填充算法,有序边表(扫描线)算法 优点:对每个像素只访问一次,与设备无关 缺点:对各种表的维持和排序开销太大,适合软件实现而不适合硬件实现。,由来:光栅图形中,如果某区域已着上值为M

46、的颜色值做偶数次求补运算,该区域颜色不变;而做奇数次求补运算,则该区域颜色变为值为 的颜色。这一规律应用于多边形扫描转换,就为边缘填充算法。,算法基本思想:对于每条扫描线和每条多边形边的交点,将该扫描线上交点右方的所有象素取补。,2018/8/20,基本图形的生成算法,84,算法1:(以扫描线为中心的边缘填充算法),1、将当前扫描线上的所有象素着上值为 的颜色;2、求余:for(i = 0;i = m; i+)在当前扫描线上,从横坐标为Xi的交点向右求补;,2018/8/20,基本图形的生成算法,85,算法2:(以边为中心的边缘填充算法),1、将绘图窗口的背景色置为 ; 2、对多边形的每一条非

47、水平边做:从该边上的每个象素开始向右求补,2018/8/20,基本图形的生成算法,86,3)边界标志算法,基本思想: 在帧缓冲器中对多边形的每条边进行直线扫描转换,亦即对多边形边界所经过的象素打上标志。 然后再采用和扫描线算法类似的方法将位于多边形内的各个区段着上所需颜色。 对每条与多边形相交的扫描线依从左到右的顺序,逐个访问该扫描线上的象素。 使用一个布尔量inside来指示当前点是否在多边形内的状态。Inside的初值为假,每当当前访问的象素为被打上边标志的点,就把inside取反。对未打标志的象素,inside不变。若访问当前象素时,inside为真,说明该象素在多边形内,则把该象素置为

48、填充颜色。,算法过程,2018/8/20,基本图形的生成算法,88,用软件实现时,扫描线算法与边界标志算法的执行速度几乎相同, 但由于边界标志算法不必建立维护边表以及对它进行排序,所以边界标志算法更适合硬件实现,这时它的执行速度比有序边表算法快一至两个数量级。,2018/8/20,基本图形的生成算法,89,2.4 区域填充算法,区域:指已经表示成点阵形式的填充图形,它是象素的集合。 表示方法:内点表示、边界表示 内点表示 枚举处区域内部的所有像素 内部的所有像素着同一个颜色 边界像素着与内部像素不同的颜色 边界表示 枚举出边界上所有的像素 边界上的所有像素着同一颜色 内部像素着与边界像素不同的颜色,2018/8/20,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 计算机应用/办公自动化

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报