不同方向矩形的并集交集

Intersection over union for rectangles with different orientation

我需要在 swift 中实现一个算法,以找到二维 space 中两个不同方向的矩形之间的交集 (IoU)。我找不到任何教程或示例代码来教授如何实现这种算法。

谁能提供相关资源?

您可以使用O'Rourke algorithm计算两个凸多边形的交集。 C 和 Java 代码在书“Computational Geometry in C

的页面上可用

算法遍历多边形的边直到找到交点(使用 定向测试)。相交后,它从两个可能的下一个边中选择 "the most inner" 条边来构建相交核心多边形(总是凸的)。

当你排序了顶点列表后,你可以用shoelace formula计算多边形面积。

为了得到并集的面积,我们可以计算(感谢 Yves Daoust 的提示)

Area(Union) = Area(P) + Area(Q) - Area(Intersection)

除了 MBo/O'Rourke 的非常好的解决方案,您还可以使用扫描线方法。

为方便起见,假设其中一个多边形是轴对齐的。然后当线碰到对齐矩形的顶部和底部时有两个 "events" 和当线碰到另一个顶点时有四个事件(根据方向,顶点有 8 种可能的排列)。

矩形的交点出现在这些事件定义的垂直范围内(您执行两个事件集的合并)并且在斜边和水平线之间最多有两个六个交点要计算。对于每条事件线,很容易确定两个矩形跨越的 X 间隔,并找到它们的交集或并集。并且两条事件线之间的区域是梯形。

要处理一般位置的矩形,可以

  • 旋转两个多边形以对齐其中一个,

  • 使用反向旋转坐标系,

  • 在不移动多边形的情况下仍然用水平线执行扫描;但是然后有 8 个事件而不是 6 个和最多 8 个交集计算。