【问题标题】:Algorithm to check whether given rectangles form a square检查给定矩形是否形成正方形的算法
【发布时间】:2015-03-05 17:48:37
【问题描述】:
输入:N 个矩形。给出了矩形的坐标。
输出:检查它们是否形成正方形。
我已经解决了矩形平行于 X 和 Y 轴的情况。
解决方案:
由于正方形的面积是一个完美的正方形,所以
(所有矩形的面积之和 - 它们之间的重叠) 应该是一个完美的正方形。
现在找到最小值。所有矩形的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 上的所有矩形,然后您可以将算法应用于与轴平行的矩形。
【解决方案3】:
在 O(n) 中可以做到这一点。构成最终正方形边的矩形的边将具有最小的Y-intercept 和最小的X-intercept。您可以使用它来识别作为最终边界一部分的边,方法是跟踪形成最小 X 和 Y 截距的边。
符合最小截距制造者资格的每一侧都将根据该线的最小/最大值进行测试,并且这些值将被更新。
最后,比较 min-Y-intercept 和 min-X-intercept 线段之间的 min-max 间隙,如果它们的长度相同,则最终边界为正方形。
如果不清楚,我可以提供一些伪代码。让我知道。我添加了一个图来说明如下: