扫描线算法
来源:互联网 发布:草图大师连接不到网络 编辑:程序博客网 时间:2024/06/01 16:34
基本思想
按扫描线顺序,
计算扫描线与多边形的相交区间,
再用要求的颜色显示这些区间的
象素,即完成填充工作。
对于一条扫描线填充过程可以分为四个步骤:
(1)
求交:计算扫描线与多边形各边的交点
(2)
排序:把所有交点按
x
坐标递增顺序来排序
(3)
配对:确定扫描线与多边形的相交区间,第一个与第二个,第三个与第四个等等,
每对交点代表扫描线与多边形的一个相交区间
(4)
填充:显示相交区间的象素
基本思想 按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。
对于一条扫描线填充过程可以分为四个步骤:
(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= ((-b yi+1)-c)/a = ((-b yi+1)-c)/a = xi-b/a
增量为 -b/a
故在活性边表中需要存放的信息:
x:当前扫描线与边的交点
△x = -b/a:从当前扫描线到下一条扫描线之间的 x 增量
ymax:该边所交的最高扫描线
- 多边形扫描线算法
- 扫描线算法
- 扫描线算法实现
- 扫描线填充算法
- 扫描线区域填充算法
- 多变形扫描线算法
- 扫描线填充算法类
- 扫描线种子填充算法
- 线段树扫描线算法
- 扫描线种子填充算法
- 图形学扫描线填充算法
- OpenGL实现多边形扫描转换的扫描线算法
- 扫描线-通用多边形填充算法
- c实现的扫描线算法
- 区域填充之扫描线算法
- 扫描线算法-求线段交点数量
- 轮廓线扫描算法:Theo Pavlidis' Algorithm
- 扫描线算法判断多边形是否合法
- php中echo和return的区别
- webservice笔记--51学院webservice教程
- Oracle 补丁下载地址
- GIT命令速查表
- GBDT(MART) 迭代决策树算法 深入浅出
- 扫描线算法
- retnioPmodnaRhtiWtsiLypoC.138
- 双端队列
- asynctaskdownload
- Java反射机制
- CString 运算时产生的错误
- 一次性清空某个数据库中所有表数据的SQL
- 打造自己的Python编码环境
- linux初学之4——常用命令 之 目录操作命令