计算机图形学·23 Weiler-Athenton多边形裁剪算法

本文是记录专业课计算机图形学的部分笔记,参考教材为Angel的第八版交互式计算机图形学------基于WebGL 2.0的自顶向下方法。

1、Weiler-Athenton算法功能强大,支持任意形状(凸、凹、带内环)的被裁剪多边形与裁剪窗口。我们先来考虑约定:记主多边形(被裁剪多边形)为P 、裁剪多边形(裁剪窗口)为Q 。

这里,主多边形和裁剪多边形均用它们顶点的环形表定义,且多边形的外部边界取逆时针方向,而其内边界(孔洞)取顺时针方向。当遍历顶点表时,上述约定将保证多边形的内部总是位于前进方向的左侧(左手法则)。主多边形和裁剪多边形的边界可能相交,也可能不相交。若它们相交,则交点必成对地出现,即,其中一个交点为主多边形的边进入裁剪多边形内部时的交点,而另一交点为其离开时的交点。

2、算法思路:算法可以从进入交点开始,沿主多边形的外部边界按照逆时针方向向前跟踪,直至找到它与裁剪多边形的一个交点为止。在交点处改变跟踪边,开始沿裁剪多达形的外部边界按照逆时针方向跟踪,直至发现它与主多边形的一个交点后,再次改变跟踪边,再次沿主多边形的边界跟踪。继续上述过程,直至到达算法起始点位置为止。若为内部边界,则按顺时针方向跟踪。

3、具体过程:

①建立主多边形和裁剪多边的顶点表。

②求主多边形和裁剪多边形的交点,并将这些交点按顺序插入两多边形的顶点表中,得到新顶点表。

③在两个多边形的顶点表中的相同交点间建立双向指针。

④裁剪,如果存在没有被跟踪过的交点,执行以下步骤:

-- (a) 建立空的裁减结果多边形的顶点表。

-- (b) 选取任意一个没有被跟踪过的交点为起点,将其输出到结果多边形顶点表中。

-- (c) 如果该交点为进点,则跟踪主多边形边界(顶点表);否则跟踪裁剪多边形边界(顶点表)。

-- (d) 跟踪多边形边界,每遇到多边形顶点,就将其输出到结果多边形顶点表中,直至遇到新的交点。

-- (e) 将该交点输出到结果多边形顶点表中,并通过连接该交点的双向指针改变跟踪方向(如果上一步跟踪的是主多边形边界,现在改为跟踪裁剪多边形边界;如果上一步跟踪的是裁剪多边形边界,现在改为跟踪主多边形边界)。

-- (f) 重复(d)、(e)步,直至回到起点为止。


相关推荐
AI软著研究员16 分钟前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish33 分钟前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者17 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮18 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者18 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考18 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法