2015-06-20 6 views
0

У меня есть несколько векторных путей и путь запроса, и теперь я пытаюсь получить путь, наиболее похожий на путь запроса. Я могу получить длину (периметр) каждого пути, а также ширину и высоту их ограничивающих прямоугольников. Я использую python и использую pyx-библиотеку для рендеринга SVG-путей и вычисления их ограничивающих полей. Псевдокод выглядит как ...Соответствие двух векторных путей

THRESHOLD = //some value 
qpath = //my query path 
similar_paths = [] 

for path in path_list: 
    if (comparable width and comparable height and comparable perimeters): 
     similar_paths.append(path) 

Но, похоже, это не дает приятных результатов. Любые идеи о том, как улучшить результаты?

+0

Что означает «хороший»? Каким образом алгоритм не хорош и что бы сработал хороший алгоритм? Приведите примеры путей, которые не совпадают, но должны и должны соответствовать, но не должны. –

+0

@RobertLongson Хорошо, значит, он должен давать похожие пути. Скажем, у меня есть любой зигзагообразный путь и круг, в котором их ограничивающие прямоугольники имеют сопоставимые размеры. Теперь я получаю такие круги в своих результатах, что подразумевает, что с большой вероятностью их длины также сопоставимы. – Selie

+0

Кроме того, я думаю, что я могу выбрать несколько случайных точек внутри пути запроса и посмотреть, не лежат ли они также и на пути, который я сравниваю. Но для этого я не знаю, находится ли точка внутри пути SVN или нет. – Selie

ответ

0

Позволяет использовать простой Pyx граф, чтобы генерировать некоторые пути: a pyx graph

Пути могут также поступать из файла 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 и т. Д. ... в зависимости от ваших потребностей существует множество вариантов.

+0

Хороший ответ, но все же немного расплывчатый. Я думаю об использовании дескрипторов фигур вместо этого. Я думаю, что они дадут хорошие результаты. – Selie

+0

Кроме того, это не вращение, масштабирование и т. Д. Инвариант. – Selie

+0

Вы не указали метрику для измерения сходства путей. Пожалуйста, укажите его, и я мог бы помочь его реализовать с помощью PyX-путей. В качестве примера я просто измерил расстояния между некоторыми точками на дорожках. Эта мера является инвариантом вращения (который может быть проверен путем преобразования путей). Он не является масштабирующим инвариантом. Вместо этого при применении шкалы ко всем путям результат изменяется на тот же коэффициент. Существует множество вариантов исправления, если это необходимо, например, деления результата на arclen пути запроса. – wobsta