区域填充之扫描线算法

本文介绍了如何使用扫描线算法来填充非自交多边形。通过求解扫描线与多边形边的交点,对交点间区域进行填充。在处理过程中,遵循特定的边界规则,并通过活性边表(AEL)提高算法效率。对于特殊情况,如共享交点和水平边,也进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       利用相邻像素之间的连贯性,提高算法效率。根据多边形内部点的连续性知:一条扫描线与多边形的交点中,入点和出点之间所有点都是多边形的内部点。所以,对所有的扫描线填充入点到出点之间所有的点就可填充多边形。

(1)处理对象:非自交多边形(边与边之间除了顶点外无其它交点)

判断扫描线上的点是否在多边形之内,根据多边形区域连续性,分为3个步骤:

– 求出扫描线与多边形所有边的交点;

– 把这些交点的x坐标值以升序排列;

– 对每一对交点间的区域进行填充。

– 第三个步骤是从奇数个交点出发到偶数个交点。如右图,对y=8的扫描线排序x坐标得到的表是(2,4,9,13),然后对交点2与4之间、9与13之间的所有象素点进行填充。

(2)几点规则:

边界上的象素:“左闭右开”,“下闭上开”(将左边界和下边界的点算为内部,而将右边界和上边界算为外部)

顶点:“上开下闭”。

(3)几种特殊情况:

1.扫描线交于一顶点,共享的两条边分另处于扫描线的两边,这时交点只取一个,如扫描线y=3,该点被填充一次。

2.   共享交点的两条边处于扫描线的上方,这时交点取二个,如扫描线y=1,该点被填充一次。

3.共享交点的两条边处于扫描线的下方,这时交点取0个,如扫描线y=9,无交点,不填充。

4.水平边在算法中不起任何作用,可不考虑。

 活性边表(提高效率):

      为了减少求交的计算量,要利用一条边与相继的两条扫描线的交点的连贯性。在处理一条扫描线时只对活性边(与它相交的多边形的边)进行求交运算。把交点按x增加方向存在一个链表(活性边表)中。

活性边:与当前扫描线相交的边。

活性边表(AEL):按交点x的增量顺序存放在一个链表中,该链表称作活性边表(AEL)。

源程序:

#include <stdio.h>
#include <GL/glut.h>
static int n;
static int y_max;
static int x_max;
typedef struct Point {
	int x;
	int y;
} Point1;
static P
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值