gusucode.com > 高等数学问题求解源码程序 > CH12/TangentNormPlane.m

    function n=TangentNormPlane(funx,funy,funz,t0,trange)
%TANGENTNORMPLANE   绘制空间曲线在某点处的切线和法平面
% TANGENTNORMPLANE(FUNX,FUNY,FUNZ,T0)  绘制空间曲线在[FUNX(T0),FUNY(T0),FUNZ(T0)]
%                                      处的切线和法平面,自变量范围为[0,2*pi]
% TANGENTNORMPLANE(FUNX,FUNY,FUNZ,T0,TRANGE)  绘制空间曲线在[FUNX(T0),FUNY(T0),FUNZ(T0)]
%                                      处的切线和法平面,自变量范围为TRANGE
% N=TANGENTNORMPLANE(...)  绘制空间曲线在某点处的切线和法平面,并返回法向量
%
% 输入参数:
%     ---FUNX,FUNY,FUNZ:空间曲线的参数方程
%     ---T0:参数方程自变量的值
%     ---TRANGE:指定绘图范围
% 输出参数:
%     ---N:平面的法向量
%
% See also diff

if nargin==4
    trange=[0,2*pi];
end
if prod(t0-trange)>0
    error('t0 must in the interval trange.')
end
if ~isa(funx,'sym') || ~isa(funy,'sym') || ~isa(funz,'sym')
    error('FUNX,FUNY,FUNZ must be Symbolic functions.')
end
s=unique([symvar(funx),symvar(funy),symvar(funz)]);
if length(s)>1
    error('Too many Symbolic variables.')
end
x0=subs(funx,t0);
y0=subs(funy,t0);
z0=subs(funz,t0);
dfunx0=subs(diff(funx),t0);
dfuny0=subs(diff(funy),t0);
dfunz0=subs(diff(funz),t0);
t=linspace(trange(1),trange(2));
plot3(subs(funx,t),subs(funy,t),subs(funz,t),'k')
hold on
plot3(x0+dfunx0*t,y0+dfuny0*t,z0+dfunz0*t,'b','LineWidth',2)
if dfunx0~=0
    y=ylim; z=zlim;
    [Y,Z]=meshgrid(linspace(y(1),y(2)),linspace(z(1),z(2)));
    X=x0-(dfuny0*(Y-y0)+dfunz0*(Z-z0))/dfunx0;
elseif dfuny0~=0
    x=xlim; z=zlim;
    [X,Z]=meshgrid(linspace(x(1),x(2)),linspace(z(1),z(2)));
    Y=y0-(dfunx0*(X-x0)+dfunz0*(Z-z0))/dfuny0;
else
    x=xlim; y=ylim;
    [X,Y]=meshgrid(linspace(x(1),x(2)),linspace(y(1),y(2)));
    Z=z0-(dfunx0*(X-x0)+dfuy0*(Y-y0))/dfunz0;
end
surf(X,Y,Z)
shading interp
alpha(0.75)
if nargout>0
    n=[dfunx0,dfuny0,dfunz0];
end
web -broswer http://www.ilovematlab.cn/forum-221-1.html