计算机图形学教案第5章基本图形生成算法.ppt
第5章 基本图形生成算法本章要解决的问题本章要解决的问题 如如何何在在指指定定的的输输出出设设备备上上根根据据坐坐标标描描述构造基本二维几何图形。述构造基本二维几何图形。图图形形的的生生成成:在在指指定定的的输输出出设设备备上上,根根据据坐坐标标描述构造二维几何图形。描述构造二维几何图形。图图形形的的扫扫描描转转换换:在在光光栅栅显显示示器器等等数数字字设设备备上上确确定定一一个个最最佳佳逼逼近近于于图图形形的的象象素素集集的的过过程程(连连续图形到象素集的转换)。续图形到象素集的转换)。5.1 直线的扫描转换直线的扫描转换 给给定定直直线线两两端端点点P P0 0(x(x0 0,y,y0 0)和和P P1 1(x(x1 1,y,y1 1),画画出该直线。出该直线。要求:要求:直、端点准确、色泽均匀、速度快等。直、端点准确、色泽均匀、速度快等。数值微分法数值微分法(DDA法)直线的微分方程:直线的微分方程:DDA算法原理算法原理:=1/max(|x|,|y|)max(|x|,|y|)=|x|,即|k|1的情况:max(|x|,|y|)=|y|,此时|k|1:注注:round(x)=(int)(x+0.5)void DDAline(int x0,int y0,int x1,int y1)int dx,dy,epsl,k;float x,y,xIncre,yIncre;dx=x1-x0;dy=y1-y0;x=x0;y=y0;if(abs(dx)abs(dy)epsl=abs(dx);else epsl=abs(dy);xIncre=(float)(dx)/epsl;yIncre=(float)(dy)/epsl;for(k=0;k0;对于直线下方的点,F(x,y)0。直线的方程:基本原理基本原理:假定0k1,x是最大位移方向判别式判别式:则有:误差项的递推误差项的递推d0:误差项的递推误差项的递推d0:初始值初始值d的计算的计算0k1时Bresenham算法的算法步骤算法步骤为:1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值x、y、d=0.5-k、x=x0、y=y0;3.绘制点(x,y)。判断d的符号;若d0,则(x,y)更新为(x+1,y+1),d更新为d+1-k;否则(x,y)更新为(x+1,y),d更新为d-k。4.当直线没有画完时,重复步骤3。否则结束。改进改进:用2dx代替d1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值x、y、d=x-2y、x=x0、y=y0。3.绘制点(x,y)。判断d的符号。若dx1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while(x=x1)putpixel(x,y);x+;if(d0.5,则(x,y)更新为(x+1,y+1),同时将d更新为d-1;否则(x,y)更新为(x+1,y)。5.当直线没有画完时,重复步骤3和4。否则结束。改进改进1:令e=d-0.5e初=-0.5,每走一步有e=e+k。if(e0)thene=e-1算法步骤算法步骤为:1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值x、y、e=-0.5、x=x0、y=y0。3.绘制点(x,y)。4.e更新为e+k,判断e的符号。若e0,则(x,y)更新为(x+1,y+1),同时将e更新为e-1;否则(x,y)更新为(x+1,y)。5.当直线没有画完时,重复步骤3和4。否则结束。改进改进2:用2ex来替换ee初=-x,每走一步有e=e+2y。if(e0)thene=e-2x算法步骤算法步骤:1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值x、y、e=-x、x=x0、y=y0。3.绘制点(x,y)。4.e更新为e+2y,判断e的符号。若e0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2x;否则(x,y)更新为(x+1,y)。5.当直线没有画完时,重复步骤3和4。否则结束。void Bhline(int x0,int y0,int x1,int y1)int x,y,dx,dy,e;if(x0 x1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;dx=x1-x0;dy=y1-y0;x=x0;y=y0;e=-dx;while(x0)y+;e=e-2*dx;思考题 对于前述几种直线生成算法和程序:对于前述几种直线生成算法和程序:1.当最大位移方向是当最大位移方向是y时,应如何修改?时,应如何修改?2.要达到通用时,应如何修改?要达到通用时,应如何修改?5.2 圆的扫描转换圆的扫描转换解决的问题:解决的问题:绘绘 出出 圆圆 心心 在在 原原 点点,半半 径径 为为 整整 数数 R的的 圆圆x2+y2=R2 八分法画圆八分法画圆(y,x)(-y,x)(-x,y)(-x,-y)(-y,-x)(y,-x)(x,-y)解决问题解决问题:八分法画圆程序:八分法画圆程序:void circlePoint(int x,int y)putpixel(x,y);putpixel(y,x);putpixel(-y,x);putpixel(-x,y);putpixel(-x,-y);putpixel(-y,-x);putpixel(y,-x);putpixel(x,-y);考虑通用:考虑通用:void circlePoint(int x0,int y0,int x,int y)putpixel(x-x0,y-y0);putpixel(y-x0,x-y0);putpixel(-y+x0,x-y0);putpixel(-x+x0,y-y0);putpixel(-x+x0,-y+y0);putpixel(-y+x0,-x+y0);putpixel(y-x0,-x+y0);putpixel(x-x0,-y+y0);简单方程产生圆弧简单方程产生圆弧算法原理算法原理:利用其函数方程,直接离散计算圆的函数方程为:圆的极坐标方程为:中点中点Bresenham画圆画圆构造函数构造函数F(x,y)=x2-y2-R2。对于圆上的点,有对于圆上的点,有F(x,y)=0;对于圆外的点,对于圆外的点,F(x,y)0;而对于圆内的点,而对于圆内的点,F(x,y)0时:下一点取Pd(xi+1,yi-1)。构造判别式构造判别式:误差项的递推误差项的递推d0:d0:判别式的初始值判别式的初始值算法步骤算法步骤:1.输入圆的半径R。2.计算初始值d=1.25-R、x=0、y=R。3.绘制点(x,y)及其在八分圆中的另外七个对称点。4.判断d的符号。若d0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。5.当xy时,重复步骤3和4。否则结束。改进:用改进:用d-0.25代替代替d算法步骤:算法步骤:1.输入圆的半径输入圆的半径R。2.计算初始值计算初始值d=1-R、x=0、y=R。3.绘制点绘制点(x,y)及其在八分圆中的另外七个对称点。及其在八分圆中的另外七个对称点。4.判判断断d的的符符号号。若若d0,则则先先将将d更更新新为为d+2x+3,再再将将(x,y)更更新新为为(x+1,y);否否则则先先将将d更更新新为为d+2(x-y)+5,再将,再将(x,y)更新为更新为(x+1,y-1)。5.当当xy时,重复步骤时,重复步骤3和和4。否则结束。否则结束。d0.25中点中点Bh画圆程序画圆程序void MidBhcircle(int r)int x,y,d;x=0;y=r;d=1-r;while(xy)circlePoint(x,y);if(d0)d+=2*x+3;else d+=2*(x-y)+5;y-;x+;5.3 椭圆的扫描转换椭圆的扫描转换椭圆的特征椭圆的特征椭圆上:F(x,y)=0椭圆内:F(x,y)0只需计算第一象限四分椭圆以弧上斜率为1的点作为分界将第一象限椭圆弧分为上下两部分。两部分的最大位移方向不同引理引理5-1:若在当前中点,法向量的y分量比x分量大,即而在下一个中点,不等号改变方向,则说明椭圆弧从上部分转入下部分。法向量法向量椭圆的中点椭圆的中点Bresenham算法算法算法原理算法原理x步长为1y步长为1先推导上半部分的椭圆绘制公式判别式判别式若d10,取Pu(xi+1,yi)若d10,取Pd(xi+1,yi-1)误差项的递推误差项的递推d10:d10:判别式的初始值判别式的初始值再来推导椭圆弧下半部分的绘制公式原理原理判别式判别式若d20,取Pl(xi,yi-1)若d20,取Pr(xi+1,yi-1)5-19 下半部分椭圆弧的绘制原理p(xi,yi)pl(xi,yi-1)pr(xi+1,yi-1)M(xi+0.5,yi-1)误差项的递推误差项的递推d20:d20:注意注意:上半部分的终止判别:b2(x+1)a2(y-0.5)下半部分误差项的初值:用上半部的用上半部的(x,y)计算计算算法步骤算法步骤: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)。5.当b2(x+1)0时,重复步骤7和8。否则结束。第一象限椭圆弧的扫描转换程序第一象限椭圆弧的扫描转换程序voidMidBhllipse(inta,intb)intx,y;floatd1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);putpixel(x,y);putpixel(-x,-y);putpixel(-x,y);putpixel(x,-y);while(b*b*(x+1)a*a*(y-0.5)if(d10)if(d2=0)d2+=b*b*(2*x+2)+a*a*(-2*y+3);x+;y-;else d2+=a*a*(-2*y+3);y-;putpixel(x,y);putpixel(-x,-y);putpixel(-x,y);putpixel(x,-y);5.4 多边形的扫描转换与区域填充多边形的扫描转换与区域填充多边形的扫描转换多边形的扫描转换多边形填充多边形填充 给定多边形顶点,填充多边形多边形内给定多边形顶点,填充多边形多边形内的所有点。的所有点。区域填充区域填充种子填充种子填充 给定区域内的一点(种子),填充围定给定区域内的一点(种子),填充围定该点的边界内的所有点。该点的边界内的所有点。多边形的扫描转换多边形的扫描转换 从多边形从多边形顶点表示顶点表示到到点阵表示点阵表示的转换。的转换。顶点表示顶点表示:用多边形的顶点序列来刻划多边形。用多边形的顶点序列来刻划多边形。点点阵阵表表示示:用用位位于于多多边边形形内内的的象象素素的的集集合合来来刻刻划多边形。划多边形。x-扫描线算法扫描线算法基本思想基本思想用水平扫描线扫描填充多边形区域算法步骤:算法步骤:(1)(1)确确定定多多边边形形所所占占有有的的最最大大扫扫描描线线数数,得得到到多边形顶点的最小和最大多边形顶点的最小和最大y y值(值(y yminmin和和y ymaxmax)。)。(2)(2)从从y=yy=yminmin到到y=yy=ymaxmax,每每次次用用一一条条扫扫描描线线进进行行填充。填充。(3)(3)对一条扫描线填充的过程可分为四个步骤:对一条扫描线填充的过程可分为四个步骤:a.a.a.a.求交求交求交求交 b.b.b.b.排序排序排序排序c.c.c.c.交点配对交点配对交点配对交点配对 d.d.d.d.区间填色区间填色区间填色区间填色存存在在问问题题:当扫描线与多边形顶点相交时,交点的取舍问题。解决解决:当扫描线与多边形的顶点相交时,当扫描线与多边形的顶点相交时,若若共共享享顶顶点点的的两两条条边边分分别别落落在在扫扫描描线线的的两两边边,交点只算一个;交点只算一个;若若共共享享顶顶点点的的两两条条边边在在扫扫描描线线的的同同一一边边,这这时交点作为零个或两个。时交点作为零个或两个。011110222改进的有效边表算法(改进的有效边表算法(Y连贯性算法)连贯性算法)改进原理改进原理:处理一条扫描线时,仅对有效边求交利用扫描线的连贯性利用多边形边的连贯性有有效效边边:指指与与当当前前扫扫描描线线相相交交的的多多边边形形的的边边,也称为活性边。也称为活性边。有有效效边边表表:把把有有效效边边按按与与扫扫描描线线交交点点x x坐坐标标递递增增的的顺顺序序存存放放在在一一个个链链表表中中,此此链链表表称称为为有效边表。有效边表。有效边表的每个结点有效边表的每个结点:x ymax 1/k next x ymax 1/k next边表的构造:边表的构造:(1)(1)首首先先构构造造一一个个纵纵向向链链表表,链链表表的的长长度度为为多多边边形形所所占占有有的的最最大大扫扫描描线线数数,链链表表的的每每个个结结点点称称为为一一个个桶桶,对对应应多多边边形形覆覆盖盖的的每每一一条条扫扫描线。描线。(2)(2)将将每每条条边边的的信信息息链链入入与与该该边边最最小小y y坐坐标标(y ymin min)相相对对应应的的桶桶处处。即即:若若某某边边的的较较低低端端点为点为y yminmin,则该边就放在相应的扫描线桶中。,则该边就放在相应的扫描线桶中。(3)(3)每条边的数据形成一个结点,内容包括:每条边的数据形成一个结点,内容包括:该扫描线与该边的初始交点该扫描线与该边的初始交点x x(即较低端点(即较低端点的的x x值),值),1/k1/k,以及该边的最大,以及该边的最大y y值值y ymaxmax。x|x|ymin ymin y ymax max 1/k NEXT1/k NEXT(4)(4)同一桶中若干条边按同一桶中若干条边按X|X|yminymin由小到大排序,由小到大排序,若若X|X|ymaxymax 相等,则按照相等,则按照1/k1/k由小到大排序。由小到大排序。解决顶点交点计为解决顶点交点计为1时的情形时的情形:算法步骤:算法步骤:(1)(1)初始化:构造边表,初始化:构造边表,AETAET表置空;表置空;(2)(2)将第一个不空的将第一个不空的ETET表中的边与表中的边与AETAET表合并;表合并;(3)(3)由由AETAET表表中中取取出出交交点点对对进进行行填填充充。填填充充之之后后删除删除y=yy=ymaxmax的边;的边;(4)y(4)yi+1i+1=y=yi i+1,+1,根根据据x xi+1i+1=x=xi i+1/k+1/k计计算算并并修修改改AETAET表表,同同时时合合并并ETET表表中中y=yy=yi+1i+1桶桶中中的的边边,按按次次序序插插入入到到AETAET表中,形成新的表中,形成新的AETAET表;表;(5)AET(5)AET表不为空则转表不为空则转(3)(3),否则结束。,否则结束。36-1/335 3/485-1/289 1/2当前边表p3p2p3p4p5p4p5p636-1/389 1/2当前边表p5p6p3p21122/589 1/2当前边表p2p1p5p61122/5当前边表712-179 5p2p1p0p1p0p689 1/2p5p61122/5当前边表712-1p2p1p0p1边缘填充算法边缘填充算法基本思想:基本思想:按任意顺序处理多边形的每条边,对于每条扫描线和每条多边形边的交点,将该扫描线上交点右方右方的所有象素取补取补。算法依据:算法依据:多边形外的象素总是被访问多边形外的象素总是被访问偶数次,而多边形内的象素总偶数次,而多边形内的象素总是被访问奇数次。是被访问奇数次。对象素作对象素作偶数次取补偶数次取补则颜色不变则颜色不变,作奇数次,作奇数次取补则颜色取补则颜色被改变。被改变。算法特点:算法特点:处理边的顺序任意处理边的顺序任意适合用于具有帧缓存的图形系统适合用于具有帧缓存的图形系统算法简单算法简单 每一象每一象素可能被素可能被访问多次访问多次 栅栅栏填充算法栏填充算法 引入栅栏,以减少填充算法访问象素的次数引入栅栏,以减少填充算法访问象素的次数引入栅栏,以减少填充算法访问象素的次数引入栅栏,以减少填充算法访问象素的次数。栅栏栅栏栅栏栅栏:与扫描线垂直的直线,通常过一顶点,且把多边形分为左右二半。基本思想:扫描线与多边形的边求交,将交点与基本思想:扫描线与多边形的边求交,将交点与基本思想:扫描线与多边形的边求交,将交点与基本思想:扫描线与多边形的边求交,将交点与栅栏之间的象素取补。栅栏之间的象素取补。栅栏之间的象素取补。栅栏之间的象素取补。减少了象素重复访问数目,但不彻底减少了象素重复访问数目,但不彻底减少了象素重复访问数目,但不彻底减少了象素重复访问数目,但不彻底。边界标志算法边界标志算法对多边形的每一条边进行扫描转换,即对对多边形的每一条边进行扫描转换,即对多边形边界所经过的象素作一个多边形边界所经过的象素作一个边界标志边界标志。填充填充。对每条与多边形相交的扫描线,按。对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的象从左到右的顺序,逐个访问该扫描线上的象素,素,根据标志决定象素点的内外状态根据标志决定象素点的内外状态。适合于硬件实现适合于硬件实现 区域填充算法区域填充算法区域区域 指已经表示成点阵形式的填充图形,它是指已经表示成点阵形式的填充图形,它是象素的集合。象素的集合。区域填充区域填充 指先将区域的一点赋予指定的颜色,然后指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。区域填充算将该颜色扩展到整个区域的过程。区域填充算法要求区域是连通的。法要求区域是连通的。内点表示内点表示 泛填充算法泛填充算法 枚举区域内部像素枚举区域内部像素 内部像素着同一颜色内部像素着同一颜色 边界与内部像素颜色不边界与内部像素颜色不同同边界表示边界表示 边界填充算法边界填充算法 枚举边界像素枚举边界像素 边界上像素着同一颜色边界上像素着同一颜色 内部像素与边界颜色不内部像素与边界颜色不同同4 4连通:连通:8 8连通:连通:区域填充要求区域是连通的区域填充要求区域是连通的边界填充算法边界填充算法算法的输入:算法的输入:种子点坐标种子点坐标(x,y)(x,y)填充色和边界颜色填充色和边界颜色栈结构实现栈结构实现4-4-连通边界填充算法的算法步骤连通边界填充算法的算法步骤为:为:种种子子象象素素入入栈栈;当当栈栈非非空空时时重重复复执执行行如如下下三三步步操作:操作:栈顶象素出栈;栈顶象素出栈;将出栈象素置成填充色;将出栈象素置成填充色;检检查查出出栈栈象象素素的的4-4-邻邻接接点点,若若有有非非边边界界色色象素点且未置成多边形色,则把该象素入栈。象素点且未置成多边形色,则把该象素入栈。特点:特点:可以用于填充带有内孔的平面区域。可以用于填充带有内孔的平面区域。把太多的象素压入堆栈。把太多的象素压入堆栈。改进改进 通通过过沿沿扫扫描描线线填填充充水水平平象象素素段段,来来代代替替处处理理4-4-邻接点和邻接点和8-8-邻接点。邻接点。基于扫描线的基于扫描线的基于扫描线的基于扫描线的4-4-4-4-连通边界填充算法步骤:连通边界填充算法步骤:连通边界填充算法步骤:连通边界填充算法步骤:种子象素入栈;当栈非空时作如下三步操作:种子象素入栈;当栈非空时作如下三步操作:栈顶象素出栈;栈顶象素出栈;填填充充出出栈栈象象素素所所在在扫扫描描行行的的连连续续象象素素段段,直直到到遇遇到到边边界界象象素素为为止止,即即每每出出栈栈一一个个象象素素,就就对对包包含含该该象象素的整个扫描线区间进行填充;素的整个扫描线区间进行填充;在在区区间间中中检检查查与与当当前前扫扫描描线线相相邻邻的的上上下下两两条条扫扫描描线线的的有有关关象象素素是是否否全全为为边边界界象象素素或或已已填填充充的的象象素素,若若存存在在非非边边界界、未未填填充充边边界界的的象象素素,则则把把每每一一区区间间的的最最右象素取作种子象素入栈。右象素取作种子象素入栈。泛填充算法泛填充算法算算法法的的输输入入:种种子子点点坐坐标标(x,y)(x,y),填填充充色色和和内内部点的颜色。部点的颜色。算法原理:算法原理:算算法法从从指指定定的的种种子子(x,y)(x,y)开开始始,用用所所希希望望的的填填充充颜颜色色赋赋给给所所有有当当前前为为给给定定内内部部颜颜色色的的象象素点。素点。4-4-连通泛填充算法步骤如下:连通泛填充算法步骤如下:种种子子象象素素入入栈栈;当当栈栈非非空空时时重重复复执执行行如如下下三步操作:三步操作:栈顶象素出栈;将出栈象素置成填充色;检查出栈象素的4-邻接点,若其中某个象素点是是给给定定内内部部点点的的颜颜色色且未置成新的填充色,则把该象素入栈。其他相关的概念其他相关的概念奇偶规则奇偶规则从任意位置p作一条射线,若与该射线相交的多边形边的数目为奇数,则p是多边形内部点,否则是外部点。非零环绕数规则非零环绕数规则 首先使多边形的边变为矢量。首先使多边形的边变为矢量。将环绕数初始化为零。将环绕数初始化为零。再再从从任任意意位位置置p p作作一一条条射射线线。当当从从p p点点沿沿射射线线方方向向移移动动时时,对对在在每每个个方方向向上上穿穿过过射射线线的的边边计计数数,每每当当多边形的边从右到左穿过射线时,环绕数加1,从左到右时,环绕数减1。处处理理完完多多边边形形的的所所有有相相关关边边之之后后,若环绕数为非零,则p为内部点,否则,p是外部点。曲线边界区域的填充曲线边界区域的填充关键在于扫描线与曲线的相交计算。关键在于扫描线与曲线的相交计算。5.5 5.5 字符处理字符处理ASCII码码:“美国信息交换用标准代码集”(American Standard Code for InformationInterchange),简称ASCII码。国国标标码码:“中华人民共和国国家标准信息交换编码,简称为国标码,代号GB231280。字库字库:字库中储存了每个字符的图形信息。矢量字库矢量字库和点阵字库点阵字库 点阵字符点阵字符 内存中用一个内存中用一个点阵位图点阵位图来表示一个字符,来表示一个字符,输出时根据点阵位图形成字符的象素图案。输出时根据点阵位图形成字符的象素图案。点阵字符点阵字符特点:特点:(1)占空间小,且规则。)占空间小,且规则。(2)不便缩放。)不便缩放。适用于小字。适用于小字。矢量字符矢量字符 采采用用直直线线和和曲曲线线段段来来描描述述字字符符形形状状,矢矢量量字符库中记录的是字符库中记录的是笔划信息笔划信息。显示时:解释字符的每个笔划信息显示时:解释字符的每个笔划信息矢量字符矢量字符特点:特点:(1)占空间大,且不规则。)占空间大,且不规则。(2)便于无级缩放。)便于无级缩放。5.6 5.6 属性处理属性处理 字符的字符的属性属性包括:亮度、颜色包括:亮度、颜色 、线型等。、线型等。输出时由输出时由当前属性表当前属性表确定字符的属性。确定字符的属性。当前属性表当前属性表可以可以设置和更改。设置和更改。线型和线宽线型和线宽线型处理线型处理 可用象素模板指定实可用象素模板指定实心段和空白段的长度。心段和空白段的长度。存存在在问问题题:如如何何保保持持任任何何方方向向的的划划线线长长度度近近似似地相等。地相等。可根据线的斜率来调整实心段和中间空白段的象素数目。可根据线的斜率来调整实心段和中间空白段的象素数目。解决:解决:线刷子和方刷子处理线宽线刷子和方刷子处理线宽 线刷子:线刷子:垂直刷子、水平刷子垂直刷子、水平刷子特点特点 实现简单、效率高。实现简单、效率高。斜线与水平斜线与水平(或垂直或垂直)线不一样粗。线不一样粗。当当线线宽宽为为偶偶数数个个象象素素时时,线线的的中中心心将将偏偏移移半半个象素。个象素。利利用用线线刷刷子子生生成成线线的的始始末末端端总总是是水水平平或或垂垂直直的,看起来不太自然。的,看起来不太自然。解决:添加解决:添加“线帽(线帽(line capline cap)”当当比比较较接接近近水水平平的的线线与与比比较较接接近近垂垂直直的的线线汇汇合时,汇合处外角将有缺口合时,汇合处外角将有缺口解解决决:斜角连接(miterjoin)、圆连接(roundjoin)、斜切连接(beveljoin)方刷子:方刷子:特点特点:方刷子绘制的线条(斜线)比用线刷子所绘制的线条要粗一些方刷子绘制的斜线与水平(或垂直)线不一样粗方刷子绘制的线条自然地带有一个“方线帽”其它线宽处理方式其它线宽处理方式 区域填充区域填充 改变刷子形状改变刷子形状:曲线的线型和线宽曲线的线型和线宽 线型:线型:可采用象素模板的方法可采用象素模板的方法线宽:线宽:线刷子线刷子 方刷子方刷子要要显显示示一一致致的的曲曲线线宽宽度度可可通通过过旋旋转转刷刷子子方向以使其在沿曲线移动时与斜率方向一致方向以使其在沿曲线移动时与斜率方向一致,圆弧刷子圆弧刷子采用填充的办法。采用填充的办法。字符的属性字符的属性 字体、字形、字号、字间距、行间距等等。一般字体确定风格,字形确定外观,字号确定尺寸。字符的常用属性字符串的属性字符串的属性 文文本本高高度度、文文本本宽宽度度(扩扩展展/压压缩缩因因子子)、字字符符方方向向、文文本本路路径径方方向向、对对齐齐方方式式(左左对对齐齐,中中心心对对齐齐,或或右右对对齐齐,指指定定起起始始、终终止止点)、文本字体、字符的颜色属性等。点)、文本字体、字符的颜色属性等。反反绘绘(从从右右到到左左)、倒倒绘绘(旋旋转转180180)、写方式(替换或与方式)等。写方式(替换或与方式)等。区域填充属性区域填充属性区域填充属性选择包括颜色、图案和透明度。区域填充属性选择包括颜色、图案和透明度。根据图案和透明度属性来填充平面区域的基本思想根据图案和透明度属性来填充平面区域的基本思想是:是:首先用模板定义各种图案。首先用模板定义各种图案。然后,修改填充的扫描转换算法:在确定了区域内然后,修改填充的扫描转换算法:在确定了区域内一象素之后,不是马上往该象素填色而是先查询模板一象素之后,不是马上往该象素填色而是先查询模板位图的对应位置。位图的对应位置。若是以透明方式填充图案若是以透明方式填充图案,则当模,则当模板位图的对应位置为板位图的对应位置为1 1时,用前景色写象素,否则,不时,用前景色写象素,否则,不改变该象素的值。改变该象素的值。若是以不透明方式填充图案若是以不透明方式填充图案,则视,则视模板位图对应位置为模板位图对应位置为1 1或或0 0来决定是用前景色还是背景来决定是用前景色还是背景色去写象素。色去写象素。确定区域与模板之间的位置关系(对齐方式)确定区域与模板之间的位置关系(对齐方式):一种对齐方式是把有模板原点与填充区域一种对齐方式是把有模板原点与填充区域边界或内部的某点对齐边界或内部的某点对齐一种对齐方式是把模板原点与填充区域外一种对齐方式是把模板原点与填充区域外部的某点对齐部的某点对齐5.7 5.7 反走样反走样 用用离离散散量量表表示示连连续续量量引引起起的的失失真真,就就叫叫做做走样走样(Liasing)。)。图5-48 绘制直线时的走样现象走样现象:走样现象:一是光栅图形产生的阶梯形一是光栅图形产生的阶梯形一一是是图图形形中中包包含含相相对对微微小小的的物物体体时时,这这些些物物体体在在静静态态图图形形中中容容易易被被丢丢弃弃或或忽忽略略,在在动画序列中时隐时现,产生闪烁动画序列中时隐时现,产生闪烁用于减少或消除这种效果的技术,称反反走走样样(antialiasing)。一种简单方法:提高设备分辨率提高设备分辨率过取样(过取样(supersampling),或后滤波后滤波区域取样(区域取样(area sampling),或前滤波前滤波过取样过取样简单过取样简单过取样克服走样的原理?克服走样的原理?颜色过度颜色过度重叠过取样重叠过取样基于加权模板的过取样基于加权模板的过取样强调中心点的影响,按距离加权强调中心点的影响,按距离加权 简单的区域取样简单的区域取样象素点的亮度设置成与线条重合的面积成正比象素点的亮度设置成与线条重合的面积成正比如何计算直线段与象素相交区域的面积如何计算直线段与象素相交区域的面积?图5-56 重叠区域面积的计算DkD/kD(a)(b)1/2DD/k可用一种求相交区域的近似面积的离散计算方法:可用一种求相交区域的近似面积的离散计算方法:(1)(1)将屏幕象素分割成将屏幕象素分割成n n个更小的子象素,个更小的子象素,(2)(2)计算中心落在直线段内的子象素的个数计算中心落在直线段内的子象素的个数m m,(3)(3)m/nm/n为线段与象素相交区域面积的近似值。为线段与象素相交区域面积的近似值。特点:特点:直直线线段段对对一一个个象象素素亮亮度度的的贡贡献献与与两两者者重重叠叠区区域域的的面面积成正比积成正比 相同面积的重叠区域对象素的贡献相同相同面积的重叠区域对象素的贡献相同 加权区域取样加权区域取样加权区域取样原理加权区域取样原理假假想想一一个个连连续续的的加加权权曲曲面面(或或过过滤滤函函数数)覆覆盖盖象象素素。当当直直线线条条经经过过该该象象素素时时,该该象象素素的的灰灰度度值值是是在在二二者者重重叠区域上对滤波器(过滤函数)进行积分的积分值。叠区域上对滤波器(过滤函数)进行积分的积分值。特点:特点:接接近近理理想想直直线线的的象象素素将将被被分分配配更更多多的的灰度值;灰度值;相相邻邻两两个个象象素素的的滤滤波波器器相相交交,有有利利于于缩小直线条上相邻象素的灰度差。缩小直线条上相邻象素的灰度差。