Если два пути имеют одинаковую длину, скажем, п, то они на самом деле указывает в 2n-мерном пространстве. Первое местоположение определяет первые два измерения, второе местоположение определяет следующие два измерения и так далее. Например, если мы просто возьмем три точки в вашем примере, путь может быть представлен как единственная 6-мерная точка (1, 5, 2, 7, 4, 4). Если мы хотим сравнить это с другим трехточечным путем, мы можем вычислить либо евклидову дистанцию (квадратный корень из суммы квадратов расстояний между измерениями между двумя точками), либо расстояние Манхэттена (сумма разностей по размерности).
Например, пусковой путь, который остается на (0, 0) для всех трех времен, становится 6-мерной точкой (0, 0, 0, 0, 0, 0). Тогда евклидово расстояние между этой точкой и вашим примером будет sqrt((1-0)^2 + (5-0)^2 + (2-0)^2 + (7-0)^2 + (4-0)^2 + (4-0)^2) = sqrt(111) = 10.54
. Расстояние Манхэттена - abs(1-0) + abs(5-0) + abs(2-0) + abs(7-0) + abs(4-0) + abs(4-0) = 23
. Такая разница между метриками не является чем-то необычным, поскольку расстояние Манхэттена доказуемо не менее велико, чем евклидово расстояние.
Конечно, одна из проблем с этим подходом заключается в том, что не все пути будут иметь одинаковую длину. Тем не менее, вы можете легко отрезать длинный путь до той же длины, что и более короткий путь, или считать, что более короткие из двух путей остаются в одном и том же месте или перемещаются в одном направлении после завершения измерений, пока оба пути не будут иметь одинаковую длину , Любой подход приведет к некоторым неточностям, но независимо от того, что вы делаете, вам приходится иметь дело с тем фактом, что вам не хватает данных на коротком пути и что-то нужно компенсировать.
EDIT:
Предполагая, что path1
и path2
являются List<Tuple<int, int>>
объекты, содержащие точки, мы можем отсечь длинный список, чтобы соответствовать более короткий список, как:
// Enumerable.Zip stops when it finishes one of the sequences
List<Tuple<int, int, int, int>> matchingPoints = Enumerable.Zip(path1, path2,
(tupl1, tupl2) =>
Tuple.Create(tupl1.Item1, tupl1.Item2, tupl2.Item1, tupl2.Item2));
Затем, вы можете используйте следующий код, чтобы найти Манхэттенское расстояние:
int manhattanDistance = matchingPoints
.Sum(tupl => Math.Abs(tupl.Item1 - tupl.Item3)
+ Math.Abs(tupl.Item2 - tupl.Item4));
При тех же предположениях, что и для Манхэттенского расстояния, мы можем генерировать евклидово расстояние, как:
int euclideanDistanceSquared = matchingPoints
.Sum(tupl => Math.Pow(tupl.Item1 - tupl.Item3, 2)
+ Math.Pow(tupl.Item2 - tupl.Item4, 2));
double euclideanDistance = Math.Sqrt(euclideanDistanceSquared);
Вы должны предоставить более подробную информацию здесь. Какая логика решает «совпадение»? Если я использую случай распознавания жестов и пример пути, такого как рисование числа «6», тогда требуется совпадение на основе формы пути (то есть: большой 6 должен «соответствовать» маленькому «6» - только масштабирование), топология пути (то есть: нижняя строчка «сигма» соответствует «6» соответствует «b» и т. д.), скорость пути (то есть: быстро нарисованный 6 не соответствует медленно вытянутому) Что вы пытаетесь достичь? С какой точностью? С какими весами? Для такой проблемы требуется больше параметров. –