关于算法:两个旋转矩形的相交面积

Area of Intersection of Two Rotated Rectangles

我有两个2D矩形,分别定义为原点(x,y),大小(高度,宽度)和旋转角度(0-360°)。 我可以保证两个矩形的大小相同。

我需要计算这两个矩形的相交区域。
Rectangle intersection

尽管可以,但计算不一定要精确。 我将结果与其他相交区域进行比较,以确定一组矩形中最大的相交区域,因此相对于同一算法的其他计算而言,它只需要准确即可。

我考虑过使用相交区域的边界框的面积,但是由于所有可能的情况,我都无法获取相交区域的顶点:
So many possible intersection shapes

我正在用Cocoa框架在Objective-C中编写该程序,以了解它的价值,因此,如果有人知道使用NSBezierPath的任何快捷方式,也欢迎您提出建议。


为了补充其他答案,您的问题是换行的一个实例,它是计算机图形学中一个被广泛研究的主题,并且有许多可用的算法。
如果旋转坐标系以使一个矩形具有水平边缘,那么问题就出在那儿。

您可以从有关该主题的Wikipedia文章开始,然后从那里进行调查。


一个可以给出近似答案的简单算法是采样。

将您的一个矩形划分为小正方形的网格。对于每个相交点,检查该点是否在另一个矩形内。位于另一个矩形内的点的数量将非常接近重叠区域的面积。增加点的密度将提高计算的准确性,但会降低性能。


无论如何,计算两个凸多边形的精确相交多边形是一件容易的事,因为任何凸多边形都可以看作是半平面的交集。"顺序切割"可以完成任务。

选择一个矩形(任意)作为切割矩形。一次又一次地遍历切割矩形的侧面。用包含切割矩形当前边的线切割第二个矩形,并丢弃"外"半平面中的所有内容。

完成所有切削面的迭代后,剩下的就是另一个矩形。


您实际上可以计算出确切的面积。

  • 从两个矩形中制作一个多边形。查看此问题(尤其是此答案),或使用gpc库。
  • 找到该多边形的面积。看这里。
  • 共享区域是

    1
    area of rectangle 1 + area of rectangle 2 - area of aggregated polygon

  • 取每个矩形的每个线段,看看它们是否相交。将有几种可能性:

  • 如果没有相交-共享区域为零-除非一个点的所有点都在另一个点内。在那种情况下,共享区域是较小的区域。

  • a如果一个矩形的两个连续边与另一个矩形的单个边相交,则形成一个三角形。计算其面积。

    b。如果边缘不重要,则形成四边形。从四边形的两个相对角计算一条线,这将形成两个三角形。计算每个面积的总和。

  • 如果一个的两条边与另一条的两条边相交,则您将具有四边形。按照2b计算。

  • 如果一个边的每个边与另一个边的每个边相交,则将有一个八边形。将其分解为三角形(例如,从一个顶点到另一顶点绘制射线以形成4个三角形)

  • @edit:我有一个更通用的解决方案。

    检查1中的特殊情况。

    然后从任何相交的顶点开始,并沿其边缘到任何其他相交点,直到回到第一个相交的顶点。这形成一个凸多边形。从第一个顶点到每个相对的顶点绘制射线(例如,将顶点向左和向右跳过)。这会将其划分为一堆三角形。计算每个面积并求和。


    一种蛮力的方式:

    • 从[角的集合
      矩形] + [边缘的交点]
    • 删除两个矩形内部或边缘之外的点。
    • 现在您有了相交的角落。请注意,交点是凸的。
    • 根据集合中任意点,任意其他点和给定点之间的角度对其余点进行排序。
    • 现在,您已经有了交点。
    • 按常规方法计算面积(按叉积计算)