【问题标题】:Data structure to get all points inside a rectangle获取矩形内所有点的数据结构
【发布时间】:2017-06-21 23:33:27
【问题描述】:

所以我有一个有界平面(X 轴范围 0-1000,Y 轴范围 0-2000)。
其中有多个点(x,y)和一个矩形(构成矩形的4个点)。有些点在矩形中,有些不在。像这样:

矩形能够随时间移动并改变其大小。而这些点是静态的,不会改变。更改后,我需要检查矩形内的哪些点。

问题:
给一个矩形,里面有什么点?

Set<Point> getPointsInsideRectangle(Rectangle rec);

我的幼稚解决方案:
每个点

  • 检查它是否在矩形内,如果是,将点添加到点集

返回点集

我的想法:
似乎每次矩形更改时迭代所有点似乎在 CPU 使用量大的情况下效率极低(有很多点)。有些东西告诉我要使用 HashMap 但由于矩形是 X 范围和 Y 范围(而不仅仅是 1 个值),我似乎无法使用它。

我的问题:
1.有没有java数据结构可以处理这种情况?
2. 如果没有,有什么想法如何实现一个包含所有点的数据结构,并给出一个矩形,返回其中的点?

【问题讨论】:

  • 嗯,你有多少积分?您确定遍历所有点实际上会很慢吗?
  • 将您的域划分为多个单元格,大小可能约为 25x25。每个单元格都可以有自己的一组点。然后,要找到矩形中的点,确定哪些单元格(i)完全在矩形内,(ii)部分在矩形内,(iii)在矩形外。那么您只需要检查类别(ii)中的单元格中的各个点。
  • 我会尝试标准的RectanglePoint

标签: java data-structures


【解决方案1】:

只是一些随机的想法:

可能会尝试为特定范围创建某种容器,例如从 0 到 100 的 x 和从 0 到 100 l 的 y 并重复使用更多的容器,例如从 100 到 200 的 x 和从 0 到 100 的 y 等,然后添加你的点到他们所属的地方。 类似的东西

Class Container
{
Int minX;
Int maxX
Int minY;
Int maxY;

List<Point> points;

Check(int x, int y)
(
return x >= minX && x <= maxX && y >=           minY && y <= maxY;
)
}

我们把矩形的4个点称为A(左上)、B(右上)、C(右下)和D(左下)。

开始检查所有带有 A.X 和 A.Y 的容器,然后将容器的默认范围添加到 A.X 并再次检查所有尚未在您的范围内的容器。重复直到 B.X 的剩余范围小于默认范围,然后添加剩余的范围。

从 A.X 和 A.Y 到 D.X 和 D.Y 相同,Y 减少了默认容器范围等等......

甚至可以创建包含容器的容器以进一步缩减比较量。

通过这种方式,您可以检查与矩形重叠的容器并比较这些容器中的点。

甚至可以使用多线程来检查容器。

(抱歉编辑不好,我在用手机)

编辑 现在我重新阅读,我认为这可能会导致一种树结构

更新 在这里,一棵树似乎是正确的选择:Range Tree (Wikipedia)

示例实现:Java Range tree example ( by Robert Sedgewick and Kevin Wayne. )

【讨论】:

    【解决方案2】:

    K-d tree (2d case) 可能是起点。它实现起来相当简单,速度也足够快。

    示例可视化:

    一些java实现的链接:KDTree Implementation in Java

    【讨论】:

      【解决方案3】:

      正如前面提到的,空间索引有很多数据结构:

      • 四叉树
      • R-Trees(R*Tree 是改进的 R-Tree)
      • KD-树

      您必须对索引执行窗口查询(有时称为矩形查询或范围查询),其中查询矩形正是您的移动矩形。

      如果您正在寻找此类空间数据结构的各种实现,请查看here(R*Tree, quadtrees, STR-loaded R-Tree),或者查看PH-Tree,类似到四叉树,但效率更高且深度有限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-09
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        相关资源
        最近更新 更多