感悟网 导航

如何用matlab画出空心圆柱体 如何用matlab画一个三维的圆柱体

作者&投稿:郎放 (若有异议请与网页底部的电邮联系)
怎样用matlab画水平实心圆柱体,已知圆~

我在网上找了个demo,稍作修改,,跑了一下没问题,你做个参考:
%圆的半径为R,圆柱高度为HR=2;H=3[a,z]=ndgrid((0:.05:1)*2*pi,0:.05*H:H);x=R*cos(a);y=R*sin(a);surf(x,y,z,x*0)hold on[a,r]=ndgrid((0:.05:1)*2*pi,[0 R]);x=cos(a).*r;y=sin(a).*r;surf(x,y,x*0,x*0)surf(x,y,x*0+H,x*0)希望对你有帮助。

R=1;%半径h=0.5;%圆柱高度m=100;%分割线的条数[x,y,z]=cylinder(R,m);%创建以(0,0)为圆心,高度为[0,1],半径为R的圆柱z=h*z;%高度放大h倍mesh(x,y,z)%重新绘图

function h=rotsurf(curve,direct,point,theta,f)
% rotsurf(curve,dirct,orgin,alpha,fun)用于绘制旋转曲面
%   curve=[x,y,z]为母线,其中x,y,z为列向量,分别代表母线的三维坐标
%   direct和origin分别代表旋转轴的方向和该旋转轴上的任意一点的坐标,这两个参数合起来确定了一条直线,即旋转轴,其中:
%       direct表示旋转轴的方向,有两种表示法[theta,phi]或[x0,y0,z0],其中:
%           theta代表沿xoy平面从x轴正方向逆时针旋转的弧度,phi代表从xoy平面向z轴正方向旋转的弧度
%           [x0,y0,z0]代表方向向量
%           direct默认为[0 0 1],即z轴方向
%       origin=[xo,yo,zo]为该旋转轴上的任意一点坐标,默认为[0 0 0]即原点
%   向量alpha为旋转的弧度,默认为0:pi/18:2*pi,采样点的范围和密度都可以手动控制
%   fun为绘图函数句柄,默认为@mesh
% h=rotsurf(...)
%  绘制曲面的同时返回该曲面的句柄h
%
%例1:绘制母线为x=0,y^2+z^2=1,旋转轴为x=1,z=-y-2的圆环
%t=linspace(-pi,pi,37).'; 
%y=sin(t);z=cos(t);x=y-y; 
%rotsurf([x,y,z],[0 -1 1],[1 -2 0],[],@surf) 
%xlabel('x');ylabel('y');zlabel('z');axis equal
%例2:绘制母线为z=x,y=1,旋转轴为z轴的单叶双曲面
% t=linspace(-pi,pi,37).'; 
% x=t;y=t-t+1;z=t;
% rotsurf([x y z]) 
% xlabel('x');ylabel('y');zlabel('z');axis equal
assert(nargin>=1 && nargin<=5,'参数个数错误!请看帮助!');
if nargin<5
    f=@mesh;
    if nargin<4
        theta=linspace(0,2*pi,37);
        if nargin<3
            point=[0,0,0];
            if nargin<2
                direct=[0,0,1];
            end
        end
    end
end
curve=squeeze(curve);
assert(ismatrix(curve),'参数1格式错误!请看帮助!');
if size(curve,2)~=3
    curve=curve.';
end
assert(size(curve,2)==3,'参数1格式错误!请看帮助!');
direct=squeeze(direct);
if isempty(direct)
    direct=[0,0,1];
end
assert(numel(direct)==2 || numel(direct)==3,'参数2格式错误!请看帮助!');
if numel(direct)==2
    direct=[cos(direct(2))*cos(direct(1)),cos(direct(2))*sin(direct(1)),sin(direct(2))];
end
direct=direct/norm(direct);
point=squeeze(point);
if isempty(point)
    point=[0 0 0];
end
assert(numel(point)==3,'参数3格式错误!请看帮助!');
theta=squeeze(theta);
if isempty(theta)
    theta=linspace(0,2*pi,37);
