`
xxx0624
  • 浏览: 31703 次
文章分类
社区版块
存档分类
最新评论

扫描线

 
阅读更多
 

.3 多边形的扫描转换与区域填充

扫描线算法

扫描线算法是按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,完成转换工作。区间的端点可以通过计算扫描线与多边形边界线的交点获得。对于一条扫描线,多边形的扫描转换过程可以分为四个步骤:

(1)求交:计算扫描线与多边形各边的交点;

(2)排序:把所有交点按x值递增顺序排序;

(3)配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间,

(4)着色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。

图2.3.2 一个多边形与若干扫描线

为了提高效率,在处理一条扫描线时,仅对与它相交的多边形的边进行求交运算。我们把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中,称此链表为活性边表(AET)。

(a)扫描线6的活性边表

(b)扫描线7的活性边表

图2.3.3活性边表(AET)

假定当前扫描线与多边形某一条边的交点的横坐标为x,则下一条扫描线与该边的交点不必要重计算,只要加一个增量△x即可,下面,我们推导这个结论。

设该边的直线方程为:ax+by+c=0,当前扫描线及下一条扫描线与边的交点分别为(xi,yi)、(xi+1,yi+1),则:

axi+byi+c=0

axi+1+byi+1+c=0

其中x=-b/a 为常数,

另外使用增量法计算时,我们需要知道一条边何时不再与下一条扫描线相交,以便及时把它从活性边表中删除出去。综上所述,活性边表的结点应为对应边保存如下内容:第1项存当前扫描线与边的交点坐标x值;第2项存从当前扫描线到下一条扫描线间x的增量Dx;第3项存该边所交的最高扫描线号ymax

为了方便活性边表的建立与更新,我们为每一条扫描线建立一个新边表(NET),存放在该扫描线第一次出现的边。也就是说,若某边的较低端点为ymin,则该边就放在扫描线ymin的新边表中。

图2.3.4 上图所示各条扫描线的新边表NET

算法过程:

void polyfill (polygon, color)

int color;多边形 polygon;

{ for (各条扫描线i )

{ 初始化新边表头指针NET [i];

把y min = i 的边放进边表NET [i];

}

y = 最低扫描线号;

初始化活性边表AET为空;

for (各条扫描线i )

{ 把新边表NET[i]中的边结点用插入排序法插入AET表,使之按x坐标递增顺序排列;

遍历AET表,把配对交点区间(左闭右开)上的象素(x, y),用drawpixel (x, y, color) 改写象素颜色值;

遍历AET表,把y max= i 的结点从AET表中删除,并把y max > i结点的x值递增D x;

若允许多边形的边自相交,则用冒泡排序法对AET表重新排序;

}

} /* polyfill */

扫描线与多边形顶点相交时,必须正确地取舍交点,如图2.3.5所示。

· 扫描线与多边形相交的边分别位于扫描线的两侧,则计一个交点,如点P5P6

· 扫描线与多边形相交的边分别位于扫描线同侧,且 yi<yi-1,yi<yi+1,则计2个交点(填色),如P2。若 yi>yi-1,yi>yi+1,则计0个交点(不填色),如P1

· 扫描线与多边形边界重合 (当要区分边界和边界内区域时需特殊处理),则计1个交点。 

具体实现时,只需检查顶点的两条边的另外两个端点的y值。按这两个y值中大于交点y值的个数是0,1,2来决定。

图2.3.5 扫描线与多边形相交,特殊情况的处理



分享到:
评论

相关推荐

    JAVA实现扫描线算法(超详细)

    JAVA实现扫描线算法的知识点总结 扫描线算法是计算机图形学中的一种常用算法,用于实现多边形的扫描线填充。下面是JAVA实现扫描线算法的知识点总结: 1. 扫描线算法的基本概念: 扫描线算法是从Ymin开始扫描,...

    扫描线填充算法

    **扫描线填充算法** 扫描线填充算法是一种在计算机图形学中广泛使用的算法,主要用于在二维图形中填充多边形内部的区域。它的工作原理是通过水平地遍历多边形,将每一行与多边形边界的交点记录下来,然后在这些交点...

    扫描线填充_opengl扫描线填充_

    扫描线填充是通过将屏幕分成水平线(即扫描线),然后根据多边形边界与扫描线的交点来填充颜色。对于一个六边形,我们首先需要确定它的顶点坐标,然后计算每条扫描线与六边形边缘的交点。 在OpenGL中,我们可以使用...

    多边形填充扫描线算法

    这里我们关注的是“多边形填充扫描线算法”,它在VS2008环境下,通过OpenGL实现,并利用了GLUT库。这个算法主要涉及到图形的绘制、鼠标交互以及图形库的使用。 首先,我们要理解扫描线算法的基本思想。扫描线算法是...

    MFC扫描线区域填充算法

    《MFC扫描线区域填充算法详解》 在计算机图形学领域,区域填充是一种常见的任务,它涉及将指定区域内填充特定的颜色或图案。MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,用于构建Windows应用程序...

    计算机图形学试验扫描线填充算法源代码

    在每一条扫描线上,算法会检测扫描线与图形边界点的交点,并根据交点信息来决定该扫描线上哪些像素应被填充。传统的扫描线填充算法通常采用以下步骤: 1. 边界检测:首先,需要确定图形的边界,这通常通过解析图形...

    C#实现种子扫描线填充算法

    种子扫描线填充算法是一种在计算机图形学中广泛用于填充二维图形内部区域的算法。它主要应用于图像处理、游戏开发和2D图形用户界面设计等领域。本文将深入探讨如何使用C#语言来实现这一算法。 首先,理解种子填充...

    计算机图形学 扫描线种子填充算法c#实现

    计算机图形学 扫描线种子填充算法实现 1、初始化堆栈。  2、种子压入堆栈。  3、while(堆栈非空)  {  (1)从堆栈弹出种子象素。  (2)如果种子象素尚未填充,则:  a.求出种子区段:xleft、xright;  b.填充...

    c实现的扫描线填充算法

    扫描线填充算法是一种在计算机图形学中用于填充二维图形内部的常用方法,尤其适用于填充多边形。在C语言中实现这种算法,可以提高程序的效率和灵活性。下面将详细介绍扫描线填充算法的工作原理以及如何用C语言进行...

    基于EasyX库下的扫描线填充算法

    扫描线填充算法是一种在二维图形处理中常见的技术,主要用于图像的内部填充,它通过一系列的逻辑操作将指定区域内的像素点染成特定的颜色。在基于EasyX库的应用中,这种算法能够有效地帮助开发者实现图形的内部填充...

    扫描线消隐算法VC++实现

    扫描线消隐算法是计算机图形学中的一个经典技术,它主要用于处理三维图形在二维屏幕上的显示,使得图像更具立体感和真实感。在本项目中,"扫描线消隐算法VC++实现" 是一个利用MFC(Microsoft Foundation Classes)...

    扫描线多边形填充算法实现

    **扫描线多边形填充算法实现** 在计算机图形学领域,多边形填充是一种常见的任务,用于绘制出具有内部颜色的多边形。本篇将详细介绍如何在Microsoft Foundation Classes (MFC) 框架中实现扫描线填充算法,这是一种...

    扫描线法填充多边形(完整C++代码)(QT工程)

    扫描线法填充多边形是计算机图形学中的一个重要概念,主要应用于二维图形的处理,例如在游戏开发、图像处理软件和CAD系统中。本项目利用C++编程语言和QT库实现了一个扫描线填充多边形的示例。下面将详细阐述相关知识...

    扫描转换多边形的扫描线算法代码

    扫描线算法是一种在计算机图形学中用于绘制二维多边形的重要方法。它的基本思想是将屏幕分解成一系列水平线(即扫描线),然后按照扫描线的顺序处理多边形的边缘,从而填充或描绘出多边形。这个过程通常包括边界检测...

    c++实现扫描线填充算法

    **C++实现扫描线填充算法** 扫描线填充算法是一种在计算机图形学中广泛使用的填充算法,主要用于二维图形的内部填充。这种算法通过沿图形的边界垂直地扫过一系列水平线,然后对每条扫描线上的边界点进行处理,从而...

    ScanFill_x扫描线算法_线扫描_

    《X扫描线算法详解及其应用》 X扫描线算法,是一种在二维图形处理中用于填充多边形的有效方法。该算法的基本思想是沿着水平方向,即X轴,以一定的顺序扫描,通过计算每条扫描线与多边形边界的交点,确定在屏幕上...

    多边形扫描线填充(有序边算法实现)

    标题中的“多边形扫描线填充”是一种图形处理技术,用于在计算机屏幕上为多边形内部涂色。这种算法通常基于“有序边表”(Sorted Edge Table)或“扫描线算法”。在C++ MFC(Microsoft Foundation Classes)环境中,...

    OpenCV实现的区域填充扫描线算法

    OpenCV,一个广泛使用的开源计算机视觉库,提供了多种实现区域填充的方法,其中包括扫描线算法。本文将深入探讨如何利用OpenCV来实现基于扫描线的区域填充算法,并介绍相关的关键概念和技术。 首先,我们要理解什么...

    多边形区域的扫描线填充、扫描线种子填充算法实现

    本文将深入探讨两种常见的填充算法:扫描线填充算法和种子填充算法,并在MFC(Microsoft Foundation Classes)框架下实现它们。 首先,扫描线填充算法是一种基于垂直扫描线的填充方法。其基本思想是从图形的最高点...

Global site tag (gtag.js) - Google Analytics