计算机图形学 第4章 多边形填充

前驱知识

  • 了解扫描转换的基本概念。
  • 熟练掌握多边形有效边表填充算法。
  • 掌握多边形边缘填充算法。
  • 熟练掌握区域四邻接点和八邻接点区域填充算法。
  • 掌握区域扫描线种子填充算法。

无论使用哪种着色模式,都意味着要使用指定颜色为多边形边界内的每一个像素着色。

在这里插入图片描述

在这里插入图片描述

多边形的表示 有两种:⑴顶点表示法;⑵点阵表示法

多边形的扫描转换

定义:将多边形的描述从顶点表示法变换到点阵表示法的过程,称为多边形的扫描转换。

即从多边形的顶点信息出发,求出位于多边形内部的各个像素点信息,并将其颜色值写入帧缓冲的相应单元中。

在这里插入图片描述
多边形可以使用平面着色模式(flat shading mode)或光滑着色模式(smooth shading mode)填充。



ET表(边表):用来存放多边形除水平边外的所有边的信息。
AET表(有效边表):与当前扫描线相交的多边形的边。

多边形填充的主要算法是扫描线算法
先确定多边形覆盖的扫描线条数,对每一条扫描线,计算扫描线与多边形边界的交点区间,如果能判断该区间在多边形内部,则将其内的像素绘制为指定的颜色。

扫描线算法在处理每条扫描线时,需要与多边形的所有边求交,处理效率很低。改进的算法是有效边表算法

对一条扫描线的填充一般分为以下4个步骤

  • 求交:计算扫描线与多边形各边的交点;
  • 排序:把扫描线上所有交点按递增顺序进行排序;
  • 配对:将第一个交点与第二个交点,第三个交点与第四个交点等等进行配对,每对交点代表扫描线与多边形的一个相交区间。
  • 着色:把区间内的像素置为填充色。

种子填充算法是从区域内的一个种子位置开始,由内向外用填充颜色绘制种子及其相邻像素直到颜色不同的边界像素为止。
种子填充算法主要分为4邻接点算法和8邻接点算法。


有效边表填充算法

原理

填充原理是按照扫描线从小到大的移动顺序,计算当前扫描线与有效边的交点,然后把这些交点按x值递增的顺序进行排序、配对,以确定填充区间,最后用指定颜色填充区间内的所有像素,即完成填充工作。

有效边表填充算法已成为目前最为有效的多边形填充算法之一。

边界像素处理原则

填充左下角为(1,1),右上角为(3,3)的正方形时,若将边界上的所有像素全部填充,就得到图示的结果。
在多边形填充过程中,常采用“左闭右开”和“下闭上开”的原则对边界像素进行处理。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

怎么算交点

这里 相对于 扫描线 的位置都是上下关系,不是左右关系。
在这里插入图片描述

有效边

在这里插入图片描述
在这里插入图片描述
为了确定在哪条扫描线上插入了新边,就需要构造一个边表(edge table,ET),用以存放扫描线上多边形各条边出现的信息

因为水平边的1/k为∞,并且水平边本身就是扫描线,在建立边表时可以不予考虑。

桶表与边表

为了确定在哪条扫描线上插入了新边,就需要构造一个边表(edge table,ET),用以存放扫描线上多边形各条边出现的信息。因为水平边的1/k为∞,并且水平边本身就是扫描线,在建立边表时可以不予考虑。

桶表表示法

桶表是按照扫描线顺序管理边出现情况的一个数据结构。

  • 构造一个纵向扫描线链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点称为桶(bucket),对应多边形覆盖的每一条扫描线。
  • 在这里插入图片描述

桶类的代码

class CBucket  
{
   
public:
		CBucket();
		virtual ~CBucket();
public:
		int      ScanLine;   //扫描线
		CAET     *p;      //桶上的边表指针
		CBucket  *next;
};

  • 在这里插入图片描述

在这里插入图片描述
其实,书上所谓的新边,是指从第一条扫描线(都是从上到下)开始,依次记入与之相交的边按x/y(min)放入链表,重复的边(之前的扫描线已经放入自己的链表的边)不放入。最后所有链表中元素的个数应该等于多边形边的条数。所以这儿的新边并不是我们额外再添几条边,而是从零开始建立多边形。另外在这儿我们不能仅仅局限于书上面说的那个y=1到y=12的多边形,很多多边形并不是都是整数顶点并且这么有规律的摆放在像素坐标系上的。要深入学会桶表与边表,首先要知道我们在扫描转换的时候的坐标系,实际上是像素点构成的坐标系,每个单位点都对应一个像素点,而扫描线就是从以此构成的坐标系中每条y=Z(Z为任意整数)直线。我们要讨论的,就是把多边形以合适的方式放入坐标系后,从与这个多边形相交的第一条扫描线(从下到上,顶点相交的也算)开始写边表。

有了以上的认识后我们开始来正式的认识桶表与边表。要注意桶表与边表是一个整体的表,类似于有效边表,而非两个表。假如多边形所对应的扫描线是y=1到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒回顾,半缘君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值