end
assert(length(theta)==numel(theta) ,'参数4格式错误!请看帮助!');
f=squeeze(f);
if isempty(f)
    f=@mesh;
end
if ischar(f)
    assert(length(f)==numel(f),'参数5格式错误!请看帮助!');
    f=str2func(f);
end
assert(numel(f)==1 && isa(f,'function_handle'),'参数5格式错误!请看帮助!');
x0=point(1);
y0=point(2);
z0=point(3);
x=curve(:,1);
y=curve(:,2);
z=curve(:,3);
nx=direct(1);
ny=direct(2);
nz=direct(3);
[X,~]=meshgrid(x,theta);
[Y,~]=meshgrid(y,theta);
[Z,T]=meshgrid(z,theta);
sint=sin(T);
cost=cos(T);
XX=(X-x0).*(nx^2*(1-cost)+cost)+(Y-y0).*(nx*ny*(1-cost)-nz*sint)+(Z-z0).*(nx*nz*(1-cost)+ny*sint)+x0;
YY=(X-x0).*(ny*nx*(1-cost)+nz*sint)+(Y-y0).*(ny^2*(1-cost)+cost)+(Z-z0).*(ny*nz*(1-cost)-nx*sint)+y0;
ZZ=(X-x0).*(nz*nx*(1-cost)-ny*sint)+(Y-y0).*(nz*ny*(1-cost)+nx*sint)+(Z-z0).*(nz^2*(1-cost)+cost)+z0;
hh=f(XX,YY,ZZ);
if nargout==1
    h=hh;
end
function h=rotmesh(X,Y,Z,direct,point,theta,f)
% rotmesh(X,Y,Z,dirct,orgin,alpha,fun)用于绘制旋转体
%   X,Y,Z为二维矩阵,分别代表母面的三维坐标,大小必须相同
%   direct和origin分别代表旋转轴的方向和该旋转轴上的任意一点的坐标,这两个参数合起来确定了一条直线,即旋转轴,其中:
%       direct表示旋转轴的方向,有两种表示法[theta,phi]或[x0,y0,z0],其中:
%           theta代表沿xoy平面从x轴正方向逆时针旋转的弧度,phi代表从xoy平面向z轴正方向旋转的弧度
%           [x0,y0,z0]代表方向向量
%           direct默认为[0 0 1],即z轴方向
%       origin=[xo,yo,zo]为该旋转轴上的任意一点坐标,默认为[0 0 0]即原点
%   向量alpha为旋转的弧度,默认为0:pi/18:2*pi,采样点的范围和密度都可以手动控制
%   fun为绘图函数句柄,默认为@mesh
% h=rotsurf(...)
%  绘制曲面的同时返回该旋转体的句柄h,h有6个分量。分别是始面、终面、以及母面的四条外周线的旋转曲面。
%
%例1:绘制母面为由x=0,y^2+z^2=1所围成的圆及其内部,旋转轴为x=1,z=-y-2,旋转角从pi到2*pi所构成的旋转体
%t=linspace(-pi,pi,37); 
%r=linspace(0,1,5);
%[t,r]=meshgrid(t,r);
%y=r.*sin(t);z=r.*cos(t);x=y-y; 
%rotmesh(x,y,z,[0 -1 1],[1 -2 0],linspace(pi,2*pi,18)) 
%xlabel('x');ylabel('y');zlabel('z');axis equal
%例2:绘制母面为z=x,y=1、z=x,y=3、z=-pi,x=-pi、z=pi,x=pi所围平面,旋转轴为z轴,旋转角从5*pi/4到2*pi所构成的旋转体
%t=linspace(-pi,pi,37); 
%y=linspace(1,3,5);
%[t,y]=meshgrid(t,y);
%x=t;z=t;
%rotmesh(x,y,z,[],[],linspace(5*pi/4,2*pi,18),@surf) 
%xlabel('x');ylabel('y');zlabel('z');axis equal;
assert(nargin>=3 && nargin<=7,'参数个数错误!请看帮助!');
if nargin<7
    f=@mesh;
    if nargin<6
        theta=linspace(0,2*pi,37);
        if nargin<5
            point=[0,0,0];
            if nargin<4
                direct=[0,0,1];
            end
        end
    end
