比较扫描转换填充和区域填充算法有什么不同

1、一般来说要在计算机上生成一幅表示物体的图像有三步:造型技术;光照模型;绘制(渲染)技术

3、分辨率:屏幕分辨率;显示分辨率;显卡分辨率

4、显示器点距(越尛越好一般14或15寸电脑显示器点距为0.27mm)

6、位图(点阵图)和矢量图的区别:1)存储方式的区别:点阵文件是存储图的各个像素点的位置信息、颜色信息以及灰度信息。矢量文件通常用图形的形状参数和属性参数来表示图形2)缩放的区别:位图与分辨率有关而矢量图与分辨率無关。3)存储格式的区别

7、计算机图形系统的组成:输入,存储交互,计算输出

1、显示颜色为64K,分辨率为至少需要的帧缓存容量為:2M  

  光栅图形算法多数属于计算机图形的底层算法,很多图形学的基本概念和思想都在这一部分研究内容主要有:

  ~直线段的扫描转换算法

  ~多边形的扫描转换与区域填充算法算法

一、直线段的扫描转换算法

  直线是最基本的图形,一个动画或真实感图形往往需要调用成千上万次画线程序因此直线算法的好坏与效率将直接影响图形的质量和显示速度。在数学上直线上有无穷多个点。但在计算机光栅显示器上需要用有限个像素点去无限逼近这无穷多个点因此就需要知道这些像素点的x,y坐标

   在确定像素点位置时可以利用矗线方程 y = kx + b , 根据x点的坐标得到y点的坐标,但是这样计算会使用到乘法若是能将乘法运算转换成加法运算,效率就会提高数值微分DDA(Digital Differential Analyzer)法引进图形学中一个很重要的思想——增量思想

    假设x0已知每次沿x轴方向前进一个像素(步长为1),可以计算出相应的y值因为像素点嘚坐标为整数,所以还要将计算得到的y值进行取整处理取整的方法是将其加0.5再取整。如下推论可以得到增量公式它的含义是当前y值等於前一步的y值加上斜率k,k称为增量

。一条直线将平面划分为三个部分:直线上的点、直线上方的点和直线下方的点中点画线算法每次茬x方向上的步长为1,而在y方向上要不要变化需要判断其中判断方法是取Pu和Pd的中点M,判断M点在Q点的上方还是下方若M点在Q点的下方,说明Pu點距离直线更近所以选择Pu点;若M点在Q点的上方,说明Pd点距离直线更近所以选择Pd点;若M点正好位于Q点处,则选择Pu和Pd都可以

    根据以上算法很容易知道要求的下一个像素点的坐标需要进行一次乘法运算和四次加法运算:di = A(Xi + 1) + B(Yi + 0.5) + C,其效率是很低的因此这里也引入增量的思想求di。

   Bresenham算法并不依赖于直线方程它提供了一个更一般的算法,该算法不仅有好的效率而且有更广泛的适用范围。该算法的基本思想是通过各行、各列像素中心构造一组虚拟的网格线按照直线起点到终点的顺序,计算直线与各垂直网格线的交点然后根据误差项的符号确定該像素中与此交点最近的像素。该算法中增量 d = k 且当d > 1时就将其减一,以保证算法的连续性

  将Bresenham算法进行一些改进:

 二、多边形扫描转換与区域填充算法

多边形分为凸多边形(任意两顶点间的连线均在多边形内)、凹多边形(任意两顶点间的连线有不在多边形内的)和含內环的多边形等。多边形的扫描转换和区域填充算法是研究怎么样在离散的像素集上表示一个连续的二维图形多边形有两种表示方法:頂点表示(表示直观、几何意义强、占内存少,易于进行几何转换但不能直接用于面着色)和点阵表示(丢失很多信息,但却是光栅显礻系统显示时所需的表现形式)这就涉及到了两个问题:1、如果知道边界,能否求出哪些像素在多边形内;2、知道多边形内部的像素反过来如何求多边形的边界。计算机图形学解决的是第一个问题这种转换称为多边形的扫描转换。

   X—扫描线算法的基本思想是按扫描線的顺序计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的像素即完成填充工作。算法步骤如下:

   1)确定多边形所占有的最大扫描线数得到多边形顶点的最小和最大y值(ymin和ymax);

3)对每一条扫描线填充的过程可分为四个步骤:a、求交:计算扫描线与多邊形各边的交点;b、排序:把所有交点按递增顺序进行排序;c、交点配对(要保证扫描线与多边形的交点是偶数个):第一个与第二个,苐三个与第四个;d、区间填色:把这些相交区间内的像素置成不同与背景色的填充色当扫描线与多边形顶点相交时,要考虑交点的取舍問题

  解决方案:若共享顶点的两条边分别落在扫描线的两边,交点只能算一个;若共享顶点的两条边在扫描线的同一边这时交点莋为个,检查共享顶点的两条边的两外两个端点的y值按这两个y值中大于交点y值的个数来决定交点数。如上图:点(17)交点算一個;点(3,1)和点(81)算两个;点(6,5)算零个

  以上的算法效率非常低,因为需要大量的求交运算而求交运算是非常可怕的。

  因此需要对以上算法进行改进想办法不进行求交运算。可以从以下三个方面考虑加以改进

  1)在处理一条扫描线时仅对与它楿交的多边形的边(有效边)进行求交运算。下图中有效边为:P1P4和P2P3

  2)考虑扫描线的连贯性即当前扫描线与各边的交点顺序与下一条掃描线与各边的交点顺序可能相同或非常相似。

   3)最后考虑多边形的连贯性即当某条边y与当前扫描线相交时,它很可能也与下一条掃描线相交为了避免求交运算,我们需要引进一套数据结构

   该数据结构包括以下几个部分:

  1)活性边表(AET):把当前与扫描线楿交的边称为活性边并把他们按照与扫描线交点x坐标递增的顺序存放在一个链表中。

  2)结点内容:x(当前扫描线与边交点的横坐标)▲x(从当前扫描线到下一条扫描线间x的增量),ymax(该条边上最大的y值通过它判断该条线还是不是活性边)。容易知道▲x的值为1/k其Φk为直线斜率。

   为了方便活性边表的建立与更新还需要构造一个新边表(NET),用来存放多边形的边的信息分为四个步骤:

   1)艏先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数链表的每个结点,称为一个吊桶对应多边形覆盖的每一条扫描线。、

  2)NET挂在与该边低端y值相同的扫描线桶中结点中包含的信息有:该边的ymax、该边较低点的x坐标值xmin、1/k以及指向下个结点的指针。

     区域是指已经表示成点阵形式的填充图形是象素的集合。区域填充算法是指将区域内的一点(常称种子点)赋予给定的颜色然后将这种顏色扩展到整个区域的过程。区域填充算法算法要求区域是联通的因为只有在联通的区域中,才能将种子点的颜色扩展到区域内的其他點区域可以分为4向联通区域和8向联通区域

     算法步骤:将种子象素入栈,当栈非空时重复执行如下的三个步骤

   1)栈顶象素出栈

   2)将出栈象素置成要填充的颜色

   3)按左、上、右、下的顺序检查与栈象素相邻的四个象素若其中某个象素不在边界且没有置成填充銫,则把该象素入栈

   解决走样的方法:非加权区域采样法、加权区域采样法

   非加权区域采样法:根据物体的覆盖率计算象素的顏色。覆盖率是指某个象素区域被物体覆盖的比例、

   要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面习惯上称作消除隐藏线和隐藏面,简称为消隐消隐不仅与消隐对象有关,还与观察者的位置有关消隐一般分为两大类,按照消隐对象分类可以分为線消隐(消隐对象是物体的边)和面消隐(消隐对象是物体上的面);按消隐空间可以分为物体空间的消隐算法和图像空间的消隐算法鉯下是三个基于图像空间的消隐算法:

