【问题标题】:Algorithm to check whether given rectangles form a square检查给定矩形是否形成正方形的算法
【发布时间】:2015-03-05 17:48:37
【问题描述】:

输入:N 个矩形。给出了矩形的坐标。

输出:检查它们是否形成正方形。

  • 矩形之间可能有重叠。

我已经解决了矩形平行于 XY 轴的情况。

解决方案:

由于正方形的面积是一个完美的正方形,所以 (所有矩形的面积之和 - 它们之间的重叠) 应该是一个完美的正方形。

现在找到最小值。所有矩形的X坐标值和最大值。 Y 坐标的值。 如果它们形成一个正方形,那么 | min(x)-max(y) | 是正方形的长度。 现在只需找到考虑重叠的矩形面积的总和。 如果它等于长度为 | 的正方形面积最小(x)-最大(y)|。宾果游戏!!

复杂度:O(n*n)

一般情况如何解决?

【问题讨论】:

  • 不保证方格没有缝隙。
  • 矩形的尺寸是多少,它们的坐标有多大?

标签: algorithm sorting geometry


【解决方案1】:

假设所有矩形都形成正方形,但矩形的边缘不平行于轴。

那么正方形有四个顶点:上、下、右、左。正方形的顶部顶点的 y 坐标 = 所有矩形的所有顶点的 y 坐标的最大值。其他三个顶点依此类推:底部(最小 y)、右侧(最大 x)和左侧(最小 x)。

要找到正方形的角度,只需两个顶点:底部和右侧。 让我们底部顶点坐标是(someX,minY),右顶点坐标是(maxX,someY)。 那么角度是atan((someY-minY)/(maxX-someX))。在 C/C++/Java/C# 中可以使用函数atan2

之后,旋转-angle 上的所有矩形,然后您可以将算法应用于与轴平行的矩形。

【讨论】:

    【解决方案2】:

    如果您已经有针对无旋转情况的 O(N^2) 解决方案,Mark 的答案是正确的。然而,这个问题中最困难的部分实际上是最初的无旋转情况(准确地找到重叠的总面积)。

    我不确定您是否考虑了多个重叠的情况(超过 2 个矩形在一个点重叠),但是对于那些对找到重叠区域感到好奇的人:

    有一种有趣的扫描算法可以通过使用一些数据结构调整到 O(N log N)。

    如果您有兴趣,请查看此链接:Efficient algorithm to find Area of Overlapping Rectangles

    【讨论】:

      【解决方案3】:

      在 O(n) 中可以做到这一点。构成最终正方形边的矩形的边将具有最小的Y-intercept 和最小的X-intercept。您可以使用它来识别作为最终边界一部分的边,方法是跟踪形成最小 X 和 Y 截距的边。

      符合最小截距制造者资格的每一侧都将根据该线的最小/最大值进行测试,并且这些值将被更新。

      最后,比较 min-Y-intercept 和 min-X-intercept 线段之间的 min-max 间隙,如果它们的长度相同,则最终边界为正方形。

      如果不清楚,我可以提供一些伪代码。让我知道。我添加了一个图来说明如下:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 1970-01-01
        相关资源
        最近更新 更多