匹配两个矢量路径

时间:2015-06-20 20:31:48

标签: python svg matching vector-graphics pyx

我有几个矢量路径和一个查询路径,现在我正在尝试获取与查询路径最相似的路径。我可以访问每个路径的长度(周长),以及它们的边界框的宽度和高度。我正在使用python并使用pyx库来渲染SVG路径并计算它们的边界框。伪代码看起来像......

{{1}}

但它似乎没有给出好的结果。关于如何改善结果的任何想法?

1 个答案:

答案 0 :(得分:0)

让我们使用一个简单的PyX图来生成一些路径: a pyx graph

路径也可以来自以解析模式读取的SVG文件。

一旦有了PyX路径,就可以使用PyX功能获取有关路径的更多信息。在下面的简单版本中,我计算沿每条路径的几个点并总结它们的距离。 (我使用以_pt结尾的方法名称,它在PostScript点上工作。它比使用PyX单元快一点。而且我在开始时明确地将所有路径转换为normpath。虽然这不是必需的,但它有助于减少内部的一些函数调用。)

以下是完整代码(包括生成样本路径的图表):

import math
from pyx import *

# create some data (and draw it)
g = graph.graphxy(width=10, x=graph.axis.lin(min=0, max=2*math.pi))
qpi = g.plot(graph.data.function("y(x)=sin(x)"))
opi1 = g.plot(graph.data.function("y(x)=sin(x)+0.1*sin(10*x)"))
opi2 = g.plot(graph.data.function("y(x)=sin(x)+0.2*sin(20*x)", points=1000))
g.writePDFfile()

# get the corresponding PyX paths
qpath = qpi.path.normpath()
opath1 = opi1.path.normpath()
opath2 = opi2.path.normpath()

# now analyse it
POINTS = 10

qpath_arclen_pt = qpath.arclen_pt()
qpath_points_pt = qpath.at_pt([qpath_arclen_pt*i/(POINTS-1) for i in range(POINTS)])

for opath in [opath1, opath2]:
    opath_arclen_pt = opath.arclen_pt()
    opath_points_pt = opath.at_pt([opath_arclen_pt*i/(POINTS-1) for i in range(POINTS)])
    print(sum(math.sqrt((qpoint_x_pt-opoint_x_pt)**2 + (qpoint_y_pt-opoint_y_pt)**2)
              for (qpoint_x_pt, qpoint_y_pt), (opoint_x_pt, opoint_y_pt) in zip(qpath_points_pt, opath_points_pt)))

程序打印出来:

25.381154890630064
56.44386644062556

表示虚线比虚线更接近实线。

你也可以比较切线,曲率,arclen本身等......根据你的需要,有很多选择。