C# 从无序点画连续线

C# 从无序点画连续线,c#,arrays,algorithm,sorting,gis,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.6469

我有一组由多段线组成的横向/纵向坐标。每一组坐标都是一条连续线。比如说,

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
我想将这些集合合并在一起形成一条连续线,但是,正如上面的坐标所表示的,坐标不一定以相同的顺序形成一条连续线(它们都具有相同的起始坐标,因此一条线必须反转)

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


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

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

  • 定义

    让我们调用多段线
    p[n]
    q[m]
    ,其中
    n,m
    是点数。新的多段线称为
    r[N]N=m+N-1

  • 接合点

    只需检测4种情况中哪一种是正确的:

    p[  0]==q[  0] // a
    p[  0]==q[m-1] // b
    p[n-1]==q[m-1] // c
    p[n-1]==q[  0] // d
    
  • 合并场景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[]
    
  • 合并场景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[]
    
  • 合并场景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[]
    
  • 合并场景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]
    是整点(所以都很长,lat),所以如果数组是1D,则需要相应地更改索引和范围。希望我没有在索引上犯一些愚蠢的错误,但你应该明白如何做到这一点,即使我做到了

    如果你的点是浮点数,比较一些误差幅度会更安全,所以

    p[i] == q[j]
    
    你应该这样做:

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

    | p[i]-q[j]|是否所有集合都保证有相同的起点,并且每个集合都按自己的顺序排列?我认为您只需要合并点,然后按纬度排序。集合中的数字真的重要吗?你不是只需要第一个和最后一个吗?还是我错过了什么?布景本身是有序的吗。。。所以它们真的形成了一条多段线?您的示例输入是无用的,因为您只共享纬度,这是不够的,因为这是2D问题。所以要解决这个问题,我们需要了解两条多段线。。。它们可以相交还是自相交。。。多少次(一次或多次?)。。。集合多段线的起点/终点是否匹配?如果是,则只需检查4个组合,其中2个点相等,并相应地进行连接或反向连接,问题究竟出在哪里?是的,每个单独的集合是按顺序排列的,但不一定在同一方向。我添加了经度以增加清晰度。