11

我有一组 100 到 200 个点 (x,y)。我必须检查哪些落在其他的特定距离内。整个程序的特定距离是固定的,比如 50。比如点 1 落在点 5、7、25、90、96、105 等的范围内。同样,点 2 落在 23,45 等范围内... 存储对象以通过 x,y 坐标定位

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

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

4

1 回答 1

22

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

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

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

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

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

于 2011-07-14T20:40:30.730 回答