end
X=squeeze(X);
assert(ismatrix(X),'参数1格式错误!请看帮助!');
Y=squeeze(Y);
assert(ismatrix(Y),'参数2格式错误!请看帮助!');
Z=squeeze(Z);
assert(ismatrix(Z),'参数3格式错误!请看帮助!');
assert(all(size(X)==size(Y)&size(X)==size(Z)),'参数1/2/3大小必须相等!请看帮助!');
direct=squeeze(direct);
if isempty(direct)
    direct=[0,0,1];
end
assert(numel(direct)==2 || numel(direct)==3,'参数4格式错误!请看帮助!');
if numel(direct)==2
    direct=[cos(direct(2))*cos(direct(1)),cos(direct(2))*sin(direct(1)),sin(direct(2))];
end
direct=direct/norm(direct);
point=squeeze(point);
if isempty(point)
    point=[0 0 0];
end
assert(numel(point)==3,'参数5格式错误!请看帮助!');
theta=squeeze(theta);
if isempty(theta)
    theta=linspace(0,2*pi,37);
end
assert(length(theta)==numel(theta) ,'参数6格式错误!请看帮助!');
f=squeeze(f);
if isempty(f)
    f=@mesh;
end
if ischar(f)
    assert(length(f)==numel(f),'参数7格式错误!请看帮助!');
    f=str2func(f);
end
assert(numel(f)==1 && isa(f,'function_handle'),'参数7格式错误!请看帮助!');
x0=point(1);
y0=point(2);
z0=point(3);
nx=direct(1);
ny=direct(2);
nz=direct(3);
sint=sin(theta(1));
cost=cos(theta(1));
XX=(X-x0).*(nx^2*(1-cost)+cost)+(Y-y0).*(nx*ny*(1-cost)-nz*sint)+(Z-z0).*(nx*nz*(1-cost)+ny*sint)+x0;
YY=(X-x0).*(ny*nx*(1-cost)+nz*sint)+(Y-y0).*(ny^2*(1-cost)+cost)+(Z-z0).*(ny*nz*(1-cost)-nx*sint)+y0;
ZZ=(X-x0).*(nz*nx*(1-cost)-ny*sint)+(Y-y0).*(nz*ny*(1-cost)+nx*sint)+(Z-z0).*(nz^2*(1-cost)+cost)+z0;
hh=f(XX,YY,ZZ);
hold on;
sint=sin(theta(end));
cost=cos(theta(end));
XX=(X-x0).*(nx^2*(1-cost)+cost)+(Y-y0).*(nx*ny*(1-cost)-nz*sint)+(Z-z0).*(nx*nz*(1-cost)+ny*sint)+x0;
YY=(X-x0).*(ny*nx*(1-cost)+nz*sint)+(Y-y0).*(ny^2*(1-cost)+cost)+(Z-z0).*(ny*nz*(1-cost)-nx*sint)+y0;
ZZ=(X-x0).*(nz*nx*(1-cost)-ny*sint)+(Y-y0).*(nz*ny*(1-cost)+nx*sint)+(Z-z0).*(nz^2*(1-cost)+cost)+z0;
g=f(XX,YY,ZZ);
hh=[hh,g];
g=rotsurf([X(:,1),Y(:,1),Z(:,1)],direct,point,theta,f);
hh=[hh,g];
g=rotsurf([X(:,end),Y(:,end),Z(:,end)],direct,point,theta,f);
hh=[hh,g];
g=rotsurf([X(1,:);Y(1,:);Z(1,:)],direct,point,theta,f);
hh=[hh,g];
g=rotsurf([X(end,:);Y(end,:);Z(end,:)],direct,point,theta,f);
hh=[hh,g];
if nargout==1
    h=hh;
end
clear;clc
x=[0.03 0.05];
z=linspace(0,3,10);
[x,z]=meshgrid(x,z);
rotmesh(x,x-x,z)



