我已经实现了一个函数来检查两个多边形p1和p2的重叠,以验证p1是否与p2重叠,函数占用p1的每个边缘并测试它的一个点是否在p2内而不是在p2的边缘上p2(他们可以分享优势)。
这个函数运行得很好,问题是它被调用了一千次并且它使我的程序真的很慢,因为它必须逐点遍历每个边缘并且我只检查4个多边形重叠的情况,它们是:
如果三角形与三角形重叠。
如果三角形与矩形重叠。
如果三角形与平行四边形重叠。
如果矩形与平行四边形重叠。
是否有更简单快捷的方法来检查这些重叠情况是否发生?
答案 0 :(得分:1)
我认为你真正想要的就是line segment intersections。这可以在O((N + k)log N)中完成,其中N是线段的数量(大致是顶点的数量),k是交叉点的数量。使用Bentley-Ottmann算法。这可能最好使用所有多边形,而不是一次只考虑两个。
问题在于跟踪哪些线段属于哪个多边形。还有一个问题是,考虑所有线段可能比仅仅考虑两个多边形更糟糕,在这种情况下,一旦获得一个有效的交叉点就会停止(某些交叉点可能不符合您的要求被计为重叠)。此方法可能更快,但可能需要您尝试不同的多边形组合。在这种情况下,最好只考虑所有线段。
答案 1 :(得分:0)
您可以通过首先检查边是否与多边形的边界框相交来加速交叉测试。看看Line2D.interSects(Rectangle2D rect)。
如果您有数万个多边形,那么您可以通过将多边形存储在空间索引(Region Quadtree)中来进一步加快速度。然后,这将限制搜索到视图多边形,而不是搜索所有的bruite力。但是,如果您经常不得不在程序启动时进行一次搜索,这种情况才有意义。