天天看點

Matlab之貝塞爾曲線的逆應用

    這一題是已知兩個端點以及控制點與端點的斜率和經過的一點。其實也就是要求出兩個控制點。這一題很顯然已知端點與控制點有垂直切線,是以可得到x2 = -1, x3 = 1。這樣就可以把x(t)表示出來了。對于求y(t)的表達式我用到了對稱性,是以y2 = y3。然後再用已知點求出x(t)中t的值代入y(t)便可求出y2與y3。這一題便解決了。這一題要注意的是畫圖的時候不能有變量,必須是确定的。是以可以看到我後面又有指派的過程。之前顯示變量是為了看到貝塞爾方程。

% function 183 1

% given two endpoints(-1,0),(1,0) and a passed point(0,1) to calculate

% Bezier spline

% author:ChenYu

% ID number:12353032

% Input :None

% Output:A picture.

function page_183_1_Bezier_spline

x1 = -1;

x2 = -1;

x3 =  1;

x4 =  1;

y1 =  0;

y4 =  0;

x5 =  0;

y5 =  1;

bx = 3*(x2 - x1);

cx = 3*(x3 - x2) - bx;

dx = x4 - x1 - bx -cx;

syms t;

disp('x關于t的表達式');

x = x1 + bx*t + cx*t*t + dx*(t^3)      %得出x關于t的表達式

result1 = solve(x1 + bx*t + cx*t*t + dx*(t^3),'t');%找出經過(0,1)時若x = 0時t的值

for i = 1:3

   if result1(i) >= 0&&result1(i) <=1

      t0 = result1(i);

   end

end

syms y2 y3

%因為我們可以發現(0,1)在兩個定端點的垂直平分線上,是以我們可以得出y2 = y3

y2 = y3;

by = (3*(y2 - y1));

cy = (3*(y3 - y2) - by);

dy = (y4 - y1 - by -cy);

ty = solve(y1 + by*t0 + cy*t0*t0 + dy*(t0^3)-1);%得出x = 0,得到的t帶入,求得y2

disp('y關于t的表達式');

y  = y1 + subs(by,ty)*t + (subs(cy,ty))*t*t + subs(dy,ty)*(t^3)     %得出y關于t的表達式

tp = 0:0.001:1;

xp = x1 + bx.*tp + cx.*tp.*tp + dx.*(tp.*tp.*tp);

yp = y1 + subs(by,ty).*tp + (subs(cy,ty)).*tp.*tp + subs(dy,ty).*(tp.*tp.*tp);

plot(xp,yp);

最後結果(圖發現黏貼不上來):

page_183_1_Bezier_spline

x關于t的表達式

x =

- 4*t^3 + 6*t^2 - 1

y關于t的表達式

y =

- 4*t^2 + 4*t

繼續閱讀