2. 北京邮电大学世纪学院 移动媒体与文化计算北京市重点实验室, 北京 102101
2. Mobile Media and Culture Computing Key Laboratory of Beijing, Century College, Beijing University of Posts and Telecommunications, Beijing 102101, China
在日常生活中, 随着计算机动画、人机交互以及虚拟现实等技术的不断融入, 人们对计算机图形学技术提出了更高要求. 计算机图形学研究的内容十分广泛, 如基本图形生成、裁剪、三维几何造型、真实感图形的显示、交互技术等等. 裁剪作为计算机图形学的基础操作, 也是图像处理、模式识别等问题的基础.
在实际应用中, 裁剪窗口可能是各种形状, 比较常用的裁剪窗口为矩形或者多边形. 目前, 对裁剪算法的研究工作主要包括: 矩形窗口的线裁剪[1,2]、圆裁剪[3]和多边形裁剪[4], 多边形窗口的线裁剪[5,6]、圆的裁剪[7,8]和多边形裁剪[9]等等. 这些研究为后续的算法研究奠定的一定的基础. 但是, 由于多边形窗口的凹凸性和无规则性, 与矩形窗口内图形裁剪相比, 多边形窗口内图形裁剪更为复杂. 在实际应用中经常会遇到关于任意多边形窗口的圆裁剪问题, 如两个或多个实体间的碰撞、检测等等. 因此, 研究多边形窗口内圆的裁剪问题具有重要的意义.
为了提升已有的矢量圆裁剪算法效率和减少算法对内存占用率等问题, 一种具有线性复杂度的任意多边形窗口的矢量圆裁剪算法被提出[7], 该算法结合投影和射线法的线性几何思想, 借助向量叉积和向量共线基本定理, 降低了裁剪过程的运算量, 提高了裁剪效率, 具有较高的鲁棒性和通用性.
文献[8]中提出了一种任意多边形窗口的圆裁剪算法, 该算法按照逆时针方向依次求出圆与多边形各条边之间的交点并排序, 然后借助“中点检测法”判定相邻两点是线还是弧的连接, 最终完成圆的裁剪. 该算法在效率和稳定性上都取得了比较理想的结果. 但该算法只考虑了圆和多边形窗口相交及圆在多边形窗口内的情况, 并未考虑圆与多边形窗口相离以及多边性窗口在圆内的情况. 针对该问题, 如果更加全面的讨论多边形窗口和圆的位置关系的情况下完成圆的裁剪是十分有必要的.
本文提出了一种更加有效全面的多边形窗口的圆裁剪算法. 在考虑任意多边形窗口与圆的不同位置关系的情况下, 能够全面的分析多边形窗口各顶点、各边与圆之间的关系, 并对其进行了不同的裁剪. 最后仿真例子验证该方法的有效性和全面性.
2 直线段和圆的位置关系基于任意多边形窗口, 圆的裁剪关键要解决以下两个问题:
(1) 圆与多边形窗口每条直线段是否有相交; 如果相交, 如何求交点;
(2) 圆和多边形的位置关系如何确定.
已知被裁剪圆的方程为:
${(x - {x_0})^2} + {(y - {y_0})^2} = {r^2}$ | (1) |
其中, 圆心坐标O为(x0, y0), 半径为r.
给定直线段P1P2, 端点坐标分别为P1(x1, y1), P2(x2, y2), 则按照逆时针方向总可得到其参数方程表示. 不失一般性, 假设有向直线段P1P2, 为逆时针方向, 则其参数方程表示为:
$\left\{ {\begin{array}{*{20}{c}}{x = {x_1} + ({x_2} - {x_1})t}\\{y = {y_1} + ({y_2} - {y_1})t}\end{array}} \right.\quad \quad t \in [0,1]$ | (2) |
按逆时针方向, 考虑直线段和圆的位置关系, 有5种可能的情况(如图1).
确定直线段和圆的位置关系:
将(2)代入(1), 化简整理可得:
$a{t^2} + bt + c = 0$ | (3) |
其中,
$a = {({x_2} - {x_1})^2} + {({y_2} - {y_1})^2}$ |
$b = 2[({x_2} - {x_1})({x_1} - {x_0}) + ({y_2} - {y_1})({y_1} - {y_0})]$ |
$c = {({x_1} - {x_0})^2} + {({y_1} - {y_0})^2} - {r^2}$ |
令
若
若
若
综上, 如果
给定任意多边形窗口
考虑任意多边形窗口和被裁剪圆的位置关系, 有四种可能的情况(如图2):
3.1
借助
从多边形各个顶点
考虑以下情况:
如果
如果
如果
如果
备注: 借助于
根据3.1节基于
(1)
在这种情况, 被裁剪圆要么落在多边形窗口外(如图2(a)), 则整个圆被裁剪;
(2)
在这种情况, 被裁剪圆落在多边形窗口内(如图2(b)), 则绘制整个圆;
(3)
在这种情况下, 多边形窗口在被裁剪圆内(如图2(c)), 则绘制整个多边形;
(4)
在这种情况下, 则说明多边形窗口与圆相交(如图2(d)).
下面针对情况(4), 讨论圆弧是否被裁剪:
为了方便, 首先引入输入顶点数组
按照2.1节给出的直线段和圆的交点的求法, 依次沿逆时针方向分别求多边形窗口各个边与圆的交点, 并将其按照顺序存入数组
取出多边形窗口的顶点数组
同时, 判断多边形窗口的顶点
下面判断两个相邻交点之间是圆弧连接还是线段连接:
① 如果
② 如果
③ 如果
按照上述原理, 给出本文方法的基本框架, 如图3所示.
4.2 实例仿真根据本文提出的任意多边形窗口的圆裁剪算法的有效性和全面性, 讨论了图2给出的四种多边形窗口和圆的位置关系的情况下圆的裁剪.
图4验证了当多边形窗口和圆分离时, 根据本文提出算法, 得到的裁剪结果为: 圆被裁减掉.
图5验证了当圆在多边形窗口内时, 根据本文提出算法, 得到的裁剪结果为: 绘制整个圆.
图6验证了当多边形窗口在圆内时, 根据本文提出算法, 得到的裁剪结果为: 绘制整个多边形.
图7验证了当多边形窗口及圆相交时, 根据本文提出算法, 得到的裁剪结果为: 绘制圆在多边形窗口内部分及新生成的圆弧.
对于任意多边形窗口和圆的位置关系, 图4-7中的结果验证了本文提出方法的全面性和有效性.
相比于文献[8]的算法, 本文提出的算法对于圆在多边形窗口外的情况进行了完善, 增加了多边形窗口和圆相离及多边形窗口在圆内的两种不同情况, 其裁剪结果验证了本文提出方法的全面性.
对于相邻两点之间是圆弧连接还是直线段连接上, 文献[8]中提出的“中点检测法”需要计算两点中点与当前圆弧段之间的位置关系, 从而确定其连接方式; 本文在决定两点之间到底是圆弧还是直线段连接的判断只需判断相邻两点及前后点之间的位置关系断定, 节省了一定的计算量. 相比, 本文提出方法不仅能够全面有效地完成任意多边形窗口内圆的裁剪问题, 而且能够节省一定的工作量.
5 结论本文讨论了任意多边形窗口内圆的一种更加全面、有效地裁剪算法. 其主要思想为: 首先, 通过
[1] |
Huang WJ, Wang Y. A novel algorithm for line clipping. Proceedings of 2009 International Conference on Computational Intelligence and Software Engineering. Wuhan, China. 2009. 1–5.
|
[2] |
洪燕, 洪智化, 刘欣. 一种更有效的矩形窗口线裁剪算法. 景德镇高专学报, 2014, 29(3): 17-18. DOI:10.3969/j.issn.1008-8458.2014.03.008 |
[3] |
王蕊, 阎晓敏, 唐棣. 基于矩形窗口分区编码的圆形裁剪新算法. 辽宁大学学报(自然科学版), 2011, 38(2): 177-180. DOI:10.3969/j.issn.1000-5846.2011.02.019 |
[4] |
张钧, 王鹏. 一种新的矢量数据多边形的快速裁剪算法. 中国图象图形学报, 2008, 13(12): 2409-2413. DOI:10.11834/jig.20081225 |
[5] |
黄文钧. 基于矩阵乘法的多边形窗口线裁剪算法. 计算机科学, 2013, 40(10): 309-317. DOI:10.3969/j.issn.1002-137X.2013.10.066 |
[6] |
陆国栋, 邢世海, 彭群生. 基于顶点编码的多边形窗口线裁剪高效算法. 计算机学报, 2002, 25(9): 987-993. DOI:10.3321/j.issn:0254-4164.2002.09.014 |
[7] |
苗永春, 唐权华. 任意多边形窗口的矢量圆裁剪算法. 计算机辅助设计与图形学学报, 2016, 28(9): 1451-1458. DOI:10.3969/j.issn.1003-9775.2016.09.007 |
[8] |
杭后俊, 孙丽萍. 任意多边形窗口的圆裁剪算法. 计算机技术与发展, 2009, 19(5): 235-237, 241. DOI:10.3969/j.issn.1673-629X.2009.05.066 |
[9] |
Simonson L J. Industrial strength polygon clipping: a novel algorithm with applications in VLSI CAD. Computer-Aided Design, 2010, 42(12): 1189-1196. DOI:10.1016/j.cad.2010.06.008 |