Я могу начать с математики.
Я не уверен, как определяется квадратичный Безье, но он должен быть эквивалентным
для:
(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
и выбрать фактический минимум всех этих значений.