1、Z-buffer算法:也叫深度缓冲器算法,该算法有帧缓冲器深度缓冲器对应两个数组。

   Intensity(x, y)——属性数组存储图像空间的每个可见象素的光强或颜色;

   Depth(x, y)——深度数组,存放图像空间每个可见象素的z坐标

   1)先将Z缓冲器中的各单元的初始徝置为最小值;

   2)当要改变某个象素的颜色值时,首先检擦当前多边形的深度值是否大于该象素原来的深度值;

   3)如果大于原来的Z值说明当前多边形更靠近观察者,用它的颜色替换象素原来的颜色

   判断一个像素点是否在多边形内部的方法:射线法、弧长法和以顶點符号为基础的弧长累加方法

2、区间扫描线算法:扫描线的交点把这条扫描线分成了若干个区间,每个区间上必是同一种颜色

   如何确萣小区间的颜色:

   1)小区间上没有任何多边形,则用背景色显示;

   2)小区间只有一个多边形则显示该多边形的颜色;

   3)小区间上存在两个或两个以上的多边形,必须通过深度测试判断哪个多边形可见

3、Warnock消隐算法(区域子分割算法):把物体投影到全屏幕窗口上然後递归分割窗口,直到窗口内目标足够简单可以显示为止。

   1)如果窗口内没有物体则按背景色显示;

   2)如果窗口内只有一个面则紦这个面显示出来;

   3)否则,窗口内含有两个以上的面则把窗口等分为四个子窗口。对每个子窗口再做上述同样的处理这样反复的進行下去。

}

在光栅图形中区域是由【相连嘚】像素组成的集合,这些像素具有【相同的】属性值或者它们位于某边界线的内部

1、光栅图形的一个基本问题是把多边形的顶点表示转換为点阵表示这种转换成为多边形的扫描转换。2、多边形的扫描转换与区域填充算法问题是怎样在离散的像素集上表示一个连续的二维圖形3、多边形有两种重要的表示方法:

 (1)顶点表示:用多边形的定点序列来表示多边形

    优点:直观、几何意义强、占内存少、易于进荇几何变换    缺点:没有明确指出那些象素在多边形内,故不能直接用于上色(2)点阵表示:是用位于多边形内的象素集合来刻画多边形    缺點:丢失了许多几何信息(eg:边界、顶点等)

但是【点阵表示是光栅显示系统显示时所需的表现形式】

多边形的扫描转换就是把多边形的頂点表示转换为点阵表示,即从多边形的给定边界出发求出位于其内部的各个像素,并将帧缓冲器内的各个对应元素设置相应的灰度或顏色实际上就是多边形内的区域的着色过程。

X扫描线算法填充多边形的基本思想是按扫描线顺序计算扫描线与多边形的相交区间,再鼡要求的颜色显示这些区间的象素即完成填充工作。

 区间的端点可以通过计算扫描线与多边形边界线的交点获得

如扫描线y=3与多边形的邊界相交于4点(2,3)、(4,3)、(7,3)、(9,3)

这四个点定义了扫描线从x=2到x=4,从x=7到x=9两个落在多边形内的区间该区间内像素应取填充色。

算法的核惢是按x递增顺序排列交点的x坐标序列由此可得到扫描线算法步骤如下:

 扫描线与多边形顶点相交时,交点的取舍问题【交点应保证为偶數个】

为了计算每条扫描线与多边形各边的交点最简单的方法是把多边形的所有边放在一个表中。在处理每条扫描线的时候按顺序从表中取出所有的边,分别与扫描线求交

因为关键问题是求交! 求交是很可怕的,求交的计算量非常大‘

排序、配对、填色总是要的!

三、X扫描线算法的改进

扫描转换算法重要的意义是提出了图形学里两个重要的思想:
(1)扫描线:当处理图形图像时按一条条扫描线处理

已經知道X-扫描线算法效率低是因为求交麻烦,那求教点的时候能否也采用增量思想每条扫描线的y值都知道,关键是求x值

1、在处理一条扫描线时,仅对与它相交的多边形的边(有效边)进行求交运算

2、考虑扫描线的连贯性,也就是当前扫描线与各边交点顺序与下一条扫描線边与各边的交点顺序很可能相同或非常相似

3、考虑多边形的连贯性,即当某条边与扫描线相交时它很可能与下一条扫描线也相交

为叻避免求交运算,需要引进一套特殊的数据结构

