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度時,距原點不同距離的投影...