www.gusucode.com > 高等数学问题求解源码程序 > CH12/TangentPlaneNormLine.m
function n=TangentPlaneNormLine(F,M) %TANGENTPLANENORMLINE 绘制曲面上某点处的切平面和法线 % TANGENTPLANENORMLINE(F,M0) 绘制曲面F在M0上的法线和切平面 % N=TANGENTPLANENORMLINE(F,M0) 绘制曲面F在M0上的法线和切平面,并返回切平面的法向量 % % 输入参数: % ---F:曲面方程的符号表达式 % ---M0:曲面上的一点 % 输出参数: % ---N:切平面的法向量 % % See also TangentNormPlane if ~isa(F,'sym') error('F must a Symbolic function.') end x0=M(1); y0=M(2); z0=M(3); dFx0=subs(diff(F,'x'),{'x','y','z'},num2cell(M)); dFy0=subs(diff(F,'y'),{'x','y','z'},num2cell(M)); dFz0=subs(diff(F,'z'),{'x','y','z'},num2cell(M)); if ~ishold hold on end x_Lim=xlim; t=linspace(0,diff(x_Lim)/5); plot3(x0+dFx0*t,y0+dFy0*t,z0+dFz0*t,'b','LineWidth',2) if dFx0~=0 y=ylim; z=zlim; [Y,Z]=meshgrid(linspace(y(1),y(2)),linspace(z(1),z(2))); X=x0-(dFy0*(Y-y0)+dFz0*(Z-z0))/dFx0; elseif dFy0~=0 x=xlim; z=zlim; [X,Z]=meshgrid(linspace(x(1),x(2)),linspace(z(1),z(2))); Y=y0-(dFx0*(X-x0)+dFz0*(Z-z0))/dFy0; else x=xlim; y=ylim; [X,Y]=meshgrid(linspace(x(1),x(2)),linspace(y(1),y(2))); Z=z0-(dFx0*(X-x0)+dFy0*(Y-y0))/dFz0; end surf(X,Y,Z) shading interp alpha(0.75) if nargout>0 n=[dFx0,dFy0,dFz0]; end web -broswer http://www.ilovematlab.cn/forum-221-1.html