C++ 其他列表中每个点的距离列表最近点

C++ 其他列表中每个点的距离列表最近点,c++,coordinates,C++,Coordinates,我有一群所谓的寻找食物的点。每个点都有一个视距值,表示它可以看到食物的范围。 每个点的位置保存为一对。所有食物源的位置都在一个向量中 现在我想计算每个点最近的食物源,这个点可以看到。我不想计算每个组合的距离 我的想法是创建一个食物载体的副本,一个按x排序,另一个按y排序。然后在向量中分别找到间隔[x-sight,x+sight],然后创建两者的交点。 我已经读过set_intersection,但它要求使用相同的规则对两个范围进行排序 你知道我该怎么做吗?也可能是我的想法是错误的 谢谢 IceF

我有一群所谓的寻找食物的点。每个点都有一个视距值,表示它可以看到食物的范围。 每个点的位置保存为一对。所有食物源的位置都在一个向量中

现在我想计算每个点最近的食物源,这个点可以看到。我不想计算每个组合的距离

我的想法是创建一个食物载体的副本,一个按x排序,另一个按y排序。然后在向量中分别找到间隔[x-sight,x+sight],然后创建两者的交点。 我已经读过set_intersection,但它要求使用相同的规则对两个范围进行排序

你知道我该怎么做吗?也可能是我的想法是错误的

谢谢 IceFreez3r

编辑: 我做了一些运行时近似计算: 食物分类:n日志n 查找一个坐标和一个点的间隔:2 log n上下限 如果我们假设食物来源的分布相等,我们可以首先计算估计更接近中间的界限,然后在休息时间间隔内计算第二个界限。这会将运行时减少到:logn+logn/2,只是意识到这可能不是那么强大:logn/2=~logn-1 构建交叉点:x*y=~n*sight/testgroundsize^2 计算交叉点中每个食物的精确距离:n*sight/testgroundsize ^2

总和:2 n对数n+2*点*对数n+对数n/2+n*视野/试验场地大小^2+n*视野/试验场地大小^2 仅限一个坐标的总和:n对数n+点*对数n+对数n/2+n*视线/测试场地大小

我做了一些测试,只是在运行时计算了上述公式:

int dots = dots_.size();
int sum = 2 * n * log(n) + 2 * dots * (log(n) + log(n/2) + pow(n * (sum_sight / dots) / testground_size_,2) + n * pow((sum_sight / dots) / testground_size_, 2));
int sum2 = n * log(n) + dots * (log(n) + log(n/2) + n * (sum_sight / dots) / testground_size_);
cout << n*dots << endl << sum << endl << sum2 << endl;
结果证明交叉路口的想法很糟糕。而仅仅限制一个坐标的想法至少比暴力要好。
我还没有想到网格的想法@Daniel Jour

你正在进入一个有趣的领域来解决这个问题。谷歌的术语是二进制空间划分,四叉树。。。当然还有最近邻搜索

当点的分布范围远大于其可见范围时,这是一种相对简单但有效的方法:

选择网格大小的值。 创建从栅格坐标到实体列表/集合的地图 对于每个食物来源:将它们放在地图的网格坐标处 对于每个点:将它们放在地图的网格坐标处,也放在相邻的网格单元中。邻域的大小取决于网格大小和点的可视值 对于地图中至少包含一个点的每个条目:以较小的网格大小递归执行此算法,或使用蛮力方法:对照网格单元中的每个食物源检查网格单元中的每个点。 与二次蛮力法相比,这是一种线性算法

网格坐标的计算:网格x=intx/网格大小。。。其他坐标相同


邻域:步长=天花板亮度值/网格大小。。邻域是一个边长为2×台阶+1的正方形,以点的网格坐标为中心

我认为你的方法是错误的。这可以从数学上得到验证。你可以用毕达哥拉斯定理计算连接点和食物源的向量的大小,并确保这个大小小于观察极限。这只涉及确定笛卡尔坐标系定义的相对距离和标准测量单位。关于效率问题,首要的任务是确定所采用的方法在计算方面是否实际效率较低(按时间衡量),即使由于这种替代实现,负责某些计算的逻辑组件的时间消耗较少。对于粗糙,理想的方法是减少所花费的时间,而不仅仅是通过重构来包含数值。 现在,如果一个点的位置可以被指定为任意两个数字,这当然意味着一个称为基准的参考框架,以及一个与所讨论的点相关的局部参考框架。就两者而言,可以量化位置和其他此类特征和属性。作为这一观察的结果,您似乎需要n*2个数据结构,其中n是环境中点的数量 包含相对于每个点的排序值,坦率地说,不清楚这种方法是否有效或是最佳的。您陈述了设计和编程约束,即解决方案不得计算每个点到每个食物源的距离。但要做到这一点,我们必须实施其他此类程序,以便得出正确的结果。这些评论与我关于效率的讨论有关。因此,您最好只计算距离
在每一种情况下,都有一个例外。这有点优雅。

我不明白你说的数据结构是什么意思。但总而言之,你认为我的方法比较慢,我应该使用暴力,对吗?