【问题标题】:Polygon overlap, specific case多边形重叠,具体情况
【发布时间】:2013-01-14 19:34:33
【问题描述】:

我已经实现了一个函数来检查两个多边形 p1 和 p2 的重叠,以验证 p1 是否与 p2 重叠,该函数获取 p1 的每个边缘并测试它的一个点是否在 p2 内部而不是在边缘p2(他们可以共享一条边)。

这个函数工作得很好,问题是它被调用了一千次,它让我的程序非常慢,因为它必须逐点迭代每个边缘,我只检查 4 个多边形重叠的情况,它们是:

如果一个三角形与一个三角形重叠。

如果三角形与矩形重叠。

如果三角形与平行四边形重叠。

如果一个矩形与一个平行四边形重叠。

有没有更简单快捷的方法来检查这些重叠情况是否发生?

【问题讨论】:

  • 您应该说明如果您搜索的是基于像素的算法,还是基于矢量的,您现在似乎是基于像素的。
  • 如果寻找一个点意味着它是基于像素而不是基于像素。
  • 一个点是一对坐标,可以是双精度类型:(3.545, 123.222) 像地理坐标,也就是地理点。或者可以是 int 类型,进一步的点可以限制为屏幕大小,或者可以由 Integer.MAX_VALUE 限制,这一切都会有所不同......
  • 嗯,我使用双精度坐标。
  • 您可以使用 double 避免每次从 integer 转换为 double ,但实际上它们是整数值(屏幕坐标?)或?

标签: polygon overlap


【解决方案1】:

我想你真正要找的只是line segment intersections。这可以在 O((N+k) log N) 中完成,其中 N 是线段的数量(大致是顶点的数量),k 是交点的数量。使用 Bentley-Ottmann 算法。这可能最好使用所有多边形来完成,而不是一次只考虑两个。

问题在于跟踪哪些线段属于哪个多边形。还有一个问题是,考虑所有线段可能比只考虑两个多边形更糟糕,在这种情况下,一旦你得到一个有效的交叉点,你就会停下来(有些交叉点可能不符合你的要求,不能算作重叠)。这种方法可能更快,尽管它可能需要您尝试不同的多边形组合。在这种情况下,最好只考虑所有线段。

【讨论】:

    【解决方案2】:

    您可以通过首先检查边是否与多边形的边界框相交来加快相交测试。看看 Line2D.interSects(Rectangle2D rect)。

    如果您有一万个多边形,那么您可以通过将多边形存储在空间索引(区域四叉树)中来进一步加快速度。然后,这会将搜索限制为视图多边形,而不是蛮力搜索所有。但这可能只有在您经常需要搜索时才有意义,而不仅仅是在程序启动时搜索一次。

    【讨论】:

    • 我的描述是正确的,迭代边缘 AB(从 A 到 B)我取第一个点,然后遍历它检查是否必须水平移动它(在 X 坐标上添加 1 或 -1 ) ,垂直(在 Y 坐标上加 1 或 -1)或对角线(在两个坐标上加)。
    • 您是否建议只检查端点?但如果我这样做,重叠检查可能会失败,因为端点可能不在另一个多边形内,而只是边缘的一部分。
    • 如果坐标是双精度,则不能简单地添加“在 X 坐标上加 1 或 -1” 这仅在重叠与屏幕上的重叠有关时才有效。
    猜你喜欢
    • 2020-01-26
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多