高效的Matlab减少2D片段的方法?

问题描述 投票:0回答:1

我需要编写一个函数来简化一组段。特别是:

给出二维线段的集合(x和y坐标)

  • 如果段重叠(或几乎重叠),则仅保留一个副本
  • 对于每个保留部分,请计算其上有多少重叠。

因此,输入将是一大段细分(有很多重叠)并且输出将是不重叠的段,每个段都有计数。

此matlab图中显示了示例输入example

如您所见,某些线条看起来较粗,因为存在多个重叠。结果,我只需要没有重叠的框架,但是我需要将重叠的信息作为每个输出段的数字。

我不是处理线段和几何问题的专家。解决此类问题的最有效方法是什么?我正在使用Matlab,但是任何高级语言的代码示例都可以帮助您。谢谢!

编辑根据要求,这里也是一个示例数据集,您可以从此google驱动器链接中获取它https://drive.google.com/open?id=1r2hkG7gI0qhzfP-Mmn8HzIil1o47Z2nA

输入是具有276电缆段的csv输出是具有58个电缆段(缩小的段)的csv +额外的一列,其中包含保留的每个段的重叠电缆数量。

输入可能包含更多细分。这样做的目的是减少电缆,以消除具有一定公差的平行且相互重叠的电缆。例如,如果2条电缆平行但相距较远,则应将两者都保留。

我不关心输出是否不同的公差,我只需要一个有关如何有效解决此问题的想法,因为即使有许多段作为输入,代码也应快速运行。

matlab geometry 2d overlap segment
1个回答
1
投票

Matlab可能不是最适合几何操纵的语言。 PostgreSQL / PostGIS将是一个更好的工具,但是如果您没有选择,这里是一种获取行骨架的解决方案:

% Random points
P = [0 0; 
1 1; 
2 1; 
1.01 1.02; 
0.01 0.01];
% positive buffer followed by a negative buffer   
pol = polybuffer(polybuffer(P,'lines',0.25,'JointType','miter'),-0.249,'JointType','miter');
plot(P(:,1),P(:,2),'r.','MarkerSize',10)
hold on
plot(pol)
axis equal
% Drop the duplicate with uniquetol (with a tolerance of 0.005) to get the centerline
utol = uniquetol(pol.Vertices,0.005,'ByRows',true) 
hold off; 
plot(utol(:,1),utol(:,2),'b')

结果:

enter image description here

和中心线:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.