输入:N个矩形。给出了矩形的坐标。
输出:检查它们是否形成正方形。
我已经解决了矩形平行于 X 和 Y 轴的情况。
Soln:
由于方形区域是完美的正方形,所以 (总矩形面积之和 - 它们之间的重叠)应该是一个完美的正方形。
现在找到分钟。所有矩形的 X 坐标值和最大值值 Y 坐标。 如果他们形成一个正方形,那么 | min(x)-max(y)| 是正方形的长度。 现在只需找到考虑重叠的矩形区域的总和。 如果它等于长度 |的正方形区域min(x)-max(y)| 。宾果!!
复杂性: O(n * n)
如何解决一般情况?
答案 0 :(得分:1)
假设所有矩形都形成正方形,但矩形的边缘与轴不平行。
然后正方形有四个顶点:顶部,底部,右侧和左侧。正方形的顶部顶点具有y坐标=所有矩形的所有顶点的y坐标的max。所以对于其他三个顶点:bottom(min y),right(max x)和left(min x)。
要找到方形的角度,它只有两个顶点:底部和右边。
设底部顶点坐标为(someX,minY),右顶点坐标为(maxX,someY)。
然后角度为atan((someY-minY)/(maxX-someX))
。在C / C ++ / Java / C#中,您可以使用函数atan2
。
之后,旋转-angle
上的所有矩形,然后您可以将算法应用于与轴平行的矩形。
答案 1 :(得分:0)
如果你已经有一个针对无旋转情况的O(N ^ 2)解决方案,Mark的回答是正确的。然而,这个问题最棘手的部分实际上是初始无旋转情况(确切地说,重叠的总面积)。
我不确定您是否考虑过多个重叠的情况(在一个地方重叠超过2个矩形),但对于那些对寻找重叠区域感到好奇的人:
存在一种有趣的扫描算法,可以使用一些数据结构调整为O(N log N)。
如果您有兴趣,请查看此链接:Efficient algorithm to find Area of Overlapping Rectangles
答案 2 :(得分:0)
可以在O(n)中执行此操作。形成最终正方形边的一部分的矩形边将具有最小Y-intercept和最小X-intercept。您可以使用它来识别作为最终边界一部分的边,通过跟踪产生最小X和Y截距的边。
符合最小拦截制造者的每一方都将根据该线的最小值/最大值进行测试,这些值将被更新。
最后,比较min-Y-intercept和min-X-intercept线段之间的最小 - 最大间隙,如果它们具有相同的长度,则最终边界为正方形。
如果不清楚,我可以提供一些伪代码。让我知道。我添加了一个数字来说明如下: