线段树算法 ---- 扫描线之面积并
来源:互联网 发布:thinking in java在线 编辑:程序博客网 时间:2024/05/16 11:15
一、扫描线算法
基本思想
按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。
对于一条扫描线填充过程可以分为四个步骤:
(1) 求交:计算扫描线与多边形各边的交点
(2) 排序:把所有交点按 x 坐标递增顺序来排序
(3) 配对:确定扫描线与多边形的相交区间,第一个与第二个,第三个与第四个等等,每对交点代表扫描线与多边形的一个相交区间
(4) 填充:显示相交区间的象素
存在问题1:当扫描线与多边形顶点相交时,交点的取舍问题
解决方法:当扫描线与多边形的顶点相交时,若共享顶点的两条边分别落在扫描线的两边,交点只算一个;若共享顶点的两条边在扫描线的同一边,这时交点作为零个或两个,取决于该点是多边形的局部最高点或局部最低点。
具体实现:只需检查顶点的两条边的另外两个端点的 y 值,按这两个 y 值中大于交点y 值的个数是0,1,2 来决定。
存在问题2:多边形边界上象素的取舍
解决方法:规定右/上边界的象素不予填充;左/下边界的象素予以填充。
具体实现:对扫描线与多边形的相交区间取左闭右开。
算法的实现
求交
一条扫描线往往只和少数几条边相交。
与当前扫描线相交的边称为活性边,把它们按与扫描线交点 x 坐标递增的顺序存入一个链表中,称为活性边表 ( AET, Active Edge Table)
由边的连贯性(当某条边与当前扫描线相交时,它很可能也与下一条扫描线相交)和扫描线的连贯性(当前扫描线与各边的交点顺序,与下一条扫描线与各边的交点顺序很可能相同或类似),只需对当前扫描线的活性边表作更新,即可得到下一条扫描线的活性边表。
计算下一条扫描线与边的交点
设直线方程:a x + b y + c = 0,
当前交点坐标:(xi ,yi),下一交点坐标:(xi+1 ,yi+1)
xi+1=((-byi+1)-c)/a = ((-b yi+1)-c)/a =xi-b/a 增量为 -b/a
故在活性边表中需要存放的信息:
x:当前扫描线与边的交点
△x = -b/a:从当前扫描线到下一条扫描线之间的x 增量
ymax:该边所交的最高扫描线
上图为扫描线 6 的活性边表 左图为扫描线 7 的活性边表
- 线段树算法 ---- 扫描线之面积并
- hdu 1542 线段树之扫描线之面积并
- 线段树扫描线面积并hdu1542
- Atlantis 线段树扫描线--面积并
- 【线段树 面积并 扫描线】HDU
- FAFU-1398 面积 矩形面积并 线段树+扫描线
- 线段树+扫描线求矩阵面积并
- hdu 1542 Atlantis 面积并 线段树 扫描线
- HDU1542 Atlantis(扫描线+矩形面积并+线段树)
- POJ1151(线段树+扫描线求矩形面积并)
- hdu 1542 Atlantis(线段树 面积并+扫描线)
- 线段树求矩形面积并 扫描线+离散化
- hdu 1542 Atlantis(线段树&扫描线&面积并)
- hdu1542 线段树扫描线求矩形面积的并
- hdu 1542 扫描线+线段树求矩阵面积并
- HDU 1542 Atlantis(线段树扫描线,面积并)
- hdu 1542 矩形面积并(扫描线+线段树)
- HDU 1542 Atlantis (线段树扫描线求面积并)
- SVN三种合并类型
- mysql常用
- 枚举类型的组合
- tnsnames.ora配制文件
- Hadoop2中的日志
- 线段树算法 ---- 扫描线之面积并
- ZOJ 3322 Who is Older?.
- 最全的Android开发资源整理--进阶必备
- ZF2搭建
- OCP 1Z0 053 33
- mac 卸载mysql,
- <button>的onmoseovert js事件改变this.src地址失败
- struts2源码解析一 Struts2 日记原理及配置方法
- linux下非阻塞的tcp研究