从SVG路径中采样几何点的快速方法

时间:2017-08-22 05:45:55

标签: python svg

我使用Python 3中的优秀svgpathtools库来处理SVG文件中的某些路径,这些路径是在矢量绘图应用程序中创建的。

我想为SVG中包含的每个路径创建详细的点阵列,其中点在路径上是等距的。以下情况就是如此,但如果采集的样本超过几千个,则变得无法忍受。

SAMPLES_PER_PX = 1

fname = "/path/to/file.svg"
paths, attributes = svg2paths(fname)

myPaths = {}
for path,attr in zip(paths, attributes):
    myPathList = []
    pathLength = path.length()
    pathColour = attr['stroke']
    numSamples = int(pathLength * SAMPLES_PER_PX)
    for i in range(numSamples):
        #parametric length = ilength(geometric length)
        myPathList.append(path.point(path.ilength(pathLength * i / (numSamples-1))))
    myPaths[pathColour] = np.array(myPathList)

我一直觉得我的Python非常恐怖。有没有办法可以利用一些Python来加快速度呢?

2 个答案:

答案 0 :(得分:0)

我有同样的问题。我的解决方案是使用path.point对N个点进行采样,然后使用scipy样条对这些点进行插值,然后从样条中重新采样。像这样:

tck, _ = interpolate.splprep(pts, s=0)
result = interpolate.splev(np.linspace(0, 1, 1000), tck)

pts是采样点的列表。数字N取决于输入曲线的不均匀程度。通常N = 20足以应付不太疯狂的情况:-)

答案 1 :(得分:0)

您实际上不需要使用 ilength 方法。您对 myPathList.append(path.point(path.ilength(pathLength * i / (numSamples-1)))) 所做的是计算您想要的点在路径的几何长度上的位置,但是由于您知道您正在路径上定期间隔 numSamples 点,因此您将保持在参数距离中有规律地间隔的相同数量的点,所以你可以直接写myPathList.append(path.point(i / (numSamples-1)))。 希望这会有所帮助!