我是靠谱客的博主 懦弱月饼,最近开发中收集的这篇文章主要介绍图形学笔记(三)——填充图元,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

扫描填充图元生成

基本过程

遍历所有的扫描线:

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

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

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

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

  • 有序边表(ET):为每条扫描线建立一个桶,将下端点在其上的边归入对应桶中,同一桶中按照横坐标排序。
  • 活化边表(AET):即和当前扫描线相交的边的交点链表,通过如下过程计算:
    • 将当前扫描线以下的有序边表合并后插入活化边表。(下端点在扫描线下)
    • 删除其中 y m a x &lt; y k y_{max}&lt;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
  • 如果最终环绕数非零则为区域内部点
填充算法

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

  • 递归填充:按照连通性,从种子点开始递归填充直到填满。
  • 扫描线填充:为了减少栈深度,每次填充该点所在的扫描线,并将相邻扫描线段起始像素坐标入栈。

最后

以上就是懦弱月饼为你收集整理的图形学笔记(三)——填充图元的全部内容,希望文章能够帮你解决图形学笔记(三)——填充图元所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部