【发布时间】:2010-12-04 07:46:43
【问题描述】:
这似乎很重要(在各种论坛上被问了很多),但我绝对需要它作为更复杂算法的构建块。
输入:2D 中的 2 个多边形(A 和 B),以每个边 [(x0, y0, x1, y2), ...] 的列表形式给出。这些点由成对的doubles 表示。我不知道它们是顺时针,逆时针还是任何方向。我确实知道它们不一定是凸的。
输出:3个多边形代表A、B和相交的多边形AB。其中任何一个都可能是空 (?) 多边形,例如null.
优化提示:这些多边形代表房间和地板的边界。所以房间边界通常会与楼层边界完全相交,除非它属于同一平面上的另一个楼层(啊!)。
我有点希望有人已经在 c# 中完成了这项工作,并让我使用他们的策略/代码,因为到目前为止我在这个问题上发现的内容相当令人生畏。
编辑:所以看起来我并不完全因为害怕这样做而感到头晕目眩。我想在这里重申所需的输出,因为这是一种特殊情况,可能会使计算更简单:
输出:第一个多边形减去所有相交位,相交多边形(复数即可)。我对第二个多边形并不感兴趣,只对它与第一个多边形的交集感兴趣。
EDIT2:我目前正在使用GPC (General Polygon Clipper) 库,它使这变得非常容易!
【问题讨论】:
-
这比你想象的要复杂。您打算如何表示生成的形状?请记住,这两个输入可能 (a) 根本不相交,(b) 部分相交,从而形成凸形或凹形闭合形状,(c) 完全相交,从而形成具有两个边界的形状(即甜甜圈),其中你必须找到一种方法来表示形状的内部和外部。
-
的确,乔恩是对的。您的问题没有很好地说明;结果集可能不是多边形,因此函数的输出不应该是多边形。在生成的形状未连接的情况下,您想做什么?例如,想象一个 C 形多边形与一个 I 形多边形相交,形成一个冒号。
-
谢谢,将不得不认真考虑并提出解决方案。以前没想过这样...
-
执行您所描述的操作的大多数算法都依赖于缠绕规则以使其成为可能,因此您的第一步可能应该是将所有边缘连接成具有已知缠绕的有序点集(顺时针是最常见,但我也见过逆时针)。一旦你有一组有序的点,你可以使用点积和右手法则快速(在 O(m*n) 中)找到多边形 A 中的任何点是否在多边形 B 内。这是一个必要的先决条件确定您可以获得什么样的输出几何图形。
-
阅读点集理论也可能对您有用。此页面描述了 JTS 拓扑套件的实现:docs.codehaus.org/display/GEOTDOC/…。 JTS 做你想做的事,但它是用 Java 编写的。您可能想查看 GEOS(JTS 的 C++ 端口)或下面提到的 NetTopologySuite:stackoverflow.com/questions/1526352/…
标签: c# polygon intersection