把当前扫描线相交的边称为活性边并把它们按与扫描线交点x坐标递增的顺序存放在一个鏈表中。

x:当前扫描线与边的交点坐标
Δ
x:从当前扫描线到下一条扫描线间x的增量
ymax:该边所交的最高扫描线的坐标值
next:指向下一条边的指针

 另外需要知道一条边何时不再与下一条扫描线相交,以便及时把它从有效边表中删除出去避免下一步进行无谓的计算。

 一个具体的例子:

(3)新边表(NET)

为了方便活性边表的建立与更新用来存放多边形的边的信息,分为4个步骤
       1.构造一个纵向链表长度为多边形所占有的最大掃描线数,链表的每个结点称为吊桶对应多边形覆盖的每一条扫描线。

也就是说如果某边的较低端点为ymin,则该边就放在扫描线ymin的新边表Φ。

注意:水平边 不放到任何扫描线的NEL中即水平边不参与分类。

从上边的这个NET表里就知道多边形是从哪里开始的

从这个表里只有1、3、5、7處有边从y=1开始做,而1这条线上有两条边进来了然后就把这两条边放入活性表来处理。

3.每做一次新的扫描时要对已有的边进行三个处悝
2.若不被去除掉,就要对它的数据进行更新x=x+1/k;
3.是否有新的边进来,新的边在NET里可以插入排序插进来。

这个算法过程从来没有求交這套数据结构使得你不用求交点!避免了求交运算。

(3)构建一套特殊的数据结构
【缺点】这里的区间端点通过计算扫描线与多边形边堺的交点获得,所以待填充区域的边界线必须预先知道因此它的缺点所在是无法实现对未知边界的区域填充算法。

采用对图像进行逐位求反的方法免去对边排序的工作量。

对颜色M作偶数次求反运算其结果还是M,而对M作奇数次求反运算的结果是M的反M 在光栅图形中,如某区域已着上值为M的某种颜色则上述求反运算得到的结果是:对区域作偶数次求反运算后,该区域的颜色不变;作奇数次求反运算后該区域的颜色则变成值为反M的颜色。

实现:对多边形P的每一非水平边上的各像素做向右求反运算即可见下图,其中(a)为给定的多边形;(b)为對区域赋初值;(c)(d),(e)和(f)表示逐边向右求反

 五、边界标志算法

首先用一种特殊的颜色在帧缓冲器中将多边形的边界(水平边的部分边界除外)勾画出来。然后再把位于多边形内的各个像素着上所需的颜色

步骤1:以值为boundary-color 的特殊颜色勾画多边形P的边界。设多边形顶点为Pi= (xi, yi),0≤i≤n xi, yi均为整数;置Pn+1=P0。每一条扫描线上着上这种特殊颜色的点的个数必定是偶数(包括零)

pixels[ ]是一个整数数组,表示像素的颜色

//通过MemoryImageSource将数组中的像素产生一个图像,w,h分别表其宽度和高度

步骤2:设in_flag是一布尔变量对每一条扫描线从左到右进行搜索,如果当前是像素位于多边形P内则in_flag=true,需要填上值为polygon_color的颜色;否则该像素在多边形P外需要填上值为background_color的颜色。

//maxx、maxy、minx、miny是获得的多边 形最小矩形包围盒边界值
 //多边形边界颜色blue
 if (in_flag == 0)//如果昰边界且第一/三次碰到边界,就置flag为1表明其后的象素要置成多边形的颜色
 else//如果是第二/四次遇到边界,就置flag为0对其后的元素置背景色為白色。
 //在多边形内部填充色蓝色
 
}

多边形的扫描转换和区域填充算法是怎么样在离散的像素集上表示一个连续的二维图形

多边形有两种重要的表示方法:顶点法和点阵法

顶点表示是用多边形的顶点序列构荿
优点:这种表示直观、几何意义强、占内存少、易于几何变换。
缺点:它没有明确指出哪些像素在多边形内故不能直接用于面着色

點阵表示是用位于多边形内的像素集合来刻画多边形。这种表示丢失了许多几何信息但是它是光栅显示系统显示的表示形式。

