区域扫描线
印刷行业中CTP质量控制

印刷行业中CTP质量控制影响计算机直接制版系统质量的因素很多,包括设备配置、参数设置、冲显影设备的参数、药水老化等。
就版面本身所表现出来的现象判断,有如下一些情况。
1、版面脏物版面脏物主要有纸屑、指纹。
如果纸屑黏附在感光胶上,并且曝光开始前没有脱离感光膜面,则这部分被遮盖的本应为空白的区域会变为图文区域。
指纹太重则会在曝光时因能量不足而导致曝光不完全,使印版上出现指纹状残影。
另外,如果印版背面有纸屑等杂物黏附,则会导致正面的曝光区域出现局部扫描线。
灰尘、蚊虫等进和制版机内部,黏附在滚筒上也会导致脏点或扫描线等结果。
2. 马蹄印马蹄印是在生产使用过程中由于人工操作不当而造成的,它同样会造成扫描线之类的印版制版质量问题。
同时还会造成印刷过程局部上墨不均。
3,划痕划浪引起的因素有多种,除了少数情况下是由机械原因造成的之外,其它基本上是人为原因造成的,如果出现在图文部份,它会直接造成印刷品上划痕区不上墨。
如果出现在非图文部分,则划痕区砂目遭到破坏,亲水性降低,可能会造成脏版。
4.感光胶涂布相关问题版材生产过程中,很多因素都会导致白点、气泡的产生(可参考CTP版材生产流程简介之涂布后烘干),如果选版过程有疏漏,而使用时又没有检查,则会导致图文部分网点丢失,或者网点损失量大。
版材感光胶均有涂布不均的现象(可参考CTP版材生产流程简介之涂布)尤其生产线换卷后的未稳定的一段时间内较严重,但是只要保证这种不均的程度在一定的范围内,就可以忽略其影响。
如果通过目测就能发现深浅不一的现象,则版材不可用。
因为深浅不一的现象越严重,意味着感光胶厚度不一,不同的厚度在显影后的留膜率不一样,而留膜率太低,网点面积率就得不到保证。
涂布后烘干环节,烘干温度过低时,感光胶不能完全干燥,曝光时间缩短,显影速度加快,感光层吸附不牢固,耐印力低。
当烘干温度过高时,在曝光显影后印刷易引起上脏,我记得在丽然印刷厂工作的时候就遇到过这种情况,所以说这是经验之谈。
扫描线多边形区域填充算法研究

