【问题标题】:Using a QuadTree to get all points within a bounding circle使用四叉树获取边界圆内的所有点
【发布时间】:2011-07-14 18:56:06
【问题描述】:

我有一组 100 到 200 个点 (x,y)。我必须检查哪些落在其他的特定距离内。整个程序的特定距离是固定的,比如 50。比如点 1 落在点 5、7、25、90、96、105 等的范围内。同样,第 2 点落在 23,45 等范围内... Storing objects for locating by x,y coordinates

这里建议使用 QuadTree,但它可用于获取边界矩形内的所有点。但是如何获得边界圈内的所有点?有一种方法可以在最大距离内返回最接近纬度/经度的点,但是如何获取距离内的所有点? http://openmap.bbn.com/doc/api/com/bbn/openmap/util/quadtree/QuadTree.html#QuadTree(float, float, float, float, int)

一种方法可能是在我得到它时从树中删除每个点,然后再次查询最近的点,直到我得到空值。这是唯一的方法吗?

【问题讨论】:

    标签: java algorithm data-structures quadtree


    【解决方案1】:

    假设您有一个以 (x, y) 为中心、半径为 r 的圆,并希望在四叉树中找到圆中的所有点。一种思路如下:

    1. 构造内接圆的边界框。这是包含圆的最小矩形,它具有左上角 (x - r, y - r) 和右下角 (x + r, y + r)。圆圈中的任何点也必须在正方形中,但不能反过来。

    2. 在四叉树中查询位于该矩形中的点集。让这些点为 P。

    3. 对于 P 中已知在矩形中的每个点,查看它是否也在圆中。您可以通过检查从该点到 (x, y) 的距离是否不大于 r 来做到这一点。换句话说,给定一个点 (x0, y0),您将计算 (x - x0)2 + (y - y0)2,如果这个值小于等于r2,那么这个点就是包含在圆圈中。

    虽然这看起来效率低下,但实际上速度非常快。正方形的面积与圆的面积之比为 4 / π ≈ 1.27。换句话说,假设您的积分分布比较均匀,您只会发现比您需要的多 27% 的积分。

    【讨论】:

    • 好主意,明白了。在边界矩形内我几乎不会有大约 10 个点。所以你的方法似乎是合理的。使用四叉树是查询边界圆内所有点的最快方法吗?
    • 有多种空间数据结构,如四叉树,包括kd-trees和R tree。如果您对“把这个圈子里的所有东西都给我”特别感兴趣,那么四叉树绝对是一个不错的选择。如果您想问诸如“给我距离空间中某个特定点最近的五个点”之类的问题,那么 kd-tree 是一个很好的选择。不过,根据您的描述,四叉树应该是完美的。
    • 好的。我只处理圈子。
    • 我认为封闭矩形的角在 +/- r*sqrt(2)。而且我还想知道是否有一种更直接的方法来做到这一点 - 它绝对不适用于测地纬度/经度和更多点,而位掩码会做得更好。只是找不到如何申请。
    • @templatetypedef 你能解释一下第二个子句吗?如何找到矩形中的点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2011-07-10
    • 2022-08-21
    • 1970-01-01
    • 2018-07-10
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多