Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 剪切两个二维三角形_Math_Graphics_Geometry_Computational Geometry_Polygons - Fatal编程技术网

Math 剪切两个二维三角形

Math 剪切两个二维三角形,math,graphics,geometry,computational-geometry,polygons,Math,Graphics,Geometry,Computational Geometry,Polygons,我知道有很多高效的多边形裁剪算法(例如,Maillot、Vatti、Greiner-Hormann)。然而,这些算法适用于任意多边形,尽管它们适合我的情况,但在我看来,在像我这样的简单情况下使用这样的通用算法是一种过分的做法 我有两个二维三角形(见下图),我想把一个三角形夹在另一个三角形上。除了一般的多边形裁剪算法,在网上搜索没有找到任何东西 Q:有专门的算法来裁剪两个二维三角形吗?对于两个凸面形状,传统的方法只是Sutherland Cohen,但有更多或更少的标志 例如,在您的情况下:

我知道有很多高效的多边形裁剪算法(例如,Maillot、Vatti、Greiner-Hormann)。然而,这些算法适用于任意多边形,尽管它们适合我的情况,但在我看来,在像我这样的简单情况下使用这样的通用算法是一种过分的做法

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


Q:有专门的算法来裁剪两个二维三角形吗?

对于两个凸面形状,传统的方法只是Sutherland Cohen,但有更多或更少的标志

例如,在您的情况下:

  • 蓝色A在红色AB的外面,但在其他两条红色边的里面;给它100码
  • 蓝色B是相同的;给它100码
  • 蓝色C在红色BC的外面,但在其他两个里面,所以给它代码010
从一开始:

  • 代码为非零,输出中不包含蓝色A
  • 看边蓝ab,二进制,非零,不考虑输出;<李>
  • 蓝色B的代码为非零,不包括在输出中
  • 编码B和C,并将其与0进行异或*运算。给110。因此,找到蓝色BC与红色AB和BC边缘的交点,将它们添加到输出列表中
  • 蓝色C的代码为非零,不包含在输出中
  • 蓝色C和D的代码再次指示与BC和AB相交,这样做并添加到输出中

(*或或它们;我们已经确定它们没有共同点,所以没有区别-我认为XOR更具描述性,可以说你在寻找差异)

描述了两种对凸多边形有效的方法-Hoey算法和O'Rourke算法。

(我用O'Rourke的一个来表示凸四边形)

只是优化的提示

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

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

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


因此,一个完全展开的算法可以写成深度为9的决策树(使用9个有符号的区域),每个叶子(512个)生成一系列顶点/交点。最坏情况下可能有6个交叉点。

可能有超过512个叶子,因为这些决定因素中的每一个都可能是正的、负的或零的。。。所以最多3^9=19683叶。(当然,使用问题的对称性,其中大部分可能会被删除)。