【问题标题】:Intersection between 3D flat polygons3D 平面多边形之间的交集
【发布时间】:2011-06-01 01:44:26
【问题描述】:

如何找到两个(或多个)3D 平面多边形(最简单的情况下它们都是凸面)之间的交点? 寻找能够提供相交线的算法(如果有的话)。 请注意,针对无限 Plane-Plane 情况提出的方法没有用。

【问题讨论】:

  • 它们总是共面的吗?如果不是,交叉点可能是点、线或什么都没有
  • 如果您指的是每个多边形的顶点,是的,它们是共面的。然而,多边形是 3D 的,可能不在同一平面上,也就是说,交点可以是点或线或空心。

标签: algorithm 3d intersection polygons


【解决方案1】:

有两种情况:

两个多边形位于同一平面上。

找到第一个多边形的所有内部点。

任意取第一个多边形,遍历第二个多边形的所有顶点,判断它们是位于第一个多边形的内部还是外部。对于凸多边形,这样做很容易:请参阅here

找出两个多边形之间的交点

要找到交点,取其中一个多边形的每条边,然后遍历另一个多边形的所有边,以查找它们是否在任何地方相交。这可以通过使用intersection of 2 lines 的公式找到。

相交区域是由内部点和相交点处的顶点形成的多边形。

这 2 个多边形位于不同的平面上。

找到第二个多边形与第一个多边形的平面的交点。您可以通过考虑第二个多边形的每条边,并找到第一个多边形的边和平面之间的交点来做到这一点。这可以使用line and a plane 之间的交集公式找到。

检查您找​​到的交点是位于第一个多边形的内部还是外部。

【讨论】:

  • 我试过这个算法,两个多边形的一个位于不同的平面上。尽管我在有效地实现代码以进行讨论的数学(链接)时遇到了一些困难,但最终它起作用了,这很重要。我已经尝试过使用CGAL,但由于编译等方面的严重困难而感到非常失望。我使用的方法总结为首先对多边形进行三角剖分(这里出现了一些困难!)然后找到交叉点。
【解决方案2】:

这是一种方法。通过将一个多边形旋转到 XY 平面,您可以将 3D 问题(大部分情况下)简化为 2D 问题,而且通常不会造成太大的性能问题。

  1. 旋转第一个多边形的点,使其位于 X-Y 平面上。
  2. 以与第一个多边形相同的方向和数量旋转第二个多边形的点。
  3. 检查第二个多边形中的每条线,看看它是否与 X-Y 平面相交以及在何处相交。对于凸多边形,这应该在 A 点和 B 点发生两次。
  4. 找到线 AB 与第一个多边形边缘的所有交点。如果第一个多边形是凸多边形,则应该有 0、1 或 2 个交点。
  5. 案例:零交叉点:线 AB 完全位于第一个多边形的内部或外部。如果在里面,AB 是平面的相交线。如果在外面,则没有交叉路口。
  6. 案例:一个交叉点,C 点:A 或 B 在第一个平面内。平面的相交线是内点(A 或 B)到 C。
  7. 案例:两个交点:平面的相交线是AB
  8. 将相交线旋转回其原始位置,与步骤 1 中的旋转相反。

将此方法扩展到非凸多边形作为练习留给读者。 :)(其实很简单。)

检查一个点是否在二维多边形内的一种方法是获取从该点向上的一条线与多边形所有边的交点。 0 或 2:外部。 1:里面。 (这也适用于对外部和内部使用偶数和奇数的非凸多边形。)

【讨论】:

  • 我不知道如何将 3d 平面投影到所需的(例如 xy)平面上。有什么帮助吗?正如我从网上发现的那样,这个问题也并不像看起来那么容易!
【解决方案3】:

对于两个多边形共面的情况,那么对于这种特殊情况,至少有一个解决方案:

http://www.iro.umontreal.ca/~plante/compGeom/algorithm.html

它甚至有一个很好的小程序显示算法。

【讨论】:

  • 此算法仅适用于 2D。问题是要求 3D 多边形。
  • 是的。此算法将工作如果 2 个多边形是共面的。但是,问题陈述中没有给出。问题是每个单独的多边形都是平坦的。并不是说他们都必须躺在同一个平面上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2013-03-15
  • 2011-01-30
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多