【问题标题】:Area of Intersection of Two Rotated Rectangles两个旋转矩形的交点面积
【发布时间】:2012-07-25 01:59:11
【问题描述】:

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

我需要计算这两个矩形相交的近似面积。

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

我考虑过使用相交区域的边界框的面积,但由于所有不同的可能情况,我无法获取相交区域的顶点:

我正在 Cocoa 框架中用 Objective-C 编写这个程序,因为它的价值,所以如果有人知道使用 NSBezierPath 或其他东西的任何快捷方式,也欢迎你提出建议。

【问题讨论】:

  • 我没有得到你真正需要的东西。但我认为最大相交面积始终等于其中一个矩形的面积,因为两个矩形的面积相同。
  • @rain,他不想要最大可能的交叉区域,但实际的交叉区域是两个给定的矩形。
  • 是的,你是对的。但在他提到的问题中,“我可以保证两个矩形的大小相同。”和“我会将结果与其他相交区域进行比较,以确定一组矩形中的最大相交区域”。所以我怀疑到底需要什么。
  • @Rain,Shahbaz 是正确的;我有一组矩形——在这组矩形中,我需要确定它们中任意两个之间的最大交叉区域。我提到它的唯一原因是说明为什么我需要能够找到两个矩形相交的区域。
  • 这本质上是stackoverflow.com/questions/8011267/…的副本。

标签: algorithm graphics geometry intersection


【解决方案1】:

作为对其他答案的补充,您的问题是 line clipping 的一个实例,这是一个在计算机图形学中得到深入研究的主题,并且有许多可用的算法。 如果您旋转坐标系以使一个矩形具有水平边缘,那么问题正是从那里开始剪线。

您可以从Wikipedia article on the topic 开始,然后从那里进行调查。

【讨论】:

    【解决方案2】:

    在任何情况下,计算两个多边形的精确交集多边形是一件容易的事,因为任何凸多边形都可以看作是半平面的交集。 “连续切割”就可以了。

    选择一个矩形(任意)作为剪切矩形。一个接一个地遍历切割矩形的边。通过包含切割矩形当前边的线切割第二个矩形,并丢弃位于“外部”半平面中的所有内容。

    一旦你完成了对所有切割边的迭代,剩下的就是另一个矩形的结果。

    【讨论】:

      【解决方案3】:

      一种蛮力的方式:

      • 从 [corners of 矩形] + [边的交点]
      • 删除不在两个矩形内部或边缘上的点。
      • 现在您有了交叉路口。请注意,交点是凸的。
      • 按集合中任意点、任意其他点和给定点之间的角度对剩余点进行排序。
      • 现在您已经按顺序排列了交点。
      • 按常规方式计算面积(乘积)

      .

      【讨论】:

        【解决方案4】:

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

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

        2. a 如果一个矩形的两条连续边与另一个矩形的一条边相交,则形成一个三角形。计算它的面积。

          b.如果边不是连续的,则形成四边形。从四边形的两个对角计算一条线,这会产生两个三角形。计算每个的面积并求和。

        3. 如果一条的两条边与另一条的两条边相交,则您将得到一个四边形。计算如 2b。

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

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

        检查 1 中的特殊情况。

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

        【讨论】:

        • “如果一个矩形的两条边与另一个矩形的一条边相交,则形成一个三角形。”或者一个矩形。
        • 再给你一个案例:“如果一个矩形的两条连续边与另一个矩形的一条边相交,则形成一个三角形”......或五边形。
        • 有一个更通用的解决方案。我会画出来的。
        • @RafaelBaptista,您还缺少 6 面形状(六边形)的外壳:screenshoot.me/IMQZcV
        【解决方案5】:

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

        1. 从两个矩形中创建一个多边形。请参阅this question(尤其是this answer),或使用gpc 库。
        2. 求这个多边形的面积。见here
        3. 共享区域是

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

        【讨论】:

        • 您提供的链接似乎没有完全解释如何实施第 1 步?该问题没有可接受的答案。
        • @MarkByers,是的,但是该问题的 OP 有 30% 的答案未被接受。那里有很多解决方案,当然其中之一会起作用。不过我会搜索更多。
        • 很高兴我不是唯一一个;我以为我明白了,但现在我正在尝试实现它,我一直在尝试形成两个矩形的联合;假设我可以找到交点,这些点的排列顺序是什么?
        • @NateThorn,我更新了我的答案,介绍了一个这样做的库。您也可以在互联网上更多地搜索这个特定的子问题。
        • 如果你要使用gpc库,这三个步骤是没有必要的。它可以直接计算交点。 "支持差异、交集、异或和联合剪辑操作。"
        【解决方案6】:

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

        将您的一个矩形分成小正方形网格。对于每个交点,检查该点是否在另一个矩形内。位于另一个矩形内的点数将是重叠区域面积的一个相当好的近似值。增加点的密度会提高计算的准确性,但会以性能为代价。

        【讨论】:

        • 因为在我的情况下,开发时间比效率或准确性更重要,所以我选择了这个答案。但是,请参阅其他答案以获得更有效/更准确的解决方案。
        • 如果你有一个网格,你可以使用 Pick 定理 en.wikipedia.org/wiki/Pick%27s_theorem
        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 2018-07-17
        相关资源
        最近更新 更多