2015-11-24 6 views
4

У меня есть две функции, описывающие две кривые в 2D.Наименьшее расстояние между двумя кривыми, определяемыми функциями

p1 = f1(t1) 
p2 = f2(t2) 

, где p1 и p2 являются векторами, t1 и t2 скаляры со значением между 0,0 и 1,0.

Кривые оба выпуклые с «животами», обращенными друг к другу. Они могут быть повернуты и могут быть определены новые функции y = h(x), так что их производные на x будут монотонно увеличиваться/уменьшаться.

Пример:

two curves

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

Возможный подход, я думаю, можно было бы определить функцию расстояния:

g(t1, t2) = |f1(t1) - f2(t2)| 

, а затем использовать обобщение Newton's method для решения системы уравнений

0 = ∂g(t1, t2)/∂t1 // partial derivative of g for t1 
0 = ∂g(t1, t2)/∂t2 // partial derivative of g for t2 

Но я не уверен, что это правильно, и это немного неудобно, потому что мне понадобятся первая и вторая производные от g, которые мне пришлось бы вычислить численно.

Есть ли более простой, возможно более быстрый алгоритм для этого?

+0

Не могли бы вы добавить цифру? Я предполагаю, что вы имеете в виду две * кривые *. Строка прямая (что сделало бы проблему довольно скучной). Я также не уверен, что вы подразумеваете под векторами 'p1' и' p2'. –

+0

Да, я имею в виду кривые, спасибо. Я постараюсь сделать снимок. Векторы - это точки на кривых. Когда вы оцениваете 'f1' с' t1', идущим от 0.0 до 1.0, вы получаете векторы к точкам на кривой. – alain

+0

Кривые не могут быть выпуклыми. Проблемы могут. И независимо от того, является ли ваш выпуклый, зависит от кривых. Вы знаете что-нибудь о них? –

ответ

1

Проблема заключается в том, чтобы найти минимум z на 3-мерном участке площадью 0<=x<=1 и 0<=y<=1. В этом случае z является ошибкой | и x - t1, y - t2.

Вместо того, чтобы использовать |f1(t1) - f2(t2)|, предложите z= pow(f1(t1) - f2(t2),2) для более плавных характеристик и ищите минимум.

Поскольку характеристики f1(t1) и f2(t2), похоже, не сильно контролируется, предложить бинарный поиск в 2-х измерениях, как

https://stackoverflow.com/a/6910155/2410359 или
https://stackoverflow.com/a/6909573/2410359

+0

Приведенные чертежи OP могут иметь несколько решений. – chux

+0

Спасибо +1. Я думал, что должно быть только 1 кратчайшее расстояние, почему вы говорите, что может быть несколько решений? – alain

+0

@alain Рассмотрим 2 кривых с двумя животами, обращенными друг к другу. Теперь сдвиньте их ближе, пока они не пересекаются. Если они скользят еще дальше, происходит несколько пересечений (с расстоянием 0). Это запрещено? По-прежнему звучит как 2 кривые с их ложными «лицом» друг к другу - они просто перекрываются. – chux

2

Если ваши кривые гладкие, вы можете попробовать с помощью аппроксимируя их круговыми дугами. Это делается точками отбора проб по кривой и проверяет, находятся ли промежуточные точки ближе, чем заданный допуск к дуге окружности, которую они образуют. (Это обобщенный подход к «сглаживанию кривой», вы делаете это рекурсивно).

Если допустимость допустима, количество дуг будет довольно умеренным (обычно 10-20), и вы можете полностью проверить расстояния дуги/дуги.

Поиск «ПРИБЛИЖЕНИЕ КУБИЧЕСКОЙ КРИВОЙ БИЗНЕСА С ЦИРКУЛЯРНЫМИ АРКСАМИ И ВИЦЕ-ВЕРСА», чтобы получить вдохновение.


Для наглядности, участки ниже три дискретизаций на кривой Лиссажу, с допусками 2, 0,5 и 0,125 соответственно (за 21, 31 и 50 дуг).

enter image description here Сравните с теми же кривыми с уплощением (те же допуски, 58, 120 и 248 сегментов линии).

enter image description here

+0

Это очень умная идея, о которой я никогда бы не подумал! Это выглядит относительно легко, и я думаю, что это тоже должно сходиться довольно быстро. Благодаря! – alain

+0

Да, сглаживание относительно хорошо при приближении к гладким функциям; аппроксимируя дугами («изгиб»?) является более высоким порядком и еще точнее. Я подозреваю, что можно избежать исчерпывающего сравнения всех дуг (связанная проблема - это пары ближайших соседей), но это совсем не выглядит просто. –

Смежные вопросы