我使用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来加快速度呢?
答案 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)))
。
希望这会有所帮助!