图形学笔记(三)——填充图元

扫描填充图元生成

基本过程

遍历所有的扫描线:

  • 求交点,按照顺时针(逆时针)确定和多边形边的交点位置
  • 按横坐标排序
  • 配对储存
  • 对交点坐标取整并填充每对交点之间的像素点。

需要考虑两种特殊情况,即当有边端点通过扫描线时:

  • 如果共享顶点的两条边在扫面线同侧,则将其视为两个顶点。
  • 否则,将下方端点下移一个像素/上方顶点上移一个像素
加速计算

为了加速计算引入有序边表和活化边表两个概念。

  • 有序边表(ET):为每条扫描线建立一个桶,将下端点在其上的边归入对应桶中,同一桶中按照横坐标排序。
  • 活化边表(AET):即和当前扫描线相交的边的交点链表,通过如下过程计算:
    • 将当前扫描线以下的有序边表合并后插入活化边表。(下端点在扫描线下)
    • 删除其中 y m a x &lt; y k y_{max}&lt;y_k ymax<yk的边。(过滤上端点在扫面线下的边)
    • 根据直线斜率计算交点。

区域填充图元生成

区域的表示
  • 内点法:枚举出给定区域内所有像素。
  • 边界表示:枚举出给定区域所有边界上像素。
连通性

常用连通性:

  • 4连通:上下左右互相可达。( d ∈ { 1 } d\in \{1\} d{1})
  • 8连通:以当前像素为中心的九宫格中其余八可达。( d ∈ { 1 , 2 } d\in \{1,\sqrt{2}\} d{1,2 })
  • 16连通:在8联通基础上增加8个马步距离可达,即1*2方格对角线。( d ∈ { 1 , 2 , 5 } d\in \{1,\sqrt{2},\sqrt{5}\} d{1,2 ,5 })

连通性的性质:

  • 当前点和在连通邻域中的点属于同一区域
  • 像素4连通的区域的边界像素只需是8连通
  • 像素8连通的区域的边界像素必须是4连通,否则欠约束。
    • 如下图,如果中间区域为8连通区域,则黄色点和青色点为同一区域,红色边界失效。

在这里插入图片描述

内外部判定
奇偶规则:

从任何位置p到区域范围以外远距离画一射线,并统计沿该射线与区域多边形边界的交点数目。

  • 若该射线与区域多边形边界的交点数目为奇数,则p是内部点
非零环绕数规则

将环绕数初始化为零,再假想从待检测点位置P画一射线,P点沿射线方向移动时,计数每个方向上穿越射线的边数(可通过方向向量乘法判断)。

  • 当多边形边从右到左穿越射线时,环绕数加1
  • 当多边形边从左到右穿越射线时,环绕数减1
  • 如果最终环绕数非零则为区域内部点
填充算法

一般区域填充算法都是指定种子点后填充该种子点所在的区域。

  • 递归填充:按照连通性,从种子点开始递归填充直到填满。
  • 扫描线填充:为了减少栈深度,每次填充该点所在的扫描线,并将相邻扫描线段起始像素坐标入栈。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值