2014-11-22 272 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連續性。

順便說一句,在你的貼子代碼中,你使用了factorial()來評估Bezier曲線上的點。這是不推薦的,因爲階乘(N)可能成爲具有更高階貝塞爾曲線的非常大的數字。您應該使用de Castejlau算法。

+0

在數學方面,更難。在編程方面,C1/C2實際上非常簡單:只需要​​從上一個曲線的第三和第四個點計算矢量(dx,dy),然後將新節段的第一個控制點對齊或更容易允許用戶提供第一個控制點在通過前一曲線的第三和第四點的線上,只允許最後兩個座標是「空閒的」。 – 2014-11-24 17:26:29