将并行(相似)折线组合在一起

时间:2016-12-02 09:53:19

标签: math polyline

如何检查两条折线是否接近平行线?他们不必非常平行,但在他们朝同一方向发展时应该是相似的

@Edit

我想我需要更多地解释一切背后的想法。作为输入,我得到许多多线。我想要做的是将折线组合在一起,这些折线非常平行(通常是类似的方向)。结果将是类似的多线组。

多边形线条是怎样的。它们通常直线向上或向左或向右。不必从相同的y值开始。折线的点通常不在同一高度,这意味着具有不同的y值。由于折线在某个区间内是平行的,然后开始不同,我想找到区间边界并在此区间内定义折线的平行部分。当然间隔不应该小到

我现在将举例说明我希望得到的结果。从4条折线开始,P1到P4显示为蓝色。对于人来说,显然线P1-P3非常平行直到红线b1。因此,这可能是平行折线的第一组G1。在红线b1之后,存在平行折线P1和P4。因此他们建立了G2组。多义线P3与其他任何东西都不平行,因此在G3组中是单独的。 希望插图有所帮助 General Picture

应声明为并行的两条多义线的示例:

Example of two poly-lines that should be declared as parallel

应声明为 NOT parallel

的两条多边形线的示例

Example of two poly-lines that should be declared as NOT parallel

@Edit 2 在将道格拉斯peuker算法应用于输入折线后,我得到了这个结果。现在我想将并行折线组合在一起。如何找到我想要比较的相应线段? 另外如图所示"如何比较细分"折线1和2应仅在区间[b1,b2]中组合在一起。我如何找到这个间隔? 这实际上意味着我需要找到要比较的段。如果我比较它们并且如果它们不是并行的,我将其归类为不平行。如果它们是平行的,我仍然需要找到它们平行的间隔,对吧?这是因为一条折线可以开始和结束另一条折线。 How to compare the segments

4 个答案:

答案 0 :(得分:1)

首先拒绝任何交叉点。

然后对线进行线性回归。建立"大致平行"的阈值。现在选择一条折线并从最佳拟合线中取出最远点(如果它是一个结束选择下一个点)。现在将另一条折线分开到最合适的位置" (基本上距离有点倾斜,允许很小的局部偏差,如果可能的话,可以切入角点)。

重复直到没有任何线段为折线,并应用相当宽松的距离和方向阈值。

答案 1 :(得分:1)

对于折线A上的每个顶点,找到折线B上的最近点并输出这两个点之间的距离。 (使用最近的顶点可能会正常工作。) B对A做同样的事。

现在对找到的距离进行线性回归。你应该得到一条水平线。定义此检查的阈值。

答案 2 :(得分:1)

在你的例子中,你知道每对线段共享y轴坐标,所以那些是索引, 根据你的例子,这些线也是连续的。

每个端点(y坐标)处两条线之间的距离是已知的。所以:

for y in 0:n
   delta_x[y] = abs(blue_x[y] - red_x[y]) 

然后如果从所有这些中减去最小的delta_x [y] 您将得到一条非负曲线,即此曲线下的面积 将与你的线的平行程度成正比

更少的区域更平行,
更多区域平行,
完全平行无区域。

但只有你可以选择你的门槛。

答案 3 :(得分:0)

如果查看双空间中的问题,您可以做些什么。您可能遇到过用于图像处理的Hough transform。这会将线条映射到点,这组点称为双空格。

基本思想是你可以用一对数字(m,c)参数化直线y = m x + c。您可以为每条折线中的每个线段执行此操作。这些为每个段提供一组点。这些点应形成以(m1,c1)和(m2,c2)为中心的两个簇。要使线条平行,那么你将得到m1 = m2。

这需要某种形式的聚类算法,可能是k-means,所以你可能需要一些计算机视觉工具包。要对您可能不想使用的线(m,c)进行参数化,因为这些线对垂直线不起作用。一些算法使用线的角度和距离点的距离。

对此的一个改进是尝试将线段拟合到折线的部分。您可以首先定义线段的长度,然后找到大约此长度的折线的子集 使用这些子集然后做一些线拟合,比如线性回归。使用这些拟合线,您可以使用双参数来比较拟合线。

如果我们考虑双空间中的线和点,则存在关系

normal space   <--->   dual space

line           <--->       point
point          <--->       line

因此每条线对应一个点,每个点对应一条线。

如果我们将折线映射到双空间,我们可能会得到像

这样的东西

dual space for polyline

这不是一个精确的图表。每个线段成为一个点,每个点成为一条线。你会发现双重空间会围绕代表拟合线的双重空间。