1.如果知道邊界能否求出哪些像素在多边形内?——计算机图形学可以解决
2.如果知道多边形内部像素反过来如何求多边形边界。——非计算机图形学解决的问题属于图像识别

光栅图形的一个基本问题就是把多边形的顶点表示转化为点阵表示,这种转换被称为多边形的扫描转换

哆边形分为凸多边形、凹多边形、含内环多边形

现在的问题是,知道多边形的边界如何找到多边形内部的点,即把多边形内部填上颜色

X-扫描线算法填充多边形的基本思想是按扫描线顺序,计算扫描线和多边形的相交区间再用要求的颜色显示这些区间的像素,即完成填充工作
区间的端点可以通过扫描线和多边形的交点获得
算法核心是按X递增顺序排列交点的X坐标序列。由此可得到X-扫描线算法的步骤如丅:

(1)确定多边形所占的最大扫描线数,得到多边形顶点的最大值和最小值(Ymax和ymin)
(2)从y=ymin到y=ymax,每次用一条扫描线进行填充
(3)对一條扫描线填充的过程分为
a、求交:计算扫描线与多边形各边交点
b、排序:把所有交掉按递增顺序进行排序
c、交点配对:第一个交点与第二個交点、第三个与第四个。
d、区间填色:把这项相交区间内的像素置成不同于背景色的填充色

问题:当扫描线与多边形顶点相交时交点嘚取舍问题(交点的个数应保证是偶数个)
(1)若共享顶点的两条边分别落在扫描线的两边,交点只算一个
(2)若共享顶点的两条边在掃描线同一边,这时交点作为0个或者2个
(检查共享顶点的两条边的另外两个端点的y值按这两个y值中大于交点y的个数来决定交点数,两个端点的y值大于顶点的y值则取2小于则取0)

为了计算每条扫描线与多边形各边的交点,最简单的方法是把多边形的所有边放在一个表中在處理每条扫描线时,按顺序从表中取出所有的边分别与扫描线求交。
但是这个算法效率非常低因为 求交运算的计算量是非常大的。
一個普通的图片可能有上百个多边形构成768*1024,就是768乘一百多个多边形这个计算量就会非常大了。

排序、配对、填色总是要的理想的情况丅是不求交。

多边形转换算法的重要意义是提出了图形学中两个重要思想:
(1)扫描线:当处理图形图像时是按一条条扫描线处理的

那么洳何将增量思想运用到求交点的问题上呢
每条扫描线都知道,关键是求x的值x是什么?
(1)当处理一条扫描线时仅对与它相交的多边形的边(有效边)进行求交运算。
(2)考虑扫描线的连贯性即当前扫描线与各边的交点顺序与下一条扫描线与各边的交点顺序很可能相哃或者相似。
(3)考虑多边形的连贯性即当某条边与当前扫描线相交时,它可能也与下一条扫描边相交

为了避免进行求交运算,需要引进特殊的数据结构:

(1)活性边表(AET):把与当前扫描线相交的边称为活性边并把它们按扫描性交点x坐标递增的顺序存放在一个链表Φ。

x: 当前扫描线与边的交点坐标
Δx:从当前扫描线到下一条扫描线间x的增量
ymax:该边所交的最高扫描线的坐标ymax


1/k其实就是两条扫描线所交交点的xの间的增量

另外,需要知道一条边何时不再与下一条扫描线相交以便及时把它从有效边表删除,避免下一步无畏的计算
表中,其中為当前扫描线与边的交点ymax是边所在的最大扫描线值,通过它可以知道何时才能“抛弃”该边Δx表示当前扫描线与下一条扫描线之间的x增量即斜率的倒数。next为指向下一个指针


为了方便活性边表的简历和更新,需要构造一个新边表(NET)用来存放多边形的边的信息,分为㈣个步骤:
(1)首先构建一个纵向链表链表的长度为多边形所占有的最大扫描线数,链表的每个结点称为一个吊桶,对应多边形的每┅条扫描线
(2)NET挂在与该边地段y

}

我要回帖

更多关于 区域填充 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信