欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    四讲二维图形填充ppt课件.ppt

    • 资源ID:3197784       资源大小:800.51KB        全文页数:34页
    • 资源格式: PPT        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    四讲二维图形填充ppt课件.ppt

    ,第四讲:二维图形填充,内容摘要,区域填充 有序边表算法 边填充算法 边标志算法 种子填充算法 圆域的填充 线宽与线型的处理 直线线宽的处理(笔型:线、方形) 圆弧线宽的处理(笔型:线、方形) 线型的处理,内容摘要,字符 矢量字符 点阵字符 字型技术 字符裁剪 反走样基础 提高分辩率 简单的区域反走样算法 卷积积分与反走样算法 半色调技术,有序边表算法,一般多边形的填充过程,对于一条扫描线Y值,可以分为四个步骤: 求交点X:计算扫描线与多边形各边的交点X的值; 排序:把所有相交点x按递增顺序进行排序; 交点配对:第一个与第二个,第三个与第四个等等。每对交点就代表扫描线与多边形的一个相交区间; 区间填色:把这些相交区间内的象素置成多边形色,把相交区间外的象素置成背景色。 特殊顶点处理: P1、P3情况:相同交点取1个; P2、P5情况:相同交点取2个; P4、P6情况:相同交点取0个; (下闭上开原则,防止填充扩大化),填充扩大化问题的解决,采用下闭上开、左闭右开原则,防止填充扩大化。 例如填充左下角为(1,1),右上角为(3,3)的区域,得到的图形如图所示九个象素被点亮,而实际区域应是黄区所示。 采取的措施:在具体实现时,只要对扫描线与多边形的相交区间取“左闭右开”。在上述讨论中,当扫描线与多边形顶点相交时,所使用的交点取舍的方法,保证了多边形的“下闭上开”,丢弃上方水平边以及上方非水平边上作为局部最高点的顶点。,如左图,活性边与活性边表处理方法,一个多边形与若干扫描线。,为了计算每条扫描线与多边形各边的交点,最简单的方法是把多边形的所有边放在一个表中。在处理每条扫描线时,按顺序从表中取出所有的边,分别与扫描线求交点。这样处理效率很低。这是因为一条扫描线往往只与少数几条边相交,甚至与整个多边形都不相交。若在处理每条扫描线时,不分青红皂白地把所有边都拿来与扫描线求交点,则其中绝大多数都是徒劳无用的。如果采用活性边表,则可减少许多计算。 扫描线依次变化为1,2,3,4,5,6,7,8,. x是边与当前扫描线的交点; x是该边从当前扫描线到下一扫描线之间x增量; ymax是边所交的最高扫描线号。 在上述的交点x坐标更新和新边插入之前,必须把那些与当前扫描线相交,而与下一条扫描线不再相交的边,从活性边表(AET)中删除出去。,新边表处理方法,为了方便活性边表的建立与更新,为每一条扫描线建立一个新边表,在该扫描线第一次出现的边保留与此。也就是说,若某边的较低端点为ymin,则该边就放在扫描线ymin的新边表中。这样,当按扫描线号从小到大顺序处理扫描线时,该边在该扫描线第一次出现。新边表的每个结点存放对应边的初始信息,比如该扫描线与该边的初始交点x(即较低端点的x值),x的增量x,以及该边的最大y值ymax。图3-18所示,为左图中各扫描线的新边表。区间填充需设置一个布尔变量b, 在多边形内b为真, 在多边形外b为假,b的初值为假。当指针从活性边表中第一个结点(交点)到最后一个结点遍历一次时,每访问一个结点,把b取反一次。若b为真,则把从当前结点的x值开始到下一结点的x值结束的左闭右开区间,用多边形色填充。利用区间连贯性,即同一区间上的象素取同一颜色属性。 多边形外的点用背景色填充。,边填充算法,基本思想:对于每一条扫描线和每一条多边形边的交点(xi,yi),将该扫描线上交点右方的所有象素取补。对多边形的每条边均作此处理,多边形的顺序随意。右图为采用最简单的边填充算法填充一个多边形的示意图。 边填充算法最适用于具有帧缓冲存储器的图形系统,按任意顺序处理的边。,在处理每条边时,仅访问与该边相交的扫描线上交点右方的象素。当所有的边都被处理之后,按扫描线顺序读出帧缓冲存储器的内容,送入显示设备。可见本算法的优点是简单,缺点是对于复杂图形,每一象素可能被访问多次,输入输出的量比有序边表算法大得多。为了减少边填充算法访问象素的次数,可引入栅栏。所谓栅栏指的是一条与扫描线垂直的直线,栅栏位置通常取过多边形 顶点、且把多边形分为左右两半。,栅栏填充算法,基本思想是:当扫描线与多边形边有交点,就将交点与栅栏之间的象素取补。若交点位于栅栏左边,则将交点之右,栅栏之左的所有象素取补;若交点位于栅栏右边,则将栅栏之右,交点之左的象素取补。如图所示,为采用栅栏填充算法填充多边形的示意图。,栅栏填充算法只是减少了被重复访问的象素的数目,但仍有一些象素会被重复访问。从图中很容易看出这一点。下面介绍的边标志算法进一步改进了栅栏填充算法,使得算法对每个象素仅访问一次。算法示意图如下页所示。,边标志算法,基本思想是:分为两步骤,第一步,对多边形的每条边进行直线扫描变换,亦即对多边形边界所经过的象素打上标志;第二步,填充。对每条与多边形相交的扫描线,依从左到右顺序,逐个访问该扫描线上象素。使用一个布尔量inside来指示当前点的状态,若点在多边形内,则inside为真。若点在多边形外,则inside为假。inside的初始值为假,每当访问到象素为被打上边标志的点时,就把inside取反。对未打标志的象素,inside不变。若访问象素时,inside为真,则把该象素置为多边形色。用软件实现时,有序边表算法与边标志算法的执行速度几乎相同,但由于在帧缓冲存储器中应用边标志算法时,不必建立、维护边表以及对它进行排序,所以边标志算法更适合于硬件实现,这时它的执行速度比有序边表算法快到一至两个数量级。,种子填充算法的连通区域,基本思想是前面讨论的填充算法都是按扫描线的顺序进行象素点的填充的,种子填充算法是根据已知的一个多边形区域内部的一个象素点来找到区域内其它的象素点进行填充的。 前面讨论的填充算法都是按扫描线的顺序进行象素点的填充的,种子填充算法是根据已知的一个多边形区域内部的一个象素点来找到区域内其它的象素点进行填充的。,一般都采用边界定义区域,即边界区域上所有象素被置为特定值,而区域内部所有的象素均不取这个值。区域可以分为四连通或八连通两种,如果区域是四连通的,那么区域内每一个象素可以通过四个方向(上、下、左、右)组合到达,而对八连通区域,区域内的每个象素可通过上、下、左、右以及四个对角线方向的移动组合到达。 八连通算法可以填充四连通区域,而四连通算法不能填充八连通区域。两类连通区域如图所示。图 (b)中八连通区域的子区域是四连通的,然而从一个子区域到另一个子区域需用八连通算法,若每个子区域看成是分离的二个四连通区域,并且每个区域填上不同的色彩值,如果用八连通算法会让两个区域均被错误地填上同样的色彩。下面仅讨论四向连通算法,只要把搜索方向从四个该为八个,即可得到八向算法。,简单种子填充算法,简单的种子填充算法如下: (1) 将种子象素压入栈中; (2)当栈非空时 从栈中弹出一个象素; 将该象素置成所要求的色彩值; 检查每个与当前象素邻接的四连通象素是否是边界色或已置成所要求的色彩值,若是则返回(2),否则将该象素压入栈中回到(2)。 例 简单的种子填充算法。 多边形由顶点P0、P1、P2、P3、P4构成,见图3-23。P0(1,5)、P1(5,5) 、P2(7,3) 、P3(7,1) 、P4(1,1),可设种子点为(3,3);四连通的组合方向是上、下、左、,右。初始时栈中只有(3,3)象素;弹出(3,3),由于该象素未置成色彩值且也不是边界色,故填色彩值;同时将(3,4) (3,2) (2,3) 及(4,3)压入栈中;栈中有四个元素;弹出(4,3)并置上要求的色彩值,再将(4,4) (4,2) (5,3)压入栈中;栈中有6个元素;依次类推,象素被选中并填充的次序如图中箭头所示。当栈为空时,算法终止。分析该算法不难发现,在进行填充过程中堆栈会变得很大,而且在堆栈中还常常包含有一些重复的和不必要的信息。为此提出了扫描线种子填充算法。,(3,3),弹出(3,3),(4,3) (2,3) (3,2) (3,4),弹出(4,3) (2,3) (3,2) (3,4),(5,3) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(5,3) (4,2) (4,4) (2,3) (3,2) (3,4),(6,3) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(6,3) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(6,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(6,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(5,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(5,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(4,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(4,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(3,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(3,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(2,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(2,2) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(2,3) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(2,3) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(2,4) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(2,4) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(3,4) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(3,4) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(4,4) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(4,4) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),(5,4) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),弹出(5,4) (5,2) (5,4) (4,2) (4,4) (2,3) (3,2) (3,4),扫描线种子填充算法,所谓扫描线种子填充算法,是在任意不间断扫描线区间中只取一个种子象素。不间断区间即指在一条扫描线上一组相邻的元素。 算法可分为以下几步: 1) 从包含种子象素的栈中弹出种子象素; 2)沿着扫描线对种子象素进行填充,直到遇到边界象素为止,这样就填充了种子所在的扫描线中的元素; 3)区间内最左、最右元素为Xleft,Xright; 则在Xleft X Xright区间中检查与当前扫描线相邻的上、下两条扫描线是否全为边界象素或已填充过的象素。若不是,则对于Xleft X Xrigh,把与当前扫描线相邻的上、下两条扫描线中该区间的最右象素作为种子压入栈中。 算法结束条件为栈空。此算法适用于用边界定义的区域。,圆域的填充,上面所讨论的多边形区域的填充原理也可以推广到圆域的填充。对每条扫描线,先计算它与圆域的相交区间,再把区间内象素用指定颜色填充。,在实际应用中,除了使用单象素宽的线条,还经常使用指定线宽和线型的直线与弧线。欲产生具有宽度的线,可以顺着扫描所生成的单象素线条轨迹,移动一把具有一定宽度的“刷子”来获得。“刷子”的形状可以是一条线段或一个正方形。也可以采用区域填充的办法间接地产生有宽度的线。假设直线斜率在1,1之间,这里可以把刷子置成垂直方向,刷子的中点对准直线一端点,然后让刷子中心往直线的另一端移动,即可“刷出“具有一定宽度的线。当直线斜率不在1,1之间时,把刷子置成水平方向。具体实现线刷子时,只要对直线扫描变换算法的内循环稍作修改即可。例如,当直线斜率在1,1之间时,把每步迭代所得的点的上下方半线宽之内的象素全部置成直线颜色。如右上图所示为线宽是5个象素的情形。线刷子的优点是算法简单、效率高。但是,线的始末端总是水平或垂直的。因此,当线宽较大时,看起来很不自然。当比较接近水平的线与比较接近垂直的线汇合时,汇合处外角将有缺口,如左上图所示。斜线与水平(或垂直)线不一样粗。对于水平线或垂直线,刷子与线条垂直,因而最粗。其粗细与指定线宽相等。而对于45斜线,刷子与线条成45角,粗细仅为指定线宽的1/ 2 0.7倍。,直线线宽的处理 线刷子原理,为用正方形刷子绘制的具有宽度的线条。用方形刷子所得的线条比用线刷子所绘制的线条要粗一些。与线刷子类似,用方刷子绘制的线条始末端也是水平或垂直的,且线宽与线条方向有关。与线刷子的情形相反,对于水平线与垂直线,线宽最小,而对于斜率为1的线条,线宽最大,为垂直(水平)的2 倍。实现正方形刷子最简单的办法是,把方形中心对准单象素宽的线条上各个象素,并把方形内的象素全部置成线条颜色。这种简单方法将会重复地写象素。这是因为对应于相邻象素的方形一般会重迭。为了避免重复写象素,可以采用与活性边表类似的技术。,方形刷子的原理,线刷子还有另一个问题:当线宽为偶数个象素时,用上述方法绘制的线条要么粗一个象素,要么细一个象素。为了生成有宽度的线,还可以用方形的刷子,把边宽为指定线宽的正方形的中心沿直线作平行移动,即可获得具有线宽的线条,如图所示,方刷子的活性边表技术,为每条扫描线建一个表,存放该扫描线与线条的相交区间左右端点位置。在每个象素使用方形刷子时,用该方形与各扫描线的相交区间端点坐标去更新原表内端点数据,右图为刷子移动的相邻两步与有关扫描线的临时数据结构所保存的对应于各步的区间端点坐标。 生成具有宽度的线条还可以采用区域填充的算法。先算出线条各角点,再用直线段把相邻角点连接起,来,最后调用多边形填充算法把所得的四边形进行填色,即得到具有宽度的线条。用这种方法还可以生成两端粗细不一样的线条,圆弧线宽的处理(笔),为了生成具有宽度的圆弧,可采用与直线情形类似的方法,当采用线刷子时,在经过曲线斜率为1的点时,必须把线刷子在水平与垂直方向之间切换。由于线刷子总是置成水平或垂直的,所以在曲线接近水平与垂直的地方,线条更粗一些,而在斜率接近1的点附近,线条更细一些,如右上图所示。当采用正方形刷子时,无需移动刷子方向。只需顺着单象素的轨迹,把正方形中心对准轨迹上的象素,把方形内的象素全部用线条颜色填充。用正方形刷子绘制的曲线条,在接近水平与垂直的部分最细,而在斜率为1的点附近最粗,这恰与线刷子情形相反,如左上图所示。,圆弧线宽的处理(填充法),绘制具有宽度的圆弧线条也可以采用填充的办法,先绘制圆弧线条的内边界和外边界,然后在内外边界之间对其填色。可以让内外边界都与单象,素弧线轨迹距离半线宽,或把内外边界之一对准单象素弧线轨迹,另一边界线离开此线一个线宽距离。如图所示为采用填充方法所得的圆弧线条示意图。,线型的处理,在绘图应用中常用到不同线型的线条,以便区分各种不同的意义。 实线:可见的轮廓线;虚线:不可见的轮廓线;点划线:中心线等等。 线型可以用一个布尔值的序列来存放。例如,用一个32位整数可以存放32个布尔值。用这样的整数存放线型定义时,线型必须以32个象素为周期进行重复。可以把扫描变换算法中的无条件写象素语句改为 if(bitstringi%32)WritePixel(x,y,value); 其中i为循环变量,在扫描变换算法的内循环中每处理一个象素递增1,然后除以32取余(“%”为C语言中求模运算符),余数变化范围是031。 例子: bitstring= 11111111110000000000111111111100 用这种简单办法实现的线型有个毛病。因为每位对应于算法的一个迭代步骤而不是线条上一个长度单位,因此线型中虚实笔划长度与直线倾斜度有关,斜线上的笔划长度比横向或竖向上的笔划更长,这在工程图上是不允许的。所以,受影响的笔划应该作为单独线段进行计算和扫描变换,使其长度不随线的倾斜度的变化而变。以实心或透明矩形交替序列画出的粗线,各矩形顶点作为所选线型函数精确地计算。然后分别对单个钜形进行扫描变换。对于垂直或水平的粗线线型,可以用复制矩形完成。 线形和笔型在粗轮廓图元中相互作用,线型用于计算每一个笔画的矩形,而每一个矩形的填充则是用所选择的笔型。,字符,讨论的字符是指数字、字母、汉字等符号,用于图形的标注、说明等。国际上最流行的字符集是“美国信息交换用标准代码集“(American Standard Code for Information Interchange),简称ASCII码。该字符集规定了127个字符代码。其中代码031表示控制字符,代码32127表示英文字母、标点符号、数字符号、各种运算符以及特殊符号。每个ASCII码用一个字节(实际上只要七位二进制)代码表示。 我国除采用ASCII码外,还另外制订了汉字代码的国家标准字符集。最常用的字符集是”信息交换用汉字编码字符集基本集”GB231280。该字符集包含了六千多个常用汉字,以及英文字母、数字和其它图形符号。分成94个区94个位。区码和位码各用一个字节(实际上只要七位二进制)来表示。为了能识别哪些字节表示ASCII码,哪些字节表示汉字编码,一般采用多余的一位(最高位)来标识。最高位为0时,表示ASCII码,最高位为1时表示汉字编码。为了在终端显示器或绘图仪上输出字符,系统中必须装备有相应的字符库。字符库中储存了每个字符的形状信息。字符库分为矢量型和点阵型两种。 在笔式绘图仪上采用矢量型字符比较适合,矢量型字符库采用矢量代码序列表示字符的各个笔画,输出一个字符时,系统中的字符处理器解释该字符的每个矢量代码,输出对应的矢量,达到产生字符的目的。在终端显示器上显示字符一般采用点阵型字符库。点阵型字符库为每个字符定义一个字符掩膜,即表示该字符的象素图案的一个点阵。,矢量字符,为了建立一个矢量字符库,必须对每个字符定义一个矢量代码序列,下面以AutoCAD系统使用的矢量字符来说明。在AutoCAD中,使用一种称为形(shape)的图形实体来定义西文字符、汉字甚至一些简单的图形。形定义中使用直线和圆弧作为基本笔划。 每个形的定义包括一个标题行和若干个描述行: *形编号,字节数,形名称字节1字节2,0 标题行中,形编号是1到255的整数值。字节数表示形定义描述行中包括结束符0在内的字节数目。形名称用大写字母才可以被调用,否则只作为形的一种解释性信息,不存入存储器,因而不占用存储空间。 描述行由若干个用逗号隔开的字节组成,并以0作为形定义的结束字节。带有前缀0的字节是十六进制。无前缀0的字节是十进制。描述行中的每个字节包含矢量长度和方向两种信息。字节的低四位表示矢量方向,高四位表示矢量长度。矢量的方向编码如图所示。注意,图3-32中所有矢量都具有“相同“的长度,即不同方向的矢量的长度不一样。例如,45方向的矢量一个单位长相当于水平方向的2 单位长。,图所示的二极管符号的形定义为: *133,11,DIODE 040,044,04C,042,04C,040,048,04C,046,04C,0 形描述的第一个字节040中,最高位0表示本字节为十六进制数。后面两位数4和0分别表示字节的高四位和低四位。高四位的4表示矢量长度为4,低四位的0表示矢量方向为水平向右方向。,点阵字符,在点阵字符库中,每个字符都定义成一个字符掩膜的矩阵。矩阵中的每个元素都是一位二进制数。该位为1时,表示字符的笔划经过此位,对应于此位的象素应置为字符颜色;该位为0时,表示字符的笔划不经过此位置,对应此位的象素应置为背景色(若当前的写方式是“替换“方式)或不改变(若当前写方式是“与“方式)。一般认为定义西文字符的掩膜矩阵尺寸应不小于57,而定义汉字字符的掩膜矩阵尺寸应不小于1616。在我国广泛使用的微机汉字系统,如CCDOS等等,都采用1616点阵汉字作为显示用字符,而在打印时,采用2424,4040甚至7272的点阵字符。 一个57西文字符点阵包括35个点,需要35位,故需要35位二进制数(占四个多字节),一个1616点阵汉字,需要256位,即32个字节。而一个7272点阵汉字需要972=648个字节。 用于打印的高分辩率点阵字符的掩膜位图,可以是通过用扫描仪输入放大的手写美术字符或印刷字符,扫描输入进来的字符可用交互作图程序对位图的个别象素进行修改,使之完善。用于显示的或用于低分辩率打印机的字符位图可以使用交互绘图程序,通过手工建立。用低分辩率点阵字符产生的字符一般比较粗糙,不美观,所以在微机上通常使用几个不同分辩率的字符库,以满足不同的需要,例如在CCDOS4.0中就使用了24种不同的字符库。,字型技术,当应用对输出字符的要求较高时(如排版印刷),需要使用高质量的点阵字符。然而直接使用上一小节所介绍的点阵字符方法将耗费巨大的存储空间。对于GB231280所规定的6763个基本汉字,假设每个汉字是7272点阵,那么一个字库就需要4.4兆字节存储空间!在实际使用时,需要多种字体(如基本体、宋体、仿宋体、黑体、楷体等),而每种字体又需要十种以上字号。因此把每种字体、字号的字符都存储一个对应的点阵,在一般情况是不可行的。 解决这个问题一般采用压缩技术。对字型数据压缩后再存储,使用时,将压缩的数据还原为字符位图点阵。压缩方法有多种,最简单的有黑白段压缩法,这种方法简单,还原快,不失真,但压缩较差,使用起来也不方便,一般用于低级的文字处理系统中,二是部件压缩法。这种方法压缩比大,缺点是字型质量不能保证。三是轮廓字型法,这种方法压缩比大,且能保证字符质量,是当今国际上最流行一种方法,基本上也被认为是符合工业标准化的方法。轮廓字型法采用直线、或者二三次/Bezier曲线的集合来描述一个字符的轮廓线。轮廓线构成一个或若干封闭的平面区域。轮廓线定义加上一些指示横宽、竖宽、基点、基线等的控制信息就构成了字符的压缩数据。这种控制信息用于保证字符变倍时引起原来的横宽竖宽变大变小时,其宽度在任何点阵,情况下永远一致。采用适当的区域填充算法,可以从字符的轮廓线定义产生字符位图点阵,区域填充算法可以用硬件实现,做在RISC集成电路板上成为RIP(Raster Image Processor)。也可以用软件实现,写成一段精心编制的程序。,字型技术,当前国际流行的TrueType字型技术是由美国Apple和Microsoft公司联合开发的。并且已被用于为Windows中文版生成汉字字库。TrueType使用二次Bezier曲线来描述字符轮廓,对字符轮廓线的控制点进行编号。其顺序是按顺时针方向走一圈,填充的部分始终在其右边,下面以大写字母为例,说明TrueType字库控制信息。 x方向控制信息有: 1) 字身最左起始点到字母主干的距离间隔; 2) 字母主体部分的宽度; 3) 字身的宽度; 4) 字母主干(stem)的宽度; 5) 字母的衬线(Serif) 如图 (a)所示。 y方向控制信息有: 6) 字母横干(crossbar)的厚度; 7) 字母衬线的厚度; 8) 字母主体部分的厚度; 9) 字母横干的高度; 如图 (b)所示。 这上述9个参数用于产生控制信息表。这个控制信息表和曲线轮廓定义信息将在不同分辩率情况下产生字符的点阵中起关键作用。 这种方法能够准确地把字符的信息描述下来,保证了还原的字符质量,又对字型数据进行了大量的压缩。调用字符时,可以任意地放大、缩小或进行花样变化,基本上能满足电子印刷中字型质量的要求。一套字型的生产周期大于1个人年,最早的生产方法是由写字专家写出字符,然后把字符托到9696方格纸上,在9696方格纸上人为地画出矢量节点,最后由操作员录入计算机。现在使用的一般方法是用扫描仪把字型数字化,用程序自动地进行矢量轮廓的生成,再由操作员对矢量结果进行调整优化,做成合格的字型。好的字型数据是来之不易的!,字符裁剪,当字符或文本整个不在窗口时,则不予显示。然而,当字符和文本部分在窗口内,部分在窗口外时,就提出了字符裁剪的问题。 字符精度:最简单的字符裁剪方法是把字符方框(即字符掩膜)与窗口比较。若整个方框位于窗口内,则显示对应字符,否则不予显示。 象素精度:有些应用要求更准确的处理:即使字符只有一部分在窗口内,也要把这一部分显示出来。若字符为点阵型的,只要在把字符掩膜各位写入象素之前,先判断该位对应的象素是否在窗口内,若该位在窗口内则写,否则就不写。 笔划精度:在字符为矢量型的情形,问题就更复杂一些。这时要对跨越窗口边界的笔划进行裁剪,裁去笔划伸到窗口外的部分,保留笔划在窗口内的部分,这个问题可以转化为线段的裁剪。 字符串裁剪,可以按三个精确度来进行:串精确度、字符精确度、以及笔划象素精确度。采用串精确度进行裁剪时,当字符串方框整个在窗口内予以显示,否则不显示。采用字符精确度时,当字符串的某个字符方框整个在窗口内时,显示该字符,否则不显示。当采用笔划象素精度时,要具体判断字符串中各字符的哪些象素、笔划的哪一部分在窗口内,处理方法同字符裁剪。,反走样,在光栅图形显示器上绘制直线、多边形等连续图形时,由于光栅是由离散的点组成,因此使生成的图形呈锯齿状,从而使图形出现失真。这种离散量表示连续量引起的失真就叫走样(aliasing)。用于减少或克服这种效果的技术叫做反走样(antialiasing)。 光栅图形的走样现象除了产生锯齿状之外,还有图形的细节失真及狭小图形遗失等现象,当在光栅图形显示器上显示如图 (a)所示的许多细长矩形时,由于仅当象素中心被这些矩形覆盖时才被显示,因而造成图形失真,即将图形中细节丢失,称为细节失真。图 (b)即为(a)的失真图形。此外还有一种叫狭小图形遗失的走样,即在进行图形显示时一些相对微小的物体被丢失或忽略。 走样现象还会使得动态图形时隐时现、产生闪烁。如对于一个狭小的长方形从上往下进行运动时,由于图形忽显忽不显,给人的感觉就象是一明一暗的间断闪烁。所以,为了提高图形显示质量,需要反走样技术。,通过提高分辩率反走样,可以采用提高分辩率的方法进行反走样,因为用高分辩率显示器所显示的图形与低分辩率相比质量高,锯齿就不明显。提高分辩率的方法有二种: 采用高分辩率的光栅图形显示器,但是代价太高,故不是好办法。 用软件实现,代价小易于实现。其方法是:高分辩率计算,低分辩率显示,具体做法是:将低分辩率的图形象素划分为许多子象素如22,33划分,然后按通常的方法扫描变换各个子象素的颜色值或灰度值,再进行低分辩率显示,将一个象素内的各子象素的颜色值或灰度值的平均值作为该象素显示的颜色值或灰度值。(扩大分辨率,再扫描变换,按低分辨率组合单元求颜色平均值,最后再显示低分辨率结果.),简单的区域反走样算法,直线斜率为:0m 1,直线与象素相交的面积如图所示,三角形和梯形。 图 (a)相交面积为三角形: S=DL1/2=D2/(2m) 其中m=D/L=tg ,L=D/m 对于图 (b),相交面积为梯形: S=(DL) 1/2 其中 L=Dm,故 S=(2Dm)/2=D-m/2 所得面积是小于1的正数,以此来获取相应的灰度级进行显示。,为了实现反走样,可对图形信号作含核的卷积,卷积积分为: c()= h(x)y(x)dx 其中h(x)是函数的卷积核,y(x)是被卷积的函数,c()是h(x)和y(x)的卷积。,卷积积分与反走样算法,例如卷积核如图所示。 然后将这一卷积核h(x),反射核h(x)及平移核h(x)与卷积函数y=x相乘得结果如图。,卷积核、反射核及平移核的表达式为:,h(x)y(x) 0,2,故有 c()= h(x)y(x)dx 0 1 = h(x)y(x)dx = h(x)y(x)dx 1 2 代入:h(x)1 ,y(x)=x有 c()= (1) (x)dx=2/2 0 1 = xdx =/2 (2) 1 2 若y(x)的斜率为m,则结果为m2/2及m/2(2) 这样c()可与反走样处理中计算象素位于多边形内面积结合起来,根据c()的取值决定象素的灰度级。这就是所谓的图形卷积滤波,卷积核称为滤波函数。对于滤波方法还有三角形滤波器及高斯滤波器,也有二维滤波器。上面讨论的简单的面积方法是对图像进行前置滤波。 c()在0 x 2时不为零,所以卷积积分等价于将卷积核平移、反射后与卷积函数相乘,求得组合曲线下的面积。,前面所介绍的反走样技术,都是利用多级光强提高视觉分辩率的技术,而半色调技术则是用最少的光强级别,一般为黑与白来提高视觉分辨的。对于给定的分辩率,通过将几个象素被组合成一个单元来获得多级光强。如在黑白显示器中将四个象素组成一个单元,可以产生5种光强,如右上图 (a)。而(b)、(c)不是组合出来的光强模式,因为采用(b)、( c )会产生细微的结构图,如水平或垂直的光线条。 一般来说,对于两级灰度显示器可能构成的光强数等于单元中象素个数加1。增大单元尺寸可以获得更多的灰度数,如图中为33单元。单元也可以为长方形,如右图下。 可见,单元越大,产生的光强就越多。半色调技术是以牺牲空间分辩率为代价的,它的成功与人们的视觉系统引起的调和平滑离散信息的积分作用分不开。 通过上面的讨论,对于图形的走样可以采用不同的方法来克服,这里只做了简单的说明,半色调技术,请提问,2019/7/29,感谢支持,

    注意事项

    本文(四讲二维图形填充ppt课件.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开