剪切两个2D三角形

时间:2014-11-07 15:33:36

标签: math graphics geometry computational-geometry polygons

我知道那里有有效的多边形裁剪算法(例如,Maillot,Vatti,Greiner-Hormann)。然而,这些算法适用于任意多边形,虽然它们适合我的情况,但在我看来,对于像我这样的简单案例使用这种通用算法是一种过度杀伤。

我所拥有的是两个二维三角形(见下图),我想将它们夹在另一个上。除了一般的多边形裁剪算法之外,在网上搜索还没有找到任何东西。

enter image description here

问:是否有专门的裁剪两个2D三角形的算法?

3 个答案:

答案 0 :(得分:2)

对于两个凸形,传统方法只是Sutherland Cohen,但标记更多或更少。

E.g。在你的情况下:

  • 蓝色A在红色AB外面,但在另外两个红色边缘内;给它代码100;
  • 蓝色B是一样的;给它代码100;
  • 蓝色C在红色BC之外,但在另外两个之内,所以给它代码010。

从A:

开始
  • 代码非零,输出中不包含蓝色A;
  • 查看边缘蓝色AB,二进制AND非零,因此不考虑输出;
  • 蓝色B的代码非零,不包含在输出中;
  • 将B和C AND编码为0,因此XOR *。给出110.所以找到蓝色BC与边缘红色AB和BC的交叉点,将它们添加到outpyt列表中;
  • 蓝色C的代码非零,不包含在输出中;
  • 蓝色C和D的代码再次表示与BC和AB相交,所以这样做并添加到输出。

(*或OR他们;我们已经确定他们没有共同点,因此它没有任何区别 - 我认为XOR在说你正在寻找差异时更具描述性)

答案 1 :(得分:2)

描述了两种对凸多边形有效的方法here - Hoey算法和O'Rourke算法。
(我用O'Rourke的一个用于凸四边形)

答案 2 :(得分:1)

只是提示优化。

关于哪些边相交以及哪些顶点属于最终轮廓的完整讨论仅取决于由一个三角形(A)的顶点和另一个三角形的边(B)形成的三角形的代数区域。

有9个这样的三角形,因此有9个区域和9个标志。无论如何,使用(A)的相同顶点构建的三个三角形具有与(B)的面积相加的面积,并且仅需要完全计算9-3 + 1 = 7个面积。

此外,两个边之间的交点是使用像t = S /(S-S')之类的公式从两个区域计算出来的,其中t是沿边的参数。

因此,可以将完全展开的算法写为深度为9的决策树(使用9个带符号的区域),每个叶子(其中512个!)生成一系列顶点/交叉点。最糟糕的是可能有6个交叉路口。