1

我有一个 Lines 数组,我用它在我的地图中绘制矢量。

我想用一条线替换两条重叠的线(或它们之间的距离很短)。你能给出一个算法来做到这一点吗?

这是一张可以帮助您理解此问题的图片:

输入线:

输入线

执行算法后,我想得到下图所示的输出:

输出

PS:Line 是点的 ArrayList。

4

2 回答 2

2
  1. 合并任意一对在彼此固定距离内的顶点(将它们的位置设置为相等)。

  2. 在每条线上找到离每个顶点最近的点。如果它足够接近,则在该点上分割线,然后合并这些点。

  3. 删除具有完全相同起点和终点的重复行。

图表

例如,如果您有一条由点 A 和 B 定义的线,以及另一条由点 C 定义的线(左上图)。可以使用点到线的最短距离函数找到点 D。如果 D 离 C 太远则忽略它,否则将 AB 线分成两条线 AD 和 DB,并将 C 位置的所有点移动到 D 位置,得到右图。

于 2012-12-14T12:13:42.913 回答
0

这个问题类似于问题“两个范围是否相交,如果不是,那么它们之间的距离是多少?” 答案稍微取决于您是否已经知道哪个范围最小,以及范围中的点是否正确排序(即线是否具有相同的方向)。

所以初步的算法方法是这样的:

if (a.start < b.start) {
  first = a;
  second = b;
} else {
  first = b;
  second = a;
}

现在让我们找到距离:

distance = max(0, second.start - first.end);

现在你必须有一个最短距离的值范围,这取决于你要将线条超级强加到 1 中。假设您将它们保存在一个名为的数组中:

  arrayRange[];

现在如果,

for(int 1=0;i<arrayRange.length;i++)
{
if(distance is one of the elements of the arrayRange)
then,
callFunctionSuperImposeLines(distance,a,intersectionPoint,a.end,b,b.end);
}
于 2012-12-14T12:15:43.703 回答