从无序点绘制连续线

Posted

技术标签:

【中文标题】从无序点绘制连续线【英文标题】:Draw continous line from unordered points 【发布时间】:2019-09-09 01:40:12 【问题描述】:

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

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

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

一组的终点应该总是等于另一组的起点。

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

【问题讨论】:

是否保证所有集合都具有相同的起点,并且每个集合都是自己排序的? 我想你只需要合并点,然后按纬度排序。 集合中的数字真的很重要吗?你不只需要第一个和最后一个吗?还是我错过了什么? 套装本身是否已订购? ......所以他们真的形成了一条折线?您的示例输入是无用的,因为您仅共享纬度是不够的,因为这是 2D 问题。因此,为了解决这个问题,我们需要了解两条折线……它们可以相交还是自相交……多少次(一次或多次?)……集合折线的起点/终点匹配吗?如果是,那么只需检查 2 个点相等的 4 个组合,然后相应地加入或反向加入问题到底在哪里? 是的,每个单独的集合都是有序的,但不一定在同一个方向。我添加了经度以增加清晰度。 【参考方案1】:

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

    定义

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

如果您的点是浮点数,则比较粗略,与一些误差幅度相比更安全,而不是

p[i] == q[j]

你应该这样做:

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

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

【讨论】:

以上是关于从无序点绘制连续线的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中的 bar-line Plotly 对象中绘制连续线?

R绘图基础指南 3. 散点图(合集)

各路大神DrawNode绘制的线锯齿太严重怎么解决

在地理配准图像上绘制连续线并获得GPS坐标

Konvajs 在移动绘图线时绘制第一个点

ArcGIS Engine简单图形绘制功能的实现(点线面)