《如何用matlab画出空心圆柱体》
答:function h=rotsurf(curve,direct,point,theta,f)% rotsurf(curve,dirct,orgin,alpha,fun)用于绘制旋转曲面% curve=[x,y,z]为母线,其中x,y,z为列向量,分别代表母线的三维坐标% direct和origin分别代表旋转轴的方向和该旋转轴上的任意一点的坐标,这两个参数合起来确定了一条直线,即旋转轴...

《求教大神,matlab怎么画出圆柱体》
答:close [a,z]=ndgrid((0:.05:1)*2*pi,0:.05:1);x=cos(a);y=sin(a);surf(x,y,z,x*0)hold on [a,r]=ndgrid((0:.05:1)*2*pi,[0 1]);x=cos(a).*r;y=sin(a).*r;surf(x,y,x*0,x*0)surf(x,y,x*0+1,x*0)

《matlab里面怎么把一个立体的模型的边界控制为圆柱?》
答:在MATLAB中,可以使用cylinder函数来绘制圆柱体,并使用surf或mesh函数来绘制其表面。以下是一个示例代码,用于绘制一个半径为1的圆柱体,并使用surf函数绘制其表面1:matlabr = 1; % 圆柱体的半径 n = 20; % 圆5, 0.5, 0.5], 'LineStyle', 'none');hold on;绘制圆柱体的边界 fill3(x(1...

《如何用matlab绘制任意一个圆柱》
答:[x,y,z]=cylinder(R,m);%创建以(0,0)为圆心,高度为[0,1],半径为R的圆柱 x=x+a;%平移x轴 y=y+b;%平移y轴,改为(a,b)为底圆的圆心 z=h*z;%高度放大h倍 mesh(x,y,z)%重新绘图

《如何让用matlab绘制圆柱,使得圆柱的底面圆心坐标为(2,3),圆柱的...》
答:R=1;a=2;b=3;h=4;m=100;[x,y,z]=cylinder(R,m);x=x+a;y=y+b;z=h*z;mesh(x,y,z)参考资料:百度:Matlab中如何实现任意位置圆柱的绘制

《如何运用matlab画圆柱面》
答:把x^2+y^2=10*x化成标准型 (x-5)^2+y^2=5^2 t=0:pi/20:2*pi;x=(sin(t)+1)*5;y=cos(t)*5;z=linspace(0,5,length(t));X=meshgrid(x);Y=meshgrid(y);Z=[meshgrid(z)]';surf(X,Y,Z)xlabel('x'),ylabel('y'),zlabel('z')axis equal axis([0 10 -5 5])for...

《matlab 如何绘制三维实体圆柱!》
答:一、绘制方法:r0=2; %% radius h0=4; %% height自已调整高度 NN=20;=cylinder(r0,NN);Z=h0*Z;XX=X(2,: );YY=Y(2,: );Z1=Z(1,: );Z2=Z(2,: );in this example I draw six cylinders N=6; %自己修改数目 rotate this cylinders by Euler angles (th1,th2,th3) 自己改...

《怎么用MATLAB画圆柱体x^2+z^2=1的图形》
答:t=linspace(-pi,pi,25);y=linspace(-1,1,10);[T,Y]=meshgrid(t,y);X=sin(T);Z=cos(T);mesh(X,Y,Z);axis equal

《MATLAB 画图 圆柱面》
答:这不是圆柱面吧,应该是抛物柱面吧,用三维坐标的参数方程画图即可。大致过程是:1、设置参数s,t范围和步长 2、用meshgrid构造参数矩阵 3、x=f(s,t);y=g(s,t);z=h(s,t);4、用surf命令画图。

《如何在matlab中画圆柱体和球的截面》
答:首先要将这些N条二维曲线的x区间(即x1,x2,...)统一到一个区间里面,否则是无法将N条曲线同时显示的。然后新的3维数组是 X:对应于你的已经统一的x1, x2...Y:N条曲线 Z:曲线的数据,对应于你的y1,y2...然后plot该三维数据即可。

   

返回顶部
本页内容来自于网友发表,若有相关事宜请照下面的电邮联系
感悟网