Y)则 第 i 条 扫描线 Y +1 i i, +1 i =Y +1与 l 的交 点
的 X坐 标 是 : … =( i1 ) k =( i ) k十 X Y+ 一b / y —b / 1 k= i / . / X +1 k 扫描 线 从 y. 化 到 Y +1时 , i 变 i X的 变 化量是 m=1 k 设计 边 记 录 的 数 据 结 构 : 边 /. 该
扫 描 线 多 边 形 区 域 填 充 算 科 学 系 , 四 四川 达 州 65 0 ) 3 00
摘 要 : C D系统 中, 在 A 经常需要对封 闭区域进行填 充. 对于一个功 能完善的 C D系统 而言 , A 区域 填充算
边表 是包 含 多 边 形 全 部 边 记 录 的 表 , 按 Y 它 坐标 递增 ( 或递 减 ) 的顺 序存 放 多 边形 的所有 边 , 每个 Y坐标 存 放 一条 或 几 条边 记 录 . 当某 条 扫 描线 y 遇到 多边形 边 界 的新 边 ( i 以边 的最 底 端为
1 多边形扫描线填 充原理
最 高点 的 Y坐标 Y 该 边最 低 点 的 X坐 标 , 扫 从 描线 y 变化 到 Y+ =Y +1时 , 坐 标 的增量 m= i i1 i X
1 k 指 向下一 条边 记 录的指 针 , 图 1 示 . /, 如 所
Y x ma x m Y x ma X n l
填充区域按 Y 向扫描线顺序扫描生成. 方 其操作
用 的内存 空 间少 、 何 变换 容易 , 不能直 接 用 于 几 但 区域 填充 . 阵 表示 法 是 用 位 于 多 边形 内 的像 素 点 集 合来 表示 多 边 形 .l 种 表 示 丢 失 了许 多几 何 _这 信息 , 但便 于进 行填 充 . 扫描线 多 边形 区域 填 充 算 法 的基 本 思 想 : 待
复杂连通区域扫描线填充算法的问题及改进

率 很低… 。当填充区域 面积较大时 , 由于所 占用 的栈空 间太
大, 因此使填充不 能完成 , 至会 出现 系统崩溃 。相 比之下 , 甚
扫描 线填充算法 由于利用 了扫 描线上像 素之间 的连贯性 , 因 此具有较高 的效率 J 。 文献 [ ] 于多边 形扫 描线填 充算法 的基本 原理 , 过 3基 通 分析水平扫描线与 复杂连 通 区域轮 廓线相 交 的各种 可 能情 况 , 出了一种 求取扫 描线 与轮 廓线 交点 的新方 法 , 以快 给 可 速求取交点 。在此基础上 , 出了一种 任意形状 复杂连 通区 提 域的快速扫描线填充算 法。该算 法具有遍 历轮廓 线次数少 、 逻辑规则简单 、 求交速度快 、 配对 填充 准确等 优点 , 4一连 对 通区域和 8一连通 区域 的填充均 能适用 。 通过研究发现该 算法 对于 两类 特殊 的边 界 区域 会发 生 重复填充的现象 , 当图形内部需要填 充的颜 色与边界 颜色 另 不 同时 , 则发生边界 颜色被改变 的情况 。本文分 析 了产生 这
类 现象的原 因, 出了相应的改进方法 。 提
步骤 2 配对 。对 于每条扫 描线 Y=i i , ) : ( =1 n 的交 点链 表 中的交点 P. j , 两 两配 对 , 式 为 P. _ 、 .P. i( =1 m) i 方 .P. P. . 】 2 3 4
…
,
每对 交点之间的 区域就代表 了扫描线与 复杂连通 区域 的
下转第75页比值合成采用etm51提取与铝土矿化有关的蚀变信息采用etm31提取与铁矿化有关的蚀变信息同时采用etm5743然后再通过与主成分分析图像进行新的波段组合选择了既反映地貌特征又能够区分铝土矿化铁矿化及砂岩植被信息的pcalpca3波段和etm51波段组合合成了假彩色信息提取与波罗芬高原铝土矿矿化有关的红土化褐铁矿化高岭土化等蚀变信息结合区域成矿地质条件可以快速有效地提取图像中与实地勘查所确定的矿体边界相吻合的矿化信息
图元的属性

1
4.1 颜色和查找表
颜色是所有图元的一个基本 属性.用户可以选择多种颜色, 依赖于特定系统的能力和设 计目标.颜色可用数值指定,也 可以从菜单或显示的标尺中 选择.
2
4.1 颜色和查找表
4.1.1 RGB颜色分量
在彩色光栅系统中,可选用的颜色数量依赖于帧缓存中提 供的存储容量。颜色信息有两种存储方法:
需要操作3个字节)
6
Color Lookup Tables
❖Advantages
➢ 使用彩色表可提供合理的同时显示的颜色数量,而无需大容量帧 缓冲器。 256或512种不同颜色足以显示单个图像。
➢ 表项可随时改变,容易试验在设计、场景或图形中使用不同的颜 色组合,而无需改变对图形数据结构的属性设置。
❖不计算水平边和扫 描线的交点
42
4.6 通用扫描线填充算法
❖4.6.1 扫描线算法 ❖4.6.2 有序边表算法 ❖4.6.3 边填充算法 ❖4.6.4 边标志算法
43
4.6.2 有序边表算法
➢ 基本原理
一条扫描线与多边形的边有偶数个交点
➢ 步骤(对于每一条扫描线):
✓ 求交点 ✓ 交点排序 ✓ 交点配对,填充区段
4
Color Lookup Tables
❖Idea:存 储在颜色 查找表中 的信息控 制RGB三 枪
5
直接存储
❖Advantages
➢ 特别灵活 – 可同时使用颜色范围的任一颜色 ➢ 硬件简单
❖Disadvantages
➢ 帧缓冲区存储容量需求大 ➢ 视频操作速度慢(例如24位色光栅系统,改变一个像素
y
12 11 10
9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 10 11 12 x
快速的复连通区域扫描线图形填充新方法

快速的复连通区域扫描线图形填充新方法
李波;吴琼玉;刘东华;唐朝京;张尔扬
【期刊名称】《国防科技大学学报》
【年(卷),期】2003(025)004
【摘要】对复连通区域填充算法进行了细致的研究,提出一种新的扫描线填充算法.该算法先对目标边界进行标注,提供判断条件,然后用扫描线进行填充;该算法不仅适用于单连通区域,而且也适用于复杂区域的填充.该算法效率高,通用性强,实现简单,填充准确.
【总页数】4页(P68-71)
【作者】李波;吴琼玉;刘东华;唐朝京;张尔扬
【作者单位】国防科技大学电子科学与工程学院,湖南,长沙,410073;国防科技大学电子科学与工程学院,湖南,长沙,410073;国防科技大学电子科学与工程学院,湖南,长沙,410073;国防科技大学电子科学与工程学院,湖南,长沙,410073;国防科技大学电子科学与工程学院,湖南,长沙,410073
【正文语种】中文
【中图分类】TP391;O235
【相关文献】
1.多边形图形的环状扫描线种子填充算法 [J], 邱国清
2.基于边界标注的单连通区域扫描线填充新方法 [J], 李波;王刚;刘东华;唐朝京;张尔扬
3.多边形图形的环状扫描线种子填充算法 [J], 邱国清;
4.一种新的快速复杂连通区域扫描线填充算法 [J], 张志龙;李吉成;沈振康
5.复杂连通区域扫描线填充算法的问题及改进 [J], 孙青;郑永果
因版权原因,仅展示原文概要,查看原文内容请购买。
扫描线填充算法讲解

扫描线算法(Scan-Line F illing)扫描线算法适合对矢量图形进行区域填充,只需要直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电脑游戏和三维CAD软件的渲染等等。
对矢量多边形区域填充,算法核心还是求交。
《计算几何与图形学有关的几种常用算法》一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算法,利用此算法可以判断一个点是否在多边形内,也就是是否需要填充,但是实际工程中使用的填充算法都是只使用求交的思想,并不直接使用这种求交算法。
究其原因,除了算法效率问题之外,还存在一个光栅图形设备和矢量之间的转换问题。
比如某个点位于非常靠近边界的临界位置,用矢量算法判断这个点应该是在多边形内,但是光栅化后,这个点在光栅图形设备上看就有可能是在多边形外边(矢量点没有大小概念,光栅图形设备的点有大小概念),因此,适用于矢量图形的填充算法必须适应光栅图形设备。
扫描线算法的基本思想扫描线填充算法的基本思想是:用水平扫描线从上到下(或从下到上)扫描由多条首尾相连的线段构成的多边形,每根扫描线与多边形的某些边产生一系列交点。
将这些交点按照x坐标排序,将排序后的点两两成对,作为线段的两个端点,以所填的颜色画水平直线。
多边形被扫描完毕后,颜色填充也就完成了。
扫描线填充算法也可以归纳为以下4个步骤:(1)求交,计算扫描线与多边形的交点(2)交点排序,对第2步得到的交点按照x值从小到大进行排序;(3)颜色填充,对排序后的交点两两组成一个水平线段,以画线段的方式进行颜色填充;(4)是否完成多边形扫描?如果是就结束算法,如果不是就改变扫描线,然后转第1步继续处理;整个算法的关键是第1步,需要用尽量少的计算量求出交点,还要考虑交点是线段端点的特殊情况,最后,交点的步进计算最好是整数,便于光栅设备输出显示。
对于每一条扫描线,如果每次都按照正常的线段求交算法进行计算,则计算量大,而且效率底下,如图(6)所示:图(6)多边形与扫描线示意图观察多边形与扫描线的交点情况,可以得到以下两个特点:(1)每次只有相关的几条边可能与扫描线有交点,不必对所有的边进行求交计算;(2)相邻的扫描线与同一直线段的交点存在步进关系,这个关系与直线段所在直线的斜率有关;第一个特点是显而易见的,为了减少计算量,扫描线算法需要维护一张由“活动边”组成的表,称为“活动边表(AET)”。
区域填充的扫描线算法
区域填充的扫描线算法区域填充是一种常见的计算机图形学算法,用于将一个封闭区域内的所有像素点填充为指定的颜色。
扫描线算法是区域填充的一种常用方法,本文将介绍扫描线算法的基本原理、实现步骤和一些优化技巧。
扫描线算法的基本原理是利用扫描线从图像的上边界向下扫描,检测每个扫描线与区域的交点。
当遇到一个交点时,根据该交点的左右两侧的交点情况,确定将该交点连接到哪个交点上。
通过不断地扫描和连接交点,最终将整个区域填充为指定的颜色。
下面是扫描线算法的具体实现步骤:1.首先需要确定区域的边界,可以由用户提供或通过其他算法生成。
边界可以用一系列的线段、多边形或曲线表示。
2. 创建一个数据结构来存储每个扫描线与区域的交点。
常用的数据结构是活性边表(Active Edge Table,AET)和扫描线填充表(Scanline Fill Table,SFT)。
AET用于存储当前扫描线与区域边界的交点,SFT用于存储所有扫描线的交点。
3.初始化扫描线的起始位置为图像的上边界,并创建一个空的AET。
4.开始扫描线的循环,直到扫描线到达图像的下边界。
每次循环都进行以下操作:-将扫描线与区域边界进行相交,找出所有与区域相交的线段,并将它们的交点加入到AET中。
-对AET按照交点的x坐标进行排序。
-从AET中取出相邻的两个交点,根据这两个交点之间的像素点是否在区域内来决定是否填充这些像素点。
5.当扫描线到达图像的下边界时,完成填充。
扫描线算法的实现可能会遇到一些边界情况和优化需求。
下面是一些常见的优化技巧:1.边界处理:在AET中存储的交点需要进行边界处理,确保交点处于图像范围内。
2.垂直线段处理:对于垂直线段,可以进行特殊处理,避免在AET中重复存储相同的交点。
3.区域内部边界处理:当区域内部有不连续的边界时,需要对交点进行合并,避免出现多余的像素点填充。
4.使用扫描线填充算法优化:对于大尺寸的区域填充,可以使用扫描线填充算法进行优化。
扫描线区域填充算法
扫描线区域填充算法
扫描线区域填充算法,又称为"扫描线填涂算法",它用于对平面中特定区域填充指定的颜色、灰度或纹理,是计算机图形学中常用的算法之一。
该算法的原理是:给定待填充的区域内的点的有限个边界,从某一顶点开始,以某一规则遍历所有的边界点,形成边界数组,接着顺次扫描边界数组,将包含在边界中的每个合理像素点标记成已填充状态,由此而达到填充区域的目的。
算法步骤如下:
(1)设置起始点A,判断是否存在右方向上有没有边界点,若有,则把下一个边界点B作为起始点;
(2)从起始点A 开始,以扫描线的形式一次扫描边界点,把有效的像素点标记为“已填充”;
(3)把已扫描的点加入边界数组,直到下一个边界点C,且C点不等于起始点A;
(4)重复步骤(2)和(3),直至再回到起始点A,完成一次区域填充;
(5)如果还有未填充的区域,则重复步骤(1)至(4),直至所有区域填充完成。
实际应用中,为了避免停滞,可以采用八方向搜索策略;此外,由于扫描线填充算法中填充空间的范围是由边界点定义的,因此,当边界未经处理的是孤立的点或直线时,将无法实现实际的填充效果。
计算机图形学-区域填充的扫描线算法
计算机图形学——区域填充的扫描线算法一.实验名称:区域填充的扫描线算法二.实验目的:1、理解区域填充扫描线算法的原理;2、实现区域填充的扫描线算法并测试;三.算法原理:算法基本思想: 首先填充种子点所在扫描线上位于区域内的区段,然后确定与该区段相邻的上下两条扫描线上位于区域内的区段,并依次将各区段的起始位置保存, 这些区段分别被用区域边界色显示的像素点所包围。
随后,逐步取出一开始点并重复上述过程,直到所保存各区段都填充完毕为止。
借助于栈结构,区域填充的扫描线算法之步骤如下:Step 1. 初始化种子点栈:置种子点栈为空栈,并将给定的种子点入栈;Step 2. 出栈:若种子点栈为空,算法结束;否则,取栈顶元素(x,y)为种子点;Step 3. 区段填充:从种子点(x, y) 开始沿纵坐标为y 的当前扫描线向左右两个方向逐像素点进行填色,其颜色值置为newcolor 直至到达区域边界。
分别以xl 和xr 表示该填充区段两端点的横坐标;Step 4. 新种子点入栈: 分别确定当前扫描线上、下相邻的两条扫描线上位于区段[xl, xr] 内的区域内的区段。
若这些区段内的像素点颜色值为newolor ,则转至Step 2;否则以区段的右端点为种子点入种子点栈,再转至Step 2。
四.原程序代码:/*****************************************//*4-ScanLineFill 区域填充的扫描线算法实现*//*****************************************/#include <stdio.h>#include <conio.h>#include <graphics.h>#include <malloc.h>#define Stack_Size 100 //栈的大小常量//定义结构体,记录种子点typedef struct{int x;int y;}Seed;//定义顺序栈(种子点)typedef struct{Seed Point[Stack_Size];int top;}SeqStack;//初始化栈操作void InitStack(SeqStack *&S){S=(SeqStack *)malloc(sizeof(SeqStack));S->top=-1;}//种子点栈置空;void setstackempty (SeqStack *S){S->top==-1;}//种子点栈状态检测函数int isstackempty (SeqStack *S){if(S->top==-1)return true; //空栈返回trueelsereturn false; //非空栈返回false}//种子点入栈;int stackpush (SeqStack *&S,Seed point){if(S->top==Stack_Size-1)//栈已满,返回false return false;S->top++;//栈未满,栈顶元素加1S->Point[S->top]= point;return true;}//取栈顶元素;int stackpop (SeqStack *&S,Seed &point){if(S->top==-1)//栈为空,返回falsereturn false;point=S->Point[S->top];S->top --;//栈未空,top减1return true;}//画圆void CirclePoints (int xc, int yc, int x, int y, int Color) {putpixel (xc + x, yc + y, Color);putpixel (xc + x, yc - y, Color);putpixel (xc - x, yc + y, Color);putpixel (xc - x, yc - y, Color);putpixel (xc + y, yc + x, Color);putpixel (xc + y, yc - x, Color);putpixel (xc - y, yc + x, Color);putpixel (xc - y, yc - x, Color); }//中点画圆算法void MidpointCircle(int radius, int Color) {int x, y;float d;x=0;y=radius;d=5.0/4-radius;CirclePoints(250,250,x,y,Color);while(x<y){if (d<0){d+=x*2.0+3;}else{d+=(x-y)*2.0+5;y--;}x++;CirclePoints(250,250,x,y,Color);}}//四连通扫描线算法void ScanLineFill4(int x, int y, int oldcolor, int newcolor) {int xl, xr, i;bool SpanNeedFill;Seed pt;//种子点SeqStack *S;//定义顺序栈InitStack(S);//定义了栈之后必须把栈先初始化setstackempty(S);//种子点栈置空;pt.x = x;pt.y = y;stackpush (S,pt); // 种子点(x, y)入栈while (!isstackempty(S)){stackpop (S,pt);//取种子点y = pt.y;x = pt.x;while (getpixel (x,y)==oldcolor) {// 从种子点开始向右填充putpixel (x, y, newcolor);x++;}xr = x -1;x = pt.x -1;while (getpixel (x,y)==oldcolor) { // 从种子点开始向左填充putpixel (x, y, newcolor);x--;}xl = x + 1;x = xl;y = y +1; // 处理上面一条扫描线while (x < xr){SpanNeedFill = false;while (getpixel (x, y)==oldcolor){SpanNeedFill = true;x++ ;} // 待填充区段搜索完毕if (SpanNeedFill){// 将右端点作为种子点入栈pt.x = x - 1;pt.y = y;stackpush (S,pt);SpanNeedFill = false;} //继续向右检查以防遗漏while ((getpixel (x, y)!=oldcolor) && (x< xr)) x++;} //上一条扫描线上检查完毕x = xl;y=y-2; // 处理下面一条扫描线while (x < xr){SpanNeedFill = false;while (getpixel (x, y)==oldcolor){SpanNeedFill=true;x++ ;}if (SpanNeedFill){pt.x= x - 1;pt.y = y;stackpush (S,pt);SpanNeedFill=false;}while ((getpixel (x, y)!=oldcolor) && (x < xr))x++;}}}//主函数检测void main(){int radius,color;int x,y;//种子点int oldcolor,newcolor;//原色与填充色//输入参数值printf("input radius and color:\n");//画圆参数scanf("%d,%d",&radius,&color);printf("input x and y:\n"); //读入内点scanf("%d,%d", &x, &y);printf("input oldcolor and newcolor:\n"); //读入原色与填充色scanf("%d,%d", &oldcolor, &newcolor);int gdriver = DETECT,gmode;initgraph(&gdriver, &gmode, "c:\\tc");// 用背景色清空屏幕cleardevice();// 设置绘图色为红色setcolor(RED);MidpointCircle(radius,color);//用中点画圆算法画圆rectangle(150, 150, 350, 350);//再画一个矩形区域ScanLineFill4 (x,y,oldcolor,newcolor);//扫描线区域填充getch();closegraph();}五.运行结果与讨论:测试结果1:测试结果2:六.实验分析与讨论:1.通过借助栈这一数据结构,完成了区域填充的扫描线算法的实现,并利用以前所学的画圆等算法,进行综合运用,在此基础上进行扩充,设计多种图案,进行扫描线填充算法的检测,都得到了理想的结果,体现了算法的有效性;2.栈的数据结构给种子点的操作带来了极大的方便,为算法的实现提供了便利,同时还提高了算法的复用性和可靠性;3.此扫描线填充算法能够对多种图案进行填充,展现了算法的实用性。
区域填充算法
3、基于曲线积分的区域填充算法
• 算法的实现: ➢对一个区域进行轮廓跟踪,求出区域的边
• 改进算法的基本思想是:每找到一个新的内部
区段时,不仅将新区段的y值(yn)和左右列值xnl, xnr压入堆栈,而且同时把当前区段的y值和左右 列值xl,xr也压入堆栈,以保存和传递有关的信息。
3、基于曲线积分的区域填充算法
基于曲线积分的区域填充算法是邓国强,孙 景鳌等(2001)提出的一种以格林公式求区域面 积为基本原理进行区域填充的特殊算法。
1、递归种子填充算法
递归种子填充算法,又称边界填色算 法。
算法的原理是:让单个像元作为填充 胚,在给定的区域范围内,通过某种方法 进行蔓延,最终填充满整个多边形区域。 为了实现填充胚的蔓延,可采用四邻法或 八邻法进行填充。
2、扫描线种子填充算法
(1)扫描线种子填充算法
扫描线种子填充算法的对象是一个个扫描 线段。扫描线段是指区域内同值相邻像素 在水平方向的组合,它的两端以具有边界 值的像素为边界,即一段扫描线段的中间 只有同一种像素。
(2)计算多边形面积
4、区域填充算法在地图制图中的应用
(2)计算多边形面积
Sa
24
1 5 2
1 13 33 2
Sb
30
1 2
5
1 2
17
41
ScΒιβλιοθήκη 1031 213
1 2
17
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
区域填充的扫描线算法的使用
计科一班寇大磊2009118251
一.实验题目:区域填充的扫描线算法
二.实验内容:
区域填充的边界算法:
首先填充种子点所在扫描线上位于区域内的区段,然后确定与该区段相邻的上下两条扫描线上位于区域内的区段,并依次将各区段的起始位置保存, 这些区段分别被用区域边界色显示的像素点所包围。
随后,逐步取出一开始点并
重复上述过程,直到所保存各区段都填充完毕为止。
借助于栈结构,区域填充的扫描线算法之步骤如下:
Step 1. 初始化种子点栈置种子点栈为空栈,并将给定的种子点入栈; Step 2. 出栈若种子点栈为空,算法结束;否则,取栈顶元素(x,y)为种子点;
Step 3. 区段填充从种子点 (x, y) 开始沿纵坐标为y 的当前扫描线向左右两个方向逐像素点进行填色,其颜色值置为:
F_Color
直至到达区域边界。
分别以xl 和xr 表示该填充区段两端点的横坐标;
Step 4. 新种子点入栈分别确定当前扫描线上、下相邻的两条扫描线上位于区段 [xl, xr] 内的区域内的区段。
若这些区段内的像素点颜色值为F_Color 或B_Color,则转至 Step 2;否则以区段的右端点为种子点入种子点栈,再转至 Step 2。
首先使用以前的直线画法画一个不规则的封闭图形。
然后通过调用区域填充的扫描线算法的函数来实现对封闭图形的填充。
三.实验代码:
#include <winbgim.h>
#include <conio2.h>
#define MAXSIZE 50000
typedef struct { // 记录种子点
int x;
int y;
} Seed;
typedef struct{
Seed pt[MAXSIZE];
int top;
}stack;
void sestackempt(stack *s){
s->top = -1;
}
bool stackpush(stack *s,Seed pt){
if(s->top == MAXSIZE - 1)
return false;
s->top++;
s->pt[s->top]=pt;
return true;
}
bool isstackempty(stack *s){
if(s->top == -1)
return true;
else
return false;
}
Seed stackpop(stack *s){
if(s->top == -1)
exit(1);
Seed temp = s->pt[s->top];
s->top--;
return temp;
}
void ScanLineFill4 ( int x, int y, int oldcolor, int newcolor)
{
int xl, xr, i;
bool spanNeedFill;
Seed pt;
stack s;
sestackempt(&s);
pt.x = x; pt.y = y;
stackpush (&s,pt); // 种子点(x, y)入栈
while (! isstackempty (&s)){
pt = stackpop (&s); // 取种子点
y = pt.y; x = pt.x;
while (getpixel (x,y) == oldcolor) {
putpixel (x, y, newcolor);
x ++;
}
xr = x -1; x = pt.x -1;
while (getpixel (x,y) == oldcolor){ // 从种子点开始向左填充
putpixel (x, y, newcolor); x--;
}
xl = x + 1;
x = xl; y = y +1; // 处理上面一条扫描线
while (x <= xr) {
spanNeedFill = false;
while (getpixel (x, y) == oldcolor){
spanNeedFill = true; x ++ ;
} // 待填充区段搜索完毕
if (spanNeedFill) {// 将右端点作为种子点入栈
pt.x = x - 1; pt.y = y;
stackpush (&s,pt);
spanNeedFill = false;
} //继续向右检查以防遗漏
while (getpixel (x, y) != oldcolor && x <= xr) x ++ ;
} // 上一条扫描线上检查完毕
x = xl; y = y - 2; // 处理下面一条扫描线
while (x <= xr) {
spanNeedFill = false;
while (getpixel (x, y) == oldcolor) {
spanNeedFill = true; x ++ ;
}
if (spanNeedFill) {
pt.x= x - 1; pt.y = y;
stackpush (&s,pt); spanNeedFill = false;
}
while (getpixel (x, y) != oldcolor && x<= xr) x ++;
}
}
}
int main()
{
initwindow(900,800); //open a 640x480 graphics window
setcolor(WHITE);
line (500,50,50,200);
line (50,200,620,600);
line (620,600,420,440);
line (420,440,500,50);
ScanLineFill4(330,220,0,3);
getch(); //wait for user to press a key
closegraph(); //close graphics window
return 0;
}
四.实验截图:
五.实验总结:
通过区域填充的扫描线算法的学习和使用。
通过上机的实践加深了对这种填充算法的理解。
对算法的基本原理和方法基本明白。
达到了预期的目的。
对自己的实践能力也有着一定的提高和帮助。