我需要迅速实现一种算法,以找到二维空间中方向不同的两个矩形之间的并集(IoU
)相交。我找不到任何教程或示例代码来教授如何实现这种算法。
有人可以提供相关资源吗?
答案 0 :(得分:2)
您可以使用O'Rourke algorithm计算两个凸多边形的交点。 书“ Computational Geometry in C”的页面上提供了C和Java代码。
算法遍历多边形的边缘,直到找到相交(使用 定向测试)。相交后,从两个可能的下一个中选择“最内部”边缘以构建相交核心多边形(总是凸面)。
对顶点列表进行排序后,可以使用shoelace formula计算多边形面积。
要获得并集面积,我们可以计算(感谢伊夫·达乌斯特的提示)
Area(Union) = Area(P) + Area(Q) - Area(Intersection)
答案 1 :(得分:1)
对于MBo / O'Rourke的非常好的解决方案,您可以使用扫掠线方法。
为方便起见,假定多边形之一是轴对齐的。然后,当直线撞到对齐的矩形的顶部和底部时,将发生两个“事件”,而当直线撞到另一个矩形的顶点时,将发生四个事件(取决于方向,顶点的可能排列为8)。>
矩形的交点出现在这些事件定义的垂直范围内(您执行两个事件集的合并),并且在斜边与水平线之间要计算出两个六个交点。对于每个事件线,确定两个矩形跨越的X间隔并找到它们的交点或并集是一件容易的事。而且两个事件线之间的区域是梯形。
要处理一般位置的矩形,您可以
旋转两个多边形以对齐其中一个,
使用反向旋转坐标系,
始终使用水平线执行扫描,而无需移动多边形。但随后有8个事件,而不是6个,最多有8个交集计算。