Позволяет использовать простой Pyx граф, чтобы генерировать некоторые пути: 
Пути могут также поступать из файла SVG чтения в обработанном режиме.
Как только у вас есть пути PyX, вы можете использовать функции PyX, чтобы получить дополнительную информацию о путях. В следующей простой версии я вычисляю несколько точек вдоль каждого пути и суммирую их расстояние. (Я делаю это, используя имена методов, заканчивающиеся на _pt
, которые работают в точках PostScript.Это немного быстрее, чем использование блоков PyX. Также я преобразовал все пути в нормальные пути явно в начале. Хотя это необязательно, это помогает уменьшить некоторую функцию звонки внутри)
Вот полный код (в том числе график, чтобы генерировать траекториями).
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
, который указывает на то, что пунктирная линии ближе t o сплошная, чем пунктирная линия.
Вы также можете сравнить касательные, кривизны, собственно arclen и т. Д. ... в зависимости от ваших потребностей существует множество вариантов.
Что означает «хороший»? Каким образом алгоритм не хорош и что бы сработал хороший алгоритм? Приведите примеры путей, которые не совпадают, но должны и должны соответствовать, но не должны. –
@RobertLongson Хорошо, значит, он должен давать похожие пути. Скажем, у меня есть любой зигзагообразный путь и круг, в котором их ограничивающие прямоугольники имеют сопоставимые размеры. Теперь я получаю такие круги в своих результатах, что подразумевает, что с большой вероятностью их длины также сопоставимы. – Selie
Кроме того, я думаю, что я могу выбрать несколько случайных точек внутри пути запроса и посмотреть, не лежат ли они также и на пути, который я сравниваю. Но для этого я не знаю, находится ли точка внутри пути SVN или нет. – Selie