c++ - 在笛卡尔二维空间的每个象限中找到最近的点

标签 c++ boost r-tree

我在 2D 笛卡尔空间 中有 N 个点 加载到 boost:rtree 中。 给定一个不在树中的随机点 P(x,y),我需要找到一种有效的方法来为 local csys< 生成的四个象限中的每一个确定最近的点/em> 以 P 为中心并与主坐标系平行

enter image description here

如图(上方链接)所示,给定红色点,我需要找到四个紫色点。

我试过这种天真的方法:


namespace bg = boost::geometry;
typedef bg::model::box<point> box;
vector<item> result_s;
vector<item> result_p;

int xres = 10; /*this is a fixed amount that is loosely related to the points distribution*/
int yres = 10; /*as for xres*/
int range = 10;   
int maxp = 30;

/*
* .. filling the tree
*/

box query_box2(point(lat, lon), point(lat-range*yres, lon+range*xres));
rtree.query(bgi::intersects(query_box2) && bgi::nearest(p, maxp), std::back_inserter(result_p));
if(result_p.size()>0) result_s.push_back(result_p[0]);
result_p.clear();

box query_box1(point(lat, lon), point(lat+range*yres, lon+range*xres));
rtree.query(bgi::intersects(query_box1) && bgi::nearest(p, maxp), std::back_inserter(result_p));
if(result_p.size()>0) result_s.push_back(result_p[0]);
result_p.clear();

box query_box3(point(lat, lon), point(lat+range*yres, lon-range*xres));
rtree.query(bgi::intersects(query_box3) && bgi::nearest(p, maxp), std::back_inserter(result_p));
if(result_p.size()>0) result_s.push_back(result_p[0]);
result_p.clear();

box query_box4(point(lat, lon), point(lat-range*yres, lon-range*xres));
rtree.query(bgi::intersects(query_box4) && bgi::nearest(p, maxp), std::back_inserter(result_p));
if(result_p.size()>0) result_s.push_back(result_p[0]);
result_p.clear();

if(result_s.size()>3)
   cout << "OK!" << endl;
else
   cout << "KO" << endl;

但通常以空结果结束(KO)

任何建议或地址将不胜感激。

谢谢。

最佳答案

我会执行一个迭代的nearest 查询。

它将产生按距离升序排序的最近点。

can cancel it在所有象限中至少获得 1 分后。

原则上,这种方法的时间复杂度要低得多,因为它只涉及一个查询。

最坏情况下的行为会遍历树中的所有点,例如

  • 如果一个象限不包含任何点,或者
  • 当一个象限中的所有点实际上都比另一个象限中的最近点更近时。

似乎前者在您的模型中可能是不可能的(?),而后者在正态分布中在统计学上是不可能的。您必须检查您的域的预期点分布。

或者,这始终适用:测量并比较有效性能

关于c++ - 在笛卡尔二维空间的每个象限中找到最近的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58182402/

相关文章:

c++ - 如何知道 QLineEdit 是否获得焦点?

c++ - 使用 CFileDialog 打开文件失败时如何捕获异常

c++ - 无法从文件加载正确的信息

c# - 哪种空间数据结构(算法)最适合(搜索)一组区域(空间数据)?

c++ - 从 C++ 中的基方法调用重写的子方法

c++ - 获取距离中心矩形最远的矩形

c++ - 如何访问( boost 元)状态机中的所有状态?

c++ - 如何将 boost 绑定(bind)与成员函数一起使用

python - 在 Sqlite SELECT 语句中使用参数

python - 你如何在 Heroku 中安装 Rtree?