Weiler-Atherton多边形裁剪算法

来源:互联网 发布:php strcasecmp 编辑:程序博客网 时间:2024/05/21 19:35

来自:http://blog.csdn.net/liaojinyu282/article/details/6011177

这是一个通用的多边形裁剪算法,既可以裁剪凸多边形也可以裁剪凹多边。

通过下图来描述算法的执行过程

img79

图中DCBA为裁剪窗口,dcba为要裁剪的多边形。在算法执行之前将多边形和裁剪窗口的交点分别加入他们的顶点序列。即图中的123456。

则多边形序列为:a,6,5,d,4,3,c,2,b,1

裁剪窗口序列为:A,5,4,D,C,1,B,2,3,6

从多边形顶点a开始按逆时针方向遍历多边形顶点。到达多边形与裁剪边界的交点6,此时线段是从裁剪区的外部进入裁剪区内部

(即交点6一个entering intersection),则在多边形序列上继续遍历直到找到第一个从边界“出去”的点或者一个已经遍历过的点,图中所示为交点5(称交点5为一个exiting intersection);

此时线段从裁剪区内出去,这时在裁剪窗口序列的当前顶点开始逆时针遍历(此时为交点5),到达交点4,线段d4指向多边形内部,交点4是一个entering intersection;

转换到多边形序列继续遍历,到交点3,交点3是一个exiting intersection;

转换到裁剪窗口序列逆时针遍历,到交点6,发现6已经访问过,得到顶点序列6543,即为一个要绘制的多边形;

这时退回到最后一个exiting intersection,即顶点3,在多边形序列上遍历,找到一个   entering intersection,即点2,然后按照上述过程得到一个顶点序列2b1B,此时多边形所有的点均已访问,算法结束;

整个算法就是先计算多边形和裁剪窗口的顶点序列,然后根据交点是一个entering intersection还是exiting intersection选择在不同的顶点序列上遍历,直到所有的点都访问完

输入给出多边形序列和裁剪窗口的序列,首先要一个预处理将他们的交点按依序插入各自的序列,一个比较直接的办法,可以直接按逆时针遍历这两个序列,每次取2个点组成一个线段与另一个序列的每条边比较计算交点,得出一个要插入的点集,然后按照该点集中的每个点到线段起点的距离按序插入,离起点近的就先插入;

 

参考 :

《计算机图形学》 赫恩

http://www.cs.fit.edu/~wds/classes/graphics/Clip/clip/clip.html

http://en.wikipedia.org/wiki/Weiler–Atherton_clipping_algorithm


0 0