我有一个坐标列表,每个坐标代表SVG路径中由两点定义的一个路径段,比如[x1, y1, x2, y2]
。在某些情况下,列表中的另一个部分会完全重叠一些较小的片段。在
下面是一个简化的例子:
segments = [[1, 1, 2, 1], [2, 1, 2, 2], [2, 2, 3, 2], [3, 2, 3, 1], [3, 1, 1, 1]]
分别表示以下路径中的段:
在这种情况下,第一段与最后一段完全重叠,因此segments[0]
应该被删除,因为它在segments[4]
内。一条路径可以超过8000段。消除较小重叠段的最有效方法是什么?
这些附加条件进一步定义了这个问题:
x
或{[1, 1, 2, 2]
这样的段)。在[3, 1, 1, 1]
和[2, 1, 4, 1]
之间可以看到),则不删除任何段。在
这是一个更简单的答案,它捕获所有段(正交或非正交),只需要一个通常可访问的包
NumPy
(以及一些基本的几何知识):输出:
^{pr2}$更新:
这种方法使用库,功能齐全,可以解决整个问题,而旧的方法是自定义算法,但没有考虑倾斜段。在
谷歌colab链接的代码,以防你得到任何错误的安装库。 https://colab.research.google.com/drive/1tcQ5gps8dQz9kNY93rfAK97hSQPjCvOt
输出:
^{pr2}$以前的方法
仅适用于与x或y轴平行的直线,但不适用于倾斜的直线。在
我用了以下的方法
输出:
^{4}$说明:
1)首先for循环解析给定列表,让我们考虑这个i=0的例子, 行[0]=[1,1,2,1]
2)第二个for循环检查沿x和y轴的其他坐标
例如:
第一个for循环有[1,(y1)1,2,(y2)1],它沿着x轴,即平行于x轴,因为y1=y2。在
现在第二个for循环给我带来了元素[2,(yy1)1,2,(yy2)2],这里y1==yy1但是y2!=yy2
接下来它继续,最后得到[3,1,1,1],其中y1==yy1,y2==yy2。在
现在让我们检查一下它的x坐标是否重叠,因为坐标的顺序可能是相反的,所以我们必须把它们向前推进以便我们进行解释, e、 g:从3到1的坐标等于1到3。 这是通过从列表中查找最小值和最大值的简单操作完成的。在
然后检查转发的x1,x2和xx1,xx2,如果它们重叠,则在列表l中记下,即将其附加到列表l中。 现在,最后一步是删除重叠的元素,这是由最后一个函数remove\uoverlap完成的。在
相关问题 更多 >
编程相关推荐