1、圆的内接正多边形迫近法(1),内接正n边形顶点,图4-6圆的多边形迫近,圆的内接正多边形迫近法(2),圆的内接正多边形迫近法(3),使用增量计算确定多边形顶点(可取最高点为初始点):,同理:,圆的内接正多边形迫近法(4),上述递推公式可用矩阵形式表示为:,可以证明:该递推公式关于误差稳定。,圆的内接正多边形迫近法(5),改进的增量计算:使用两个初始点,该递推公式关于误差稳定,1.直线线宽的处理在产生一定宽度的线条时,只需用一个“刷子”来替代单象素直线段中扫描生成的单象素即可.,线画图元的属性控制,(1)线刷子 原理:假设直线斜率在-1,+1之间,如图(a)所示.这时可把刷子置成垂直方向图(b)
2、.首先将刷子的中点对准直线的一个端点,从该点开始,让刷子中点沿直线的轨迹往直线的另一端点平移即可“刷出”具有一定宽度的直线.如图(c).,m1,m2,(a),(b),(c),线画图元的属性控制,缺点:(1)线的始末断总是水平或垂直的.(2)线的粗细不一样.水平和垂直线最粗,45斜线最 细.(3) 当线宽为偶数个时,绘制的线条宽度不精确.,线画图元的属性控制,(2)方形刷子方形刷子是一个宽度为指定线宽的正方形.将正方形的中心对准直线作平移运动即可.该方法将会重复的写象素.为避免重复,可采用与活化边表类似的技术.,m1,方形刷子,线画图元的属性控制,(3)区域填充法先算出直线的四个角点的坐标,将其
3、顺序连接成一个四边形,再用区域填充的方法将四边形填充.,线画图元的属性控制,2.圆弧线宽的处理圆弧线宽的处理与直线类似.3.线型的处理如虚线、实线、点划线等不同线的处理.,线画图元的属性控制,一.扫描转换矩形二.多边形的扫描转换,二维填充图元的生成,区域填充算法,确定待填充的象素,即检查光栅的每一像素是否位于多边形区域内,解决的主要问题是什么?,图案填充还有一个什么象素填什么颜色的问题 曲线围成的区域,可用多边形逼近,矩形的扫描转换,可利用矩形的简单性提高扫描转换的效率。,问题:共享边界的绘制? 解决:象素中心定位于矩形的左、下边界时绘制象素点。,“下闭上开”、“左闭右开”原则!,二.多边形的
4、扫描转换,多边形的表示方法:,多边形的扫描转换: 从顶点表示转换为点阵表示形式,以便于光栅显示的实现。,顶点表示,点阵表示,多边形扫描转换算法分类,以点为中心的填充算法: 逐点判别算法 以扫描线为中心的填充算法: 扫描线算法 (多边形有序边表填充算法) 边缘填充算法 种子填充算法:从区域内部一点开始填充直至边界。 递归填充算法 扫描线算法*,1.逐点判别的填充算法,算法流程: 逐个判别绘图窗口中的象素点是否在多边形区域内,点在多边形内的判别: 射线法累计角度法编码法,绘制多边形内的点,点在多边形内的判别(1),射线法,注意:避免射线穿过顶点,原则:若交点为偶数个,则点在多边形之外;若交点为奇数
5、个,则点在多边形之内;,射线法检验交点数,交点数=偶数(包括0) 点在多边形之外,交点数=奇数 点在多边形之内,左闭右开,点在多边形内的判别(2),累计角度法,检验夹角之和,若夹角和为0,则点p在多边形外,若夹角和为360,则点p在多边形内,点在多边形内的判别(3),编码方法:是累计角度法的离散计算方法。,预处理:对测试点落在多边形边界上的情形做单独处理。 以测试点为原点建立局部坐标系,并顺序编码各象限(如图),多边形顶点编码与其所在象限的编码相同 多边形边界线段的编码定义为其顶点编码之差 计算多边形边界线段编码之和 和为0则测试点落在多边形外 和为4则测试点落在多边形内,点在多边形内的判别(
6、4),编码法注意事项: 为保证边界线段编码的唯一性规定:编码值在-2,2之间(对应 ) 故令线段编码作如右处理:33-4=-1;-3-3+4=1 边界线段编码为 时也需做特殊处理:,插入线段中点,并令线段编码等于两个子线段编码之和(该过程可递归执行),逐点判别方法的特点,程序简单,实现方便效率低下,2.扫描线算法,扫描线:光栅扫描显示器的一行象素点叫一条扫描线,(1)区域的连贯性,设多边形P的顶点是Pi=(xi,yi),i=0,1,2,n,又设yi0,yi1,yin是各顶点Pi的纵坐标yi的递减数列即yikyik+1,0 k n-1 屏幕上位于yik和yik+1两条扫描线之间的长方形区域被P
7、的边分割成若干梯形(三角形可看作其中一底边长为零的梯形),这些梯形具有下列性质:,梯形的两底边分别在y=yik和y=yik+1扫描线上,腰边在P的边上或在屏幕的边界上; 这些梯形分为两类:一类在P内,一类在P外; 两类相间排列.,(1)区域的连贯性,q,设e为一整数,yi0eyin,y=e 的扫描线与多边形的边Pi-1Pi的交点横坐标记为xei假设y=e 扫描线与多边形各边交点横坐标的递增序列为:xei1, xei2 , xei3 ,. , xeim (1),(2)扫描线的连贯性,则由区域的连贯性,可知交点序列有如下性质: m是偶数,即共有偶数个交点;,在该扫描线上,只有区段( xeik, x
8、eik+1) (k=1,3, m-1)位于多边形P内,其余区段都在P外 .,扫描线的连贯性 边的连贯性扫描线的连贯性是多边形区域连贯性在一条扫描线上的反映.,P0,P1,P2,P4,P5,P7,P8,P3,P6,P0,P1,P2,P4,P5,P7,P8,P3,P6,y=e,y=d,设d=e-1,y=d的扫描线与P的边的交点序列为xdj1, xdj2, xdj3,xdjn (2)若多边形P的一条边Pr-1Pr与扫描线y=d,y=e都相交,则由xdr可推出xer:xer=xdr+1/m m是边Pr-1Pr的斜率,(3)边的连贯性,设边的直线斜率为 k,若 y=yi 时,x=xi,则当y=yi+1时
9、,xi+1=xi+1/k。,若yike,dyik+1,即和扫描线e相交的边与和扫描线d相交的边都一样,则有以下边的连贯性:两交点序列元素的个数相等,即m=n;点(xeir,e)与(xdjr,d)位于多边形P的同一条边上,即ir=jr。 xeir= xdjr+1/m,(3)边的连贯性,当扫描线与多边形P的顶点相交时,则称该交点为奇异点。,(4)奇异点的处理,对奇异点的处理如下:首先将奇点分为两类:极值点和非极值点.,对点Pi, 若(yi-1- yi)*(yi+1- yi) 0则称Pi为极值点;否则,称之为非极值点。,(4)奇异点的处理,对左下角为(1,1),右上角为(3,3)的正方形填充时,若对
10、边界上所有象素都进行填充,就得到面积为3x3的区域,如下图(a);而实际面积只有2x2.显然,这是由于对边界上所有象素未加处理而引起的.为此,在填充时,采用“左闭右开”,“下闭上开”的原则对扫描线进行填充.如下图(b).,(4)奇异点的处理,对非极值点,将按一个交点处理; 对极值点,若其是局部最高点,则按0个交点处理;若其是局部最低点,则按2个交点处理。,(4)奇异点的处理,对非极值点的处理,对局部最高点的处理,(4)奇异点的处理,算法步骤:,(5)扫描线算法的数据结构与实现步骤,1.求交。对每条扫描线(y=y0,y= y0 +1,y= y0+2.),求与多边形各边的交点; 2.按x坐标递增方
11、式对交点排序; 3.在每一对交点之间,着指定象素值.交点总数为偶数个。,基本思想:对于每一条扫描线和每条多边形边的交点 (x1,y1),将该扫描线上交点右方的所有象素取补.对多边形的每条边做此处理,多边形的顺序随意. 该算法的优点是简单,缺点是对复杂图形,每一象素可能被访问多次,输入输出的量比较大.,3.边缘填充算法,扫描线算法:对每条扫描线,首先计算它与扇形区域边界的交点,再把配对交点之间的像素用指定颜色填充。,*三.扫描转换扇形区域,区域(种子)填充是指先将区域内的一点(种子点)赋予给定颜色,然后将颜色扩充到整个区域内的过程(染色过程). 区域:已经表示成点阵形式的象素集合,具有相同颜色.
12、,区域填充(种子填充算法) (1),区域的两种表示:内点表示、边界表示.边界表示:给位于边界上的所有象素着色,而区 域内不着色.,内点表示:给区域内所有象素都着上同一种颜色(特征值),边界上pixel不着色.,区域填充(2),要求:区域具有一定的连通性:4连通或8连通4连通区域:取区域内任意两点,在该区域内(不能通过区域外的点),若从其中一点出发,通过上、下、左、右 四种运动可到达另一点时,则称该区域为4连通区域.,区域填充(3),4连通运动方向,8连通运动方向,区域填充(4),允许从4个方向搜索下一个象素的填充算法称为是四向填充算法,允许从8个方向搜索下一个象素的填充算法称为是8向填充算法,
13、区域填充(5),算法思想:设G为一内点表示的区域,(x,y)是G内一点,以(x,y)为种子点,先将(x,y)置为newcolor,然后对(x,y)的4(或8)领域进行递归处理,逐步将整个区域G置为newcolor.,(1)递归算法,void FloodFill4(int x, int y, int oldColor, int newColor)if (GetPixel(x,y)=oldColor) PutPixel(x,y,newColor);FloodFill4(x,y+1,oldColor,newColor);FloodFill4(x,y-1,oldColor,newColor);Floo
14、dFill4(x-1,y,oldColor,newColor);FloodFill4(x+1,y,oldColor,newColor);,算法,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,举例:,算法: (1)填充并确定种子点所在的区段;(2)将种子区段压栈;(3)若堆栈非空,栈顶区段出栈;否则算法 结束;(4)填充并确定新的区段, 将其区段信息压栈.5.以图象填充区域,*(2)扫描线算法,1.点阵字符在点阵字符库中,每个字符都定义成一个称为字符掩膜的矩阵.矩阵中的每个元素都是一位二进制数.该位为1,表示字符经过此位,对应于该位的象素应置为字符颜色;为0,不经过.,字符的表示和输出,点阵字符,2.矢量字符矢量型字符库采用矢量代码序列表示字符的各个笔画.3.字型技术,字符的表示和输出(2),矢量字符,-1,落笔,抬笔,