概述
扫描填充图元生成
基本过程
遍历所有的扫描线:
- 求交点,按照顺时针(逆时针)确定和多边形边的交点位置
- 按横坐标排序
- 配对储存
- 对交点坐标取整并填充每对交点之间的像素点。
需要考虑两种特殊情况,即当有边端点通过扫描线时:
- 如果共享顶点的两条边在扫面线同侧,则将其视为两个顶点。
- 否则,将下方端点下移一个像素/上方顶点上移一个像素
加速计算
为了加速计算引入有序边表和活化边表两个概念。
- 有序边表(ET):为每条扫描线建立一个桶,将下端点在其上的边归入对应桶中,同一桶中按照横坐标排序。
- 活化边表(AET):即和当前扫描线相交的边的交点链表,通过如下过程计算:
- 将当前扫描线以下的有序边表合并后插入活化边表。(下端点在扫描线下)
- 删除其中 y m a x < y k y_{max}<y_k ymax<yk的边。(过滤上端点在扫面线下的边)
- 根据直线斜率计算交点。
区域填充图元生成
区域的表示
- 内点法:枚举出给定区域内所有像素。
- 边界表示:枚举出给定区域所有边界上像素。
连通性
常用连通性:
- 4连通:上下左右互相可达。( d ∈ { 1 } din {1} d∈{1})
- 8连通:以当前像素为中心的九宫格中其余八可达。( d ∈ { 1 , 2 } din {1,sqrt{2}} d∈{1,2})
- 16连通:在8联通基础上增加8个马步距离可达,即1*2方格对角线。( d ∈ { 1 , 2 , 5 } din {1,sqrt{2},sqrt{5}} d∈{1,2,5})
连通性的性质:
- 当前点和在连通邻域中的点属于同一区域
- 像素4连通的区域的边界像素只需是8连通
- 像素8连通的区域的边界像素必须是4连通,否则欠约束。
- 如下图,如果中间区域为8连通区域,则黄色点和青色点为同一区域,红色边界失效。
内外部判定
奇偶规则:
从任何位置p到区域范围以外远距离画一射线,并统计沿该射线与区域多边形边界的交点数目。
- 若该射线与区域多边形边界的交点数目为奇数,则p是内部点
非零环绕数规则
将环绕数初始化为零,再假想从待检测点位置P画一射线,P点沿射线方向移动时,计数每个方向上穿越射线的边数(可通过方向向量乘法判断)。
- 当多边形边从右到左穿越射线时,环绕数加1
- 当多边形边从左到右穿越射线时,环绕数减1
- 如果最终环绕数非零则为区域内部点
填充算法
一般区域填充算法都是指定种子点后填充该种子点所在的区域。
- 递归填充:按照连通性,从种子点开始递归填充直到填满。
- 扫描线填充:为了减少栈深度,每次填充该点所在的扫描线,并将相邻扫描线段起始像素坐标入栈。
最后
以上就是懦弱月饼为你收集整理的图形学笔记(三)——填充图元的全部内容,希望文章能够帮你解决图形学笔记(三)——填充图元所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复