Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用四叉树获取边界圆内的所有点_Java_Algorithm_Data Structures_Quadtree - Fatal编程技术网

Java 使用四叉树获取边界圆内的所有点

Java 使用四叉树获取边界圆内的所有点,java,algorithm,data-structures,quadtree,Java,Algorithm,Data Structures,Quadtree,我有一组100到200点(x,y)。我必须检查哪些落在与其他落在特定距离内。整个程序的特定距离是固定的,例如50。假设第1点在第5点、第7点、第25点、第90点、第96105点……等范围内。同样,第2点在23,45等范围内。。。 这里建议使用四叉树,但它可以用来获取一个边框内的所有点。但是如何获得一个边界圆内的所有点呢?有一种方法可以返回最大距离内最接近lat/long的点,但如何获取该距离内的所有点? 一种可能的方法是在我得到每个点时将其从树中移除,然后再次查询最近的点,直到我得到null

我有一组100到200点(x,y)。我必须检查哪些落在与其他落在特定距离内。整个程序的特定距离是固定的,例如50。假设第1点在第5点、第7点、第25点、第90点、第96105点……等范围内。同样,第2点在23,45等范围内。。。

这里建议使用四叉树,但它可以用来获取一个边框内的所有点。但是如何获得一个边界圆内的所有点呢?有一种方法可以返回最大距离内最接近lat/long的点,但如何获取该距离内的所有点?


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

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

  • 构建用于标注圆的边界框。这是包含圆的最小矩形,它有左上角(x-r,y-r)和右下角(x+r,y+r)。圆中的任何点也必须在正方形中,但不能反过来

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

  • 对于p中已知在矩形中的每个点,查看它是否也在圆中。可以通过检查从该点到(x,y)的距离是否不大于r来执行此操作。换句话说,给定一个点(x0,y0),你会计算(x-x0)2+(y-y0)2,如果这个值小于或等于r2,那么这个点就包含在圆中


  • 虽然这看起来效率很低,但实际上相当快。正方形面积与圆形面积之比为4/π&近似值;1.27. 换句话说,假设你的分数分布比较均匀,你只会发现比你需要的分数多27%。

    好主意,明白了。在边界矩形中几乎没有10个点。所以你的方法似乎是合理的。使用四叉树是查询边界圆内所有点的最快方法吗?有各种空间数据结构,如四叉树,包括kd树和R树。如果你对“给我这个圈子里的一切”特别感兴趣,四叉树绝对是个不错的选择。如果你想问一些问题,比如“给我五个离空间中某个特定点最近的点”,那么kd树是一个很好的选择。但是,对于您所描述的,四叉树应该是完美的。我只处理圆。我认为封闭矩形的角在+/-r*sqrt(2)处。我还想知道是否有一种更直接的方法可以做到这一点——它绝对不会对测地纬度/经度和更多点进行缩放,而位掩码会做得更好。只是找不到如何应用。@templatetypedef您能解释一下第二条吗?如何找到矩形中的点?