给定数百万个点,找到位于线上或距线 0.2 毫米距离范围内的点 [关闭]

Posted

技术标签:

【中文标题】给定数百万个点,找到位于线上或距线 0.2 毫米距离范围内的点 [关闭]【英文标题】:Given a millions of points, finds points that lie on the line or in the range of 0.2 mm distance from the line [closed] 【发布时间】:2013-12-13 10:33:43 【问题描述】:

给定一组具有 (x,y) 坐标的数百万个点,我必须选择在线 [(x1,y1)-(x2,y2)] 或位于距离线 0.2 毫米的范围(距离)。

解决这个问题的一种方法 1)将每个点都放在直线方程中,如果满足则点位于直线上 2) 计算点与线的垂直距离,如果距离小于0.2mm则选择该点

但对于数百万点而言,这不是最佳解决方案,因此我正在寻找可以解决上述问题的新算法或技术。

任何帮助将不胜感激!谢谢。

感谢您的回复,您提出的所有建议我都浏览过了。我想,我会给你一些问题的背景。

我是 C++ 编程新手,我面临的问题描述如下

    程序的输入是一个逗号分隔的文本文件,其中包含数百万或数十亿个 x 和 y 坐标,每个点都有一些值 例如x1, y1, 值1

    然后程序绘制数千行([x1,y1]-[x2,y2])

    对于每条线,我必须选择一组位于该线上或在 0 到 0.2 毫米范围内的点

我尝试了以下方法:

    计算每个点与线的距离,如果距离

    在第二种方法中,我计划对坐标进行排序,然后在给定线的两侧以 0.2 毫米的距离绘制平行线......但不知道如何识别位于平行线之间。还建议这个方法好不好

你们中的一些人建议使用 r 树,2-variant 方法,因为我是编程新手,请建议一些在线教程来理解和如何实现它

【问题讨论】:

你真的在和 one 行比较吗?如果您要为多条线评估同一组点,则可能值得建立某种点索引。有一些空间数据结构可能适用于这些点——真正的诀窍是实现有效的搜索。如果你真的在寻找一条线,你就不能避免为每一点做一些工作。将在排序后的数组中搜索一个值作为类比 - 一旦您拥有一个排序后的数组就可以了,但您不会仅仅为了进行一次搜索而对数组进行排序,因为排序的成本高于搜索。 变体 2 是最好的解决方案,因为每个点只检查一次。变体 1 过度 - 当且仅当距离为 0 时满足方程。 【参考方案1】:

要比较所有的点,你所能做的就是比较所有的点。

您可以将任务拆分为多个线程以加快处理速度,但我认为您低估了计算机的速度。

先做简单的实现,看看它是否足够快,然后再尝试复杂化。

【讨论】:

+1 underestimating the speed of computers【参考方案2】:

如何旋转平面使线变成轴,比如 x 轴?您也不需要将整个旋转矩阵应用于每个点。您只需要检查旋转点的 y 坐标,事实上,您可能大部分时间也不需要进行整个计算,因为您可以做一些简单的测试来看看您是否会在到 x 轴所需的距离。

【讨论】:

【参考方案3】:

R-Tree 听起来像你需要的。 此数据结构允许您查询数据库中给定框中的哪个点(在您的情况下为宽度为 0.2 的线)。

所以你需要的改变是你的点的旋转,现在我不确定如果你只是把你的点当作旋转的数据结构会起作用,但即使这样你的问题也变得简单多了,那就是旋转你的点,然后构造树并查询。 希望对您有所帮助。

【讨论】:

【参考方案4】:

要估计解决上述问题所需的时间,请考虑以下 python 代码:

import numpy as np
x1=1.1
x2=1.0
y1=8.0
y2=3.2
#preliminary computation to obtain canonical equation of the line (x1,y1)---(x2,y2)
d=(x2-x1)**(-2.0)+(y1-y2)**(-2)
g=lambda (x,y):1/(x2-x1)/np.sqrt(d)*x+y/(y1-y2)/np.sqrt(d)-(x1/(x2-x1)+y1/(y1-y2))/np.sqrt(d)
# Now: g((3,4)) computes the distance between the line and the point (3,4)
np.random.rand(10**6,2) #generate 1 mil. of points 
result=map(lambda x: np.abs(g(x))<=0.2, points) #computes all cases when distance from current point to the line is less 0.2

计算时间:大约。 15 秒,Athlon x4,2Ghz,Python 2.7

【讨论】:

【参考方案5】:

您还可以对所有点进行一些初步过滤:考虑以 ((x1+x2)/2, (y1+y2)/2 ) 为中心的圆和 R = length_of_the_line/2+offset (offset = 0.2毫米)。

如果点在圆内,则计算点和线之间的垂直距离,如果距离小于 0.2 mm,则选择该点。 如果该点在圆圈之外,请不要选择它

这应该会为您节省一些周期,因为检查点是否在圆内比计算每个点的垂直距离更容易。

希望对你有帮助。

【讨论】:

以上是关于给定数百万个点,找到位于线上或距线 0.2 毫米距离范围内的点 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

寻找附近点的算法?

快速方法按距离搜索数百万个坐标

哪种语言可以将数百万个脏地址稳定地处理为标准格式?

批量地理定位数百万个 IP

两名黑客能打开数百万个酒店房间,这意味着什么?

比较数百万个 mongoDB 记录中的变化的最佳方法