【问题标题】:Best fixed rectangular area fit over points最佳固定矩形区域适合点
【发布时间】:2011-04-19 15:08:16
【问题描述】:

我正在使用 Google 地图,并且正在尝试计算在给定缩放级别下视口中可见的最大点数。

我天真的方法是获取查看区域(以坐标表示)并将其用作“拟合矩形”并查看该区域中有多少点适合。 我环顾四周,但找不到任何算法来“最适合”矩形区域中的随机点。

这似乎是一个很常见的问题,所以我可能不知道要使用正确的关键字。

如果能帮助我找到解决方案,我们将不胜感激。

编辑:感谢您的回答,但恐怕我没有说清楚。在所有点上拟合一个矩形几乎是一件微不足道的事情(对它们进行排序,得到最小值/最大值,然后瞧)。
我想知道的是在 FIXED SIZED 矩形下可以容纳的最大点数:我有所有的点和一个固定大小的“移动窗口”,我想知道我可以容纳多少点。
很抱歉最初的解释不好。

干杯。

【问题讨论】:

    标签: optimization geometry


    【解决方案1】:

    要在一组点上找到最适合的矩形,并假设集合中的所有点都需要在矩形内,您需要做的就是找到两个维度的最小值/最大值。

    执行此操作的一种方法是按 X 维度对点进行排序,并将第一个和最后一个作为该维度中的最小值/最大值,然后在 Y 维度中重复该过程以获得该最小值/最大值。根据这些信息,您拥有制作矩形所需的一切。

    从计算复杂度的角度来看,复杂度是所使用的排序算法复杂度的 2 倍(因为您必须排序 2 次)+ 获取每个排序集的第一个和最后一个元素的复杂度,如果您使用例如,数组是一个 O(1) 操作。

    如果你使用归并排序并排序到数组中,你的总体复杂度为 O(n log n)。分解为操作数,您有 2(n log n) + 4。

    这不会为您提供最紧密的矩形集,因为它不能确保矩形的一侧与至少 2 个点共线(为此您将需要 @Bart Kiers 的旋转卡尺算法建议),但它是一种更快的算法,因为旋转卡尺与我在这里描述的基本相同,但随后旋转矩形,直到它的一个边缘与最小/最大点中的 2 个对齐。

    【讨论】:

    • 我认为视口将始终与 x 轴和 y 轴对齐,这就是我删除答案的原因:旋转卡尺找到未像那样对齐的最小边界矩形。请注意,虽然旋转卡尺在O(n) 中找到最小边界矩形,但它需要一个凸包,而不是一组点。所以给定一组点,总的运行时间还是O(n*log(n))
    • @Bart Kiers - 我认为你是对的,因为据我所知,谷歌地图不允许旋转地图,但你建议的方法是一个更通用的解决方案,并且会可能需要在可旋转的地图设置中使用,例如 Google 地球。
    • @Bart Kiers - 但是你能从 O(n) 中的一组点中找到一个凸包吗?我在这里发布的简单矩形算法在 O(n) 中无法做到这一点。实际上,如果您在前进的过程中跟踪每个方向的最小/最大值,则只需 1 次通过点就可以找到 X 和 Y 的最小值/最大值,这将使其成为 O(n)。
    • 从一组点创建凸包通常(平均)O(n*log(n)):en.wikipedia.org/wiki/Convex_hull_algorithms
    猜你喜欢
    • 2023-03-18
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多