Удобно, что в Википедии даже показан градиент для квадратичной кривой Безье , определяемой P_0, P_1, P_2, поэтому нам даже не нужно его вычислять.
Итак, если у нас есть 2 кривые, определенные с помощью B_1 (t) и B_2 (t), и мы хотим знать местоположение на кривой B_2 (t), которое имеет ту же касательную, что и, например, B_1 (0.5).Нам нужно только найти t такой, что B_1 '(0.5) = B_2' (t).Поскольку градиент представляет собой линейное уравнение, решить это равенство тривиально.
edit: это такой крутой вопрос, мне пришлось написать код:)
Рассмотрим этот рисунок:
B = @(t,p0,p1,p2)((1-t)*((1-t)*p0 + t*p1) + t*((1-t)*p1 + t*p2))
C = @(t,p0,p1,p2)(2*(1-t)*(p1-p0) + 2*t*(p2-p1));
p0 = [1;2];
p1 = [3;5];
p2 = [6;-1];
X = [];
for t=0:0.05:1
X = [X B(t,p0,p1,p2)];
end
q0 = [2;0];
q1 = [4;7];
q2 = [5;0];
Y = [];
for t=0:0.05:1
Y = [Y B(t,q0,q1,q2)];
end
figure(1)
clf;
hold on;
plot([p0(1) p1(1) p2(1)], [p0(2) p1(2) p2(2)], 'ro:')
plot(X(1,:), X(2,:), 'g-');
plot([q0(1) q1(1) q2(1)], [q0(2) q1(2) q2(2)], 'bo:')
plot(Y(1,:), Y(2,:), 'm-');
% Consider: t = 0.2
% Note: B(0.2,p0,p1,p2) = [1.84; 2.84]
% C(0.2,p0,p1,p2) = [4.4; 2.4]
%
% 2*(1-t)*([4;7] - [2;0]) + 2*t*([5;0]-[4;7]) = [4-2*t; 14-28*t]
% (4-2*t)/(14-28*t) = 4.4/2.4
% 9.6 - 4.8t = 61.6 - 123.2t
% 118.4t - 52 = 0
% t = 0.439
%
% B(0.439,q0,q1,q2) = [3.56; 3.45]
plot([1.84, 3.56], [2.84, 3.45], 'ks--')
Это код Matlab, надеюсь, он несколько понятен, если вы не используете Matlab, просто обратите внимание, что векторы столбцов обозначаются как [a; b; c; d; ...].Поэтому я определяю 2 кривые с точками p0, p1, p2 и q0, q1, q2, затем создаю функцию для вычисления Безье (B) и градиента (C).Затем я строю кривые и рассматриваю касательную при t = 0,2. Надеюсь, оставшаяся математика ясна, но если нет, просто задайте вопрос.
Также обратите внимание, что мы не решаем, чтобы градиенты были равныкак я изначально сказал!Вместо этого нам нужно найти градиент, который имеет такое же соотношение х / у.А если нет решения, то нет места, где касательные равны.