这一题是已知两个端点以及控制点与端点的斜率和经过的一点。其实也就是要求出两个控制点。这一题很显然已知端点与控制点有垂直切线,所以可得到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