多边形重叠,特殊情况



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

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

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

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

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

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

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

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

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

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

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

相关内容

最新更新