2014-11-22 5 views
0

Пользователь должен ввести N количество контрольных точек, по которым кривая Безье является графиком. После этого пользователь снова вводит число P контрольных точек, а затем используя последнюю точку первой кривой и недавно введенные контрольные точки, с ней смешивается другая кривая Безье, которая должна быть непрерывной с первой кривой. Я использую следующее для построения кривых, но не могу проверить непрерывность. Пожалуйста помоги.Непрерывная кривая Безье в matlab

N=input('enter the number of control points '); 
for (i=1:N) 
    P(i,:)=input('enter the coordinates of point [x y]'); 
end 

K=input('enter the number of points to plot '); 
syms u 
Px=0; 
Py=0; 

for(i=1:N) 
    b=(factorial(N-1)/factorial(N-1-i+1)/factorial(i-1))*(u^(i-1))*(1-u)^(N-1-i+1); 
    Px= Px+ b*P(i,1); 
    Py= Py+ b*P(i,2); 
end 

for(i=1:K+1) 
    Rx(i)=subs(Px,u,(i-1)/K); 
    Ry(i)=subs(Py,u,(i-1)/K); 
end 
plot(Rx,Ry) 
axis equal 

ответ

1

Позвольте мне взять на себя первый набор точек Q (0), Q (1), ... Q (N-1) и второй набор точек R (0), R (1), ..., R (P-1) для более простого обсуждения следующего. Поскольку две кривые Безье уже имеют одну и ту же точку Q (N-1) в качестве контрольной точки, они будут непрерывными G0. Если вы хотите, чтобы две кривые Безье имели непрерывность C1 или даже C2, вам необходимо обеспечить определенную связь между точками управления этих двух кривых Безье. Для достижения непрерывности C1, необходимо, чтобы убедиться, что

Q (N-1) - Q (N-2) = R (0) - Q (N-1)

Для достижения непрерывности C2, вы также необходимо убедиться, что

Q (N-1) - 2 * Q (N-2) + Q (N-3) = R (1) - 2 * R (0) + Q (N-1)

Обратите внимание, что вышеприведенные уравнения предназначены для обеспечения непрерывности C1/C2. Для двух кривых Безье, которые выглядят «плавно подключенными», вам нужно только обеспечить непрерывность G1/G2, что не ограничивает непрерывность C1/C2, но их немного сложнее вычислить. Например, вам нужно только убедиться, что Q (N-1), Q (N-2) и R (0) являются коллинеарными для обеспечения непрерывности G1.

Кстати, в ваших опубликованных кодах matlab вы использовали factorial() для оценки точек на кривой Безье. Это не рекомендуется, поскольку факторный (N) может стать очень большим числом с кривыми Безье с более высокой степенью. Вместо этого вы должны использовать алгоритм Casthejlau.

+0

с точки зрения математики, сложнее. С точки зрения программирования, C1/C2 на самом деле довольно прост: все, что требуется, - это вычисление вектора (dx, dy) из третьей и четвертой точек предыдущей кривой, а затем выравнивание первой контрольной точки нового сегмента к ней или, проще говоря, только позволяя пользователю обеспечить первую контрольную точку как находящуюся на линии, которая проходит третью и четвертую точку предыдущей кривой, только позволяя двум последним координатам быть «свободными». –

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