扫描线
来源:互联网 发布:linux启动php服务命令 编辑:程序博客网 时间:2024/04/28 18:52
.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所示。
· 扫描线与多边形相交的边分别位于扫描线的两侧,则计一个交点,如点P5,P6。
· 扫描线与多边形相交的边分别位于扫描线同侧,且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 扫描线与多边形相交,特殊情况的处理
- 扫描线
- 扫描线
- 扫描线
- 扫描线
- 扫描线
- 扫描线
- 多边形扫描线算法
- HDU 4007 线扫描
- 线段树[扫描线]
- HDU 3511扫描线
- CF286D 扫描线+STL
- poj1151--Atlantis--扫描线
- poj1177--Picture--扫描线
- hdu1542 扫描线
- POJ1151 Atlantis 【扫描线】
- HDU 1255 扫描线
- City Game(扫描线)
- 线段树+扫描线
- c# 获取当前项目路径
- mysql Access denied for user 'root'@'%' (using password: YES)
- LIS 最长上升子序列N^2以及nlogn算法
- Struts2标签详解
- 字符串分割
- 扫描线
- Java集合
- POJ 1852 Ants 蚂蚁
- struct epoll_event
- FATFS文件系统打开一个文件并读出内容
- SQL Server中的执行引擎入门
- poj2533 Longest Ordered Subsequence
- linux之ioctl函数解析
- LDT