Ближайшая точка на квадратичной кривой Безье - PullRequest
3 голосов
/ 26 июля 2011

У меня проблемы с вычислением ближайшей точки на квадратичной кривой к положению мыши. Я попробовал несколько API, но мне не повезло найти функцию для этого, которая работает. Я нашел реализацию, которая работает для кубических кривых Безье 5-й степени, но у меня нет математических навыков, чтобы преобразовать ее в квадратичную кривую. Я нашел несколько методов, которые помогут мне решить проблему, если у меня есть значение t, но я не знаю, как начать поиск t. Если бы кто-то мог указать мне алгоритм нахождения t или некоторый пример кода для нахождения ближайшей точки на квадратичной кривой к произвольной точке, я был бы очень благодарен.

Спасибо

Ответы [ 3 ]

1 голос
/ 26 июля 2011

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

(x(t), y(t)) = (a_x + b_x t + c_x t^2, a_y + b_y t + c_y t^2),

, где 0 < t < 1. A, b, c - это 6 констант, которые определяют кривую.

Требуется расстояние до (X, Y):

sqrt( (X - x(t))^2 + (Y - y(t))^2  )

Поскольку вы хотите найти t, который минимизирует указанное выше количество, вы берете его первая производная относительно t и установите ее равной 0. Это дает вам (отбрасывая sqrt и коэффициент 2):

0 = (a_x - X + b_x t + c_x t^2) (b_x + 2 c-x t) + (a_y - Y + b_y t + c_y t^2) ( b_y + 2 c_y t) 

, которое является кубическим уравнением в t. Аналитическое решение известно, и вы можете найти его в Интернете; вам, вероятно, понадобится немного алгебры, чтобы собрать коэффициенты степеней t вместе (т. е. 0 = a + b t + c t ^ 2 + d t ^ 3). Вместо этого вы также можете решить это уравнение численно, используя, например, Ньютона-Рафсона.

Обратите внимание, что, если ни одно из 3 решений не может быть в вашем диапазоне 0 < t < 1. В этом случае просто вычислите значения расстояния до (X, Y) (первое уравнение) в t = 0 и t = 1 и возьмите наименьшее расстояние из двух.

EDIT
фактически, когда вы решаете первую производную = 0, решения, которые вы получаете, могут быть как максимальными, так и минимальными расстояниями. Поэтому вы должны вычислить расстояние (первое уравнение) для решений, которые вы получите (не более 3 значений t), а также расстояния в t=0 и t=1 и выбрать фактический минимум всех этих значений.

0 голосов
/ 26 июля 2011

Существует реализация ActionScript, которую можно легко адаптировать к Java, доступная онлайн здесь .

Он основан на алгоритме из книги «Графические жемчужины», который вы можете просмотреть в Google Книгах здесь .

0 голосов
/ 26 июля 2011

Глупым, наивным способом было бы перебрать каждую точку кривой и вычислить расстояние между этой точкой и положением мыши, причем наименьшая из них является победителем. Возможно, вам придется пойти с чем-то лучше, чем это, хотя в зависимости от вашего приложения.

...