Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 将平行(类似)多段线编组在一起_Math_Polyline - Fatal编程技术网

Math 将平行(类似)多段线编组在一起

Math 将平行(类似)多段线编组在一起,math,polyline,Math,Polyline,如何检查两条多段线是否接近平行?它们不必非常平行,但应该是相似的,因为它们朝着同一个方向前进 @编辑 我想我需要再解释一下这一切背后的想法。作为输入,我得到许多多边形线。我要做的是将平行的多段线组合在一起(通常方向类似)。结果将是一组类似的多边形线 多边形线条看起来如何。它们通常是直线向上或向左或向右移动。不必从相同的y值开始。多段线的点通常不在同一高度,这意味着具有不同的y值。由于多段线通常在某个间隔内平行,然后开始不同,我希望找到间隔边界,并在此间隔内定义多段线平行的部分。当然,间隔不应该太

如何检查两条多段线是否接近平行?它们不必非常平行,但应该是相似的,因为它们朝着同一个方向前进

@编辑

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

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

现在我将举例说明我希望得到的结果。从4条多段线开始,P1到P4以蓝色显示。对于人类来说,很明显,线P1-P3在红线b1之前是非常平行的。因此,这应该是第一组G1平行多段线。红线b1之后是平行多段线P1和P4。因此,他们建立了G2组。多线P3与其他任何东西都不平行,因此在G3组中是单独的。 希望这个例子能有所帮助

应声明为平行的两条多边形线示例:

应声明为不平行的两条多边形线的示例

@编辑2 将douglas peuker算法应用于输入多段线后,我得到了这个结果。现在我要将平行多段线分组在一起。如何找到要比较的对应行分段? 如图“如何比较线段”所示,多段线1和2只应在间隔[b1,b2]中分组在一起。我如何找到这个间隔? 这实际上意味着我需要找到要比较的片段。如果我比较它们,如果它们不平行,我将它们归类为不平行。如果它们是平行的,我仍然需要找到它们平行的间隔,对吗?这是因为一条多段线可以从另一条多段线开始和结束。
首先拒绝任何交叉口

然后对直线进行线性回归。为“大致平行”设定阈值。现在选择一条多段线,并从最佳拟合线中选取最远的点(如果是端点,则选择下一点)。现在,在“最佳拟合”点拆分另一条多段线(基本上是带一点坡度的距离,以允许较小的局部偏差,并尽可能在角点上剪切)


重复此操作,直到所有线段都不是多段线,并应用相当大的距离和方向阈值

对于多段线A上的每个顶点,找到多段线B上最近的点,并输出这两点之间的距离。(改为使用最近的顶点可能效果很好。) 对B和A做同样的处理


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

在您的示例中,您知道每对线段共享y轴坐标,因此这些是索引, 此外,根据您的示例,这些线是连续的

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

for y in 0:n
   delta_x[y] = abs(blue_x[y] - red_x[y]) 
然后,如果你从它们中减去最小的delta_x[y] 您将有一条非负曲线,即该曲线下的面积 将与你的线的平行度成正比

面积越小,平行度越高,
面积越大,平行度越低,
完全平行,没有区域


但是只有您可以选择阈值。

如果在双空间中查看问题,您可以做什么。您可能遇到了用于图像处理的。这将线映射到点,点集称为对偶空间

其基本思想是,您可以通过一对数字(m,c)对直线y=mx+c进行参数化。可以对每条多段线中的每条线段执行此操作。这些为每个段提供了一组点。这些点应形成以(m1,c1)和(m2,c2)为中心的两个簇。如果直线平行,那么m1=m2

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

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


如果我们考虑对偶空间中的线和点,就有一种关系

normal space   <--->   dual space

line           <--->       point
point          <--->       line
正规空间对偶空间
线点
点线
所以每一条线对应一个点,每一个点对应一条线

如果我们将多段线映射到双空间,我们可能会得到如下结果


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

“它们不必非常平行,但应该是相似的,因为它们在同一个方向上。那么,在同一方向上但相互相交的线段呢?它们总是总的方向吗(从下到上或其他)可被视为单值函数X(y)?是的,它始终是单值函数。如图2所示