给定数百万个点,查找位于直线上或距离直线0.2 mm范围内的点

Given a millions of points, finds points that lie on the line or in the range of 0.2 mm distance from the line

本文关键字:距离 范围内 mm 百万个 数百万 查找 于直线      更新时间:2023-10-16

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

解决这个问题的一种方法1) 把每个点都放在直线方程中,如果它满足,那么点就在直线上2) 计算点和线之间的垂直距离,如果距离小于0.2mm,则选择该点

但对于数百万点来说,这并不是最好的解决方案,所以我正在寻找新的算法或技术来解决上述问题。

如有任何帮助,我们将不胜感激!谢谢。

谢谢你的回复,我已经仔细阅读了你发布的所有建议。我想,我会给你一个问题的背景。

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

  1. 程序的输入是逗号分隔的文本文件,该文件包含数百万或数十亿个x&y坐标,每个点都有一些值例如x1,y1,value1
  2. 然后程序绘制数千行([x1,y1]-[x2,y2])

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

我尝试了以下方法:

  1. 若距离<=0.2然后选择这样的点,并做了数千行。。。但它不是有效的算法

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

你们中的一些人建议使用r树,2-变体方法,因为我是编程pl的新手,所以建议一些在线教程来理解&如何实现相同的

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

你可以把任务分成多个线程来更快地处理,但我认为你低估了计算机的速度。

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

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

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

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

要估计解决上述问题所需的时间,请考虑以下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

您还可以对所有点进行一些初步过滤:考虑以((x1+x2)/2,(y1+y2)/2)为中心的圆,R=长度_of_the_line/2+偏移量(偏移量=0.2mm)。

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

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

希望能有所帮助。