c# - 从无序点绘制连续线

标签 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. 定义

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

  2. 关节点

    简单地检测 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
    
  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] 是整点(所以都是 long,lat)所以如果你的数组是一维的,你需要相应地改变索引和范围。希望我没有在索引上犯一些愚蠢的错误,但即使我犯了错误,你也应该明白如何做到这一点......

当然,如果你的点是 float ,那么与一些误差范围进行比较更安全,而不是

p[i] == q[j]

你应该这样做:

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

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

关于c# - 从无序点绘制连续线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55750746/

相关文章:

java - 数组排序方法行为

对象数组的 C++ 文件输出

php - 前缀和通过在数组中移动 m 步找到最大收集值

c# - 是 'field' 但像类型一样使用 - C#

c# - 如何从 SharpSVN 获取最新版本号?

c# - 正则表达式失败

c# - Visual Studio Web 用户控件事件仅在设计模式下显示?

c - 如何只检查一次输入,而不是挂起等待输入

java - 在快速排序中使用最后一个元素作为枢轴时无法解决错误

python - Floyd Warshall 算法未按预期工作