如何用matlab畫出空心圓柱體

時間 2021-10-15 00:00:54

1樓:真

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];

endend

endend

curve=squeeze(curve);

assert(ismatrix(curve),'引數1格式錯誤!請看幫助!');

if size(curve,2)~=3

curve=curve.';

endassert(size(curve,2)==3,'引數1格式錯誤!請看幫助!');

direct=squeeze(direct);

if isempty(direct)

direct=[0,0,1];

endassert(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))];

enddirect=direct/norm(direct);

point=squeeze(point);

if isempty(point)

point=[0 0 0];

endassert(numel(point)==3,'引數3格式錯誤!請看幫助!');

theta=squeeze(theta);

if isempty(theta)

theta=linspace(0,2*pi,37);

endassert(length(theta)==numel(theta) ,'引數4格式錯誤!請看幫助!');

f=squeeze(f);

if isempty(f)

f=@mesh;

endif ischar(f)

assert(length(f)==numel(f),'引數5格式錯誤!請看幫助!');

f=str2func(f);

endassert(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;

endfunction 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];

endend

endend

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];

endassert(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))];

enddirect=direct/norm(direct);

point=squeeze(point);

if isempty(point)

point=[0 0 0];

endassert(numel(point)==3,'引數5格式錯誤!請看幫助!');

theta=squeeze(theta);

if isempty(theta)

theta=linspace(0,2*pi,37);

endassert(length(theta)==numel(theta) ,'引數6格式錯誤!請看幫助!');

f=squeeze(f);

if isempty(f)

f=@mesh;

endif ischar(f)

assert(length(f)==numel(f),'引數7格式錯誤!請看幫助!');

f=str2func(f);

endassert(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;

endclear;clc

x=[0.03 0.05];

z=linspace(0,3,10);

[x,z]=meshgrid(x,z);

rotmesh(x,x-x,z)

如何用matlab的plot命令畫出ysin1的圖形

墨汁諾 x 1 0.02 1 plot x,sin 1.x 語句中的點代表對於元素相除,除0並不是錯誤,僅僅是內部資料溢位而已,可以不用管。x 0 0.1 10 y sin x plot x,y 例如 根據已知函式可知,在x 0處有間斷點,所以繪製該函式圖形,應避開該間斷點。圖形實現 如下 x 10...

如何用matlab求逆矩陣,如何用MATLAB求逆矩陣

白鯨 第一步 啟動matlab。第二步 輸入 clear 和 clc 清屏 第三步 根據你的需求設定一個矩陣。圖中示例設定為矩陣a 1 2 3 4 a 可以定義為你需要的任何字母 第四步 用 b inv a b 可以定義為你需要的其他字母,inv 裡的字母為你需要求逆的矩陣。第五步 驗證自己求解的逆...

請問如何用MATLAB實現radon變換

day忘不掉的痛 例子如下 r radon im,30 im是影象矩陣解決方法如下 radon 變換是平行束對影象的線積分,根據各個角度得到的一系列投影值逆radon重建得到原始影象。變換角度預設是逆時針,r radon im,30 得到的是一維陣列。平行束與x軸夾角為30度時,距原點不同距離的投影...