www.gusucode.com > 高等数学问题求解源码程序 > CH11/quadric.m

    function varargout=quadric(varargin)
%QUADRIC   绘制二次曲面
% QUADRIC('elliptic',XC,YC,ZC,A,B,N)  绘制椭圆锥面
% QUADRIC('ellipsoid',XC,YC,ZC,A,B,C,N)  绘制椭球面
% QUADRIC('hyperboloidofonesheet',XC,YC,ZC,A,B,C,N)  绘制单叶双曲面
% QUADRIC('hyperboloidoftwosheets',XC,YC,ZC,A,B,C,N)  绘制双叶双曲面
% QUADRIC('ellipticparaboloid',XC,YC,ZC,A,B,N)  绘制椭圆抛物面
% QUADRIC('hyperbolicparaboloid',A,B,N)  绘制双曲抛物面
% H=QUADRIC(...)  绘制二次曲面并返回其句柄
% [X,Y,Z]=QUADRIC(...)  计算二次曲面的坐标数据
%
% 输入参数:
%     ---XC,YC,ZC:二次曲面的中心坐标
%     ---A,B,C:二次曲面的参数
%     ---N:指定采样点数
%     ---TYPE:指定二次曲面类型,有上述6种取值
% 输出参数:
%     ---H:二次曲面的句柄
%     ---X,Y,Z:二次曲面的坐标数据
%
% See also cylinder, ellipsoid

args=varargin;
type=args{1};
switch lower(type)
    case {1,'elliptic','椭圆锥面'}
        [xc,yc,zc,a,b,n]=deal(args{2:end});
        z=linspace(-a,a);
        [X,Y,Z]=cylinder(a*z,n);
        X=X+xc;
        Y=b/a*Y+yc;
        Z=-a+2*a*Z+zc;
    case {2,'ellipsoid','椭球面'}
        [xc,yc,zc,a,b,c,n]=deal(args{2:end});
        [X,Y,Z]=ellipsoid(xc,yc,zc,a,b,c,n);
    case {3,'hyperboloidofonesheet','单叶双曲面'}
        % 参数方程:
        % x=a*sec(t)*cos(p)
        % y=b*sec(t)*sin(p)
        % z=c*tan(t)
        [xc,yc,zc,a,b,c,n]=deal(args{2:end});
        t=linspace(-pi/2.5,pi/2.5,n);
        p=linspace(-pi,pi,30);
        [T,P]=meshgrid(t,p);
        X=a*sec(T).*cos(P)+xc;
        Y=b*sec(T).*sin(P)+yc;
        Z=c*tan(T)+zc;
    case {4,'hyperboloidoftwosheets','双叶双曲面'}
        [xc,yc,zc,a,b,c,n]=deal(args{2:end});
        t=linspace(-pi/2.5,pi/2.5,n);
        p=linspace(-pi,pi,30);
        [T,P]=meshgrid(t,p);
        X=a*sec(T)+xc;
        Y=b*tan(T).*cos(P)+yc;
        Z=c*tan(T).*sin(P)+zc;
    case {5,'ellipticparaboloid','椭圆抛物面'}
        [xc,yc,zc,a,b,n]=deal(args{2:end});
        z=linspace(0,abs(a));
        [X,Y,Z]=cylinder(abs(a)*sqrt(z),n);
        X=X+xc;
        Y=b/a*Y+yc;
        Z=Z+zc;
    case {6,'hyperbolicparaboloid','双曲抛物面'}
        [a,b,n]=deal(args{2:end});
        x=linspace(-a^2, a^2,n);
        y=linspace(-b^2, b^2,n);
        [X,Y]=meshgrid(x,y);
        Z=X.^2/a^2-Y.^2/b^2;
end
if nargout==0
    surf(X,Y,Z)
elseif nargout==1
    h=surf(X,Y,Z);
    varargout{1}=h;
elseif nargout==3
    varargout{1}=X; varargout{2}=Y; varargout{3}=Z;
else
    error('The Number of output arguments is wrong.')
end
web -broswer http://www.ilovematlab.cn/forum-221-1.html