【问题标题】:Efficient Matlab way of reducing 2D segments?减少二维段的有效Matlab方法?
【发布时间】:2020-05-06 16:53:35
【问题描述】:

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

给定一组二维线段(x 和 y 坐标)

  • 在重叠(或几乎重叠)段的情况下只保留一个副本
  • 对于每个保留的部分,请计算其上有多少重叠。

所以输入将是一大组片段(有很多重叠) 并且输出将是不重叠的段,每个段都有计数。

这个 matlab 图中显示了一个示例输入

正如您所见,有些线条看起来更粗,因为有多个重叠。 因此,我只需要没有重叠的骨架,但我需要重叠的信息作为每个输出段的数字。

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

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

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

输入可以包含更多段。这个想法是减少应该消除平行和相互重叠的电缆,并具有一定的公差。 例如,如果 2 根电缆平行但相距很远,则应将它们都保留。

我不关心公差,如果输出不同也没关系,我只需要一个关于如何有效解决这个问题的想法,因为即使有许多段作为输入,代码也应该运行得很快。

【问题讨论】:

  • 请提供一个minimal reproducible example,包括一个简单的示范性输入数据集,以及该数据集的预期输出。图形示例有助于理解,但不能直接回答您的问题。还请先发制人地解决边缘情况 - 例如如果段是共线但不重叠会发生什么? “重叠”的容忍度是多少?你如何衡量这种容忍度?您可以做出哪些假设(例如,段是否总是平行的?)等等...

标签: matlab geometry 2d overlap segment


【解决方案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')

结果:

还有中心线:

【讨论】:

  • 谢谢。是的,骨架化是个好主意!但是如何获得骨架化后的重叠数?因为我需要保留的每个段的重叠数。您可以查看示例,我刚刚编辑了问题。
猜你喜欢
  • 1970-01-01
  • 2015-06-18
  • 2011-03-25
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2017-08-22
相关资源
最近更新 更多