从无序点画连续线

时间:2019-04-18 17:06:00

标签: c# arrays algorithm sorting gis

我有一组包含多条折线的经/纬度坐标。每组坐标是一条连续线。例如,

Set 1 = 29.61357,-95.64925 29.61204,-95.65259,-95.65886 29.60898,-95.66032 29.60838,-95.66032
Set 2 = 29.61991,-95.63519 29.61957,-95.63648 29.61918,-95.63766 29.61795,-95.64047 29.61644,-95.6436 29.61465,-95.64699 29.61357,-95.64925

我想将这些集合合并在一起形成一条连续的线,但是,如上面的坐标所表示的,坐标不一定要以相同的顺序来形成一条连续的线(它们都具有相同的起始坐标,因此一条线会必须逆转)。

一组的终点应始终等于另一组的起点。

遍历点(或线),确定哪些线需要反转然后适当地反转它们,最有效的方法是什么?

1 个答案:

答案 0 :(得分:1)

由于您的两条折线是折线(点是有序的),因此只需找到要反转的内容和要附加的位置即可。由于两条折线中的连接点完全相同,因此很容易:

  1. 定义

    调用折线p[n]q[m],其中n,m是点数。并将新的折线称为r[N] N=m+n-1

  2. 连接点

    仅检测四种情况中的哪一种是正确的:

    p[  0]==q[  0] // a
    p[  0]==q[m-1] // b
    p[n-1]==q[m-1] // c
    p[n-1]==q[  0] // d
    
  3. 合并方案a

    r[  i]=p[n-1-i]; i={0,1,2,...n-1} // reverse p[]
    r[n+i]=q[i+1];   i={0,1,2,...m-2} // copy q[]
    
  4. 合并方案b

    r[  i]=q[i];   i={0,1,2,...m-1} // copy q[]
    r[m+i]=p[i+1]; i={0,1,2,...n-2} // copy p[]
    
  5. 合并方案c

    r[  i]=p[i];     i={0,1,2,...n-1} // copy p[]
    r[n+i]=q[m-2-i]; i={0,1,2,...m-2} // reverse q[]
    
  6. 合并方案d

    r[  i]=p[i];     i={0,1,2,...n-1} // copy p[]
    r[n+i]=q[i+1];   i={0,1,2,...m-2} // copy q[]
    

请注意,p[i]是整点(所以长,纬度均是如此),因此,如果您的数组是一维的,则需要更改索引并相应地调整范围。希望我没有对索引犯一些愚蠢的错误,但是即使我这样做了,您也应该明白如何做到这一点……

如果您的点是浮点的,则它比较粗糙,可以比较安全地与一些误差范围相比较,因此

p[i] == q[j]

您应该执行以下操作:

|p[i]-q[j]| <= threshold

其中阈值是一些较小的值,例如1e-10 ...