从给定的坐标集中查找矩形的数量

时间:2013-10-05 22:07:57

标签: geometry coordinates rectangles

我必须从给定的一组坐标中找到最大数量的矩形。

考虑在X Y坐标系中给出以下坐标 3 10, 3 8, 3 6, 3 4, 3 0, 6 0, 6 4, 6 8, 6月10日,

如何找到以下坐标是否形成矩形(3,0)(3,4)(6,4)(6,0)

跑步时间限制:0.1秒

谢谢

6 个答案:

答案 0 :(得分:4)

将'y'坐标列表中的点分开,按'x'坐标分组。在您的情况下,您将有两个排序列表:

3: [0,4,6,8,10]
6: [0,4,8,10]

做两个列表的交集:[0,4,8,10]

其中任何两个都会形成一个矩形:

[0,4] => (3,0), (3,4), (6,0), (6,4)
[0,8] => (3,0), (3,8), (6,0), (6,8)
[4,8] => (3,4), (3,8), (6,4), (6,8)
...

此解决方案仅适用于正交矩形,侧面平行于x,y轴。

答案 1 :(得分:3)

检查4个点是否形成矩形:

  1. 每两个点计算距离。将所有存储在浮动数组中。
  2. 对数组进行排序。
  3. 你将有[0] = a [1],a [2] = a [3],a [4] = a [5]

答案 2 :(得分:3)

对于每对点,假设(x1,y1)和(x2,y2)认为它是某个矩形的对角线。如果初始集中存在点(x1,y2)和(x2,y1),则我们已经找到了矩形。应该注意的是,将存在2个对角线,它们代表相同的矩形,因此我们将最终答案除以2。

这仅适用于平行于x轴或y轴的矩形。

伪代码C ++:

answer = 0;
set<pair<int, int>> points;

for(auto i=points.begin(); i!=std::prev(points.end()); i++)
{
    for(auto j=i+1; j!=points.end(); j++)
    {
        pair<int, int> p1 = *i;
        pair<int, int> p2 = *j;
        pair<int, int> p3 = make_pair(p1.first, p2.second);
        pair<int, int> p4 = make_pair(p2.first, p1.second);
        if(points.find(p3) != points.end() && points.find(p4) != points.end())
            ++answer;
    }
}

return answer/2;

答案 3 :(得分:0)

  

如何找到以下坐标是否形成矩形

检查差异向量是否正交,即点积为零。

检查这些坐标是否包含在列表中。它也检查矩形是否与坐标轴对齐,这将是一个更简单的问题。

如果要在输入中找到所有矩形,可以对所有四元组进行上述检查。如果出于性能原因这是不可接受的,那么您应该更新您的问题,指出您面临的问题大小和性能问题。

答案 4 :(得分:0)

我谦虚的提交

enter image description here

我认为可以进行多次优化。

答案 5 :(得分:0)

我的方法是

  • 遍历每个点
  • 检查该点正上方的所有点,然后存储形成一条线的这些点的 Y 坐标
  • 下次当我再次找到相同的 Y 坐标时,这意味着我们找到了 1 个矩形
  • 继续遍历所有其他点,做同样的事情。

我的解决方案在 O(n^2) 中运行,但这只会是平行于 X 或 Y 轴的矩形。

这是我上面方法的代码:

def getRectangleCount(coordinate):
    n = len(coordinate)
    y_count = dict()
    ans = 0
    for i in range(n):
        x, y = coordinate[i]
        for j in range(n):
            dx = coordinate[j][0]
            dy = coordinate[j][1]
            if y < dy and x == dx:
                ans += y_count.get((y, dy), 0)
                y_count[(y, dy)] = y_count.get((y, dy), 0) + 1
    return ans


coordinate = [[3, 10], [3, 8], [3, 6], [3, 4], [3, 0], [6, 0], [6, 4], [6, 8], [6, 10]]
print(getRectangleCount(coordinate))