资源描述:
《matlab期末作业 李家兴20131336013》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Matlab基础及应用教程期末作业学号20131336013姓名李家兴一、M文件及注释用Matlab绘制管状几何体利用MATLAB绘制管状几何体,所谓管状几何体就是中空的像水管一样的几何体。MATLAB函数TubeLike,可以根据管道中心线坐标及各点处管道半径绘制管状几何体。程序M文件function[X,Y,Z]=TubeLike(x,y,z,r)%绘制三维管道型立体%TubeLike(x,y,z)绘制三维管道型几何体,输入参数x,y,z分别为管道中心线各点处%的坐标,x,y和z应为等长的向量,此时管道具有统一
2、的半径1.%%TubeLike(x,y,z,r)输入参数r用来指定管道半径。r可以是标量,也可以是与x,y,z等%长的向量。当r是标量时,管道具有统一半径;当r是向量时,管道%各截面处可以有不同的半径。%%TubeLike(x)输入参数x为3行或3列的矩阵,用来指定管道中心线各点处的坐标,%此时管道具有统一的半径1.%%TubeLike(x,r)输入参数x为3行或3列的矩阵,用来指定管道中心线各点处的坐标,%输入参数r(标量或向量)用来指定管道半径。%%[X,Y,Z]=TubeLike(...)输出三维管道型几何体
3、的网格数据X,Y和Z.%%Example:%t=linspace(0,2*pi,50);%x=sin(t);%y=cos(t);%z=cos(t/2);%r=sin(t);%TubeLike(x,y,z,r)ifnargin>=1&&nargin<=2%检查数据维数是否正确[m,n]=size(x);p=min(m,n);%维数ifp~=3error('应输入三维样本数据,并且样本容量应大于3');end%把样本观测值矩阵转置,使得行对应变量,列对应观测ifm>=nx=x';endyd=x(2,:);zd=x(3,
4、:);xd=x(1,:);ifnargin==1r=ones(size(xd));elseifisvector(y)ifnumel(y)==1r=y*ones(size(xd));elseifnumel(y)>1&&numel(y)==length(xd)r=y(:)';elseerror('半径应为标量或与x等长的向量');endelseerror('半径应为标量或与x等长的向量');endendelseifnargin>=3&&nargin<=4ifisvector(x)&&isvector(y)&&isvec
5、tor(z)numxyz=[numel(x),numel(y),numel(z)];ifany(numxyz-min(numxyz))error('管道中心坐标x,y,z应为等长的向量');elsexd=x(:)';yd=y(:)';zd=z(:)';endelseerror('管道中心坐标x,y,z应为等长的向量');endifnargin==3r=ones(size(xd));elseifisvector(r)ifnumel(r)==1r=r*ones(size(xd));elseifnumel(r)>1&&n
6、umel(r)==length(xd)r=r(:)';elseerror('半径应为标量或与x等长的向量');endelseerror('半径应为标量或与x等长的向量');endendelseerror('至少需要1个输入参数,至多需要4个输入参数');endt=linspace(0,2*pi,30)';%角度向量%x的一阶差分dx=diff(xd);dx=[dx(end)dx];%y的一阶差分dy=diff(yd);dy=[dy(end)dy];%z的一阶差分dz=diff(zd);dz=[dz(end)dz];
7、%计算法线与y轴正向夹角余弦,法线与y轴正向夹角正弦负值den1=sqrt(dx.^2+dy.^2);cy=dy./den1;cy(den1==0)=1;sy=-dx./den1;sy(den1==0)=0;%计算法线与z轴正向夹角余弦,法线与z轴正向夹角正弦负值den2=sqrt(dx.^2+dy.^2+dz.^2);cz=dz./den2;cz(den2==0)=1;sz=-sqrt(dx.^2+dy.^2)./den2;sz(den2==0)=0;OneMat=ones(numel(t),1);%1向量%管道
8、中心线坐标矩阵Xcenter=OneMat*xd;Ycenter=OneMat*yd;Zcenter=OneMat*zd;%单位圆坐标数据x0=cos(t);y0=sin(t);%计算三维管道型几何体的网格数据X,Y和ZXgrid=Xcenter+x0*(r.*cy)-y0*(r.*cz.*sy);Ygrid=Ycenter+x0*(r.*sy)+y0*(r