Matlab实现三维投影绘制的示例代码

目录使用方法三维曲面投影三维曲线投影三维参数曲线投影三维参数曲面投影混合类型三维绘图投影工具函数完整代码本期带来一个三维投影绘制函数(三视图绘制),函数支持三维曲线、曲面、三维多边形、参数方程曲线、参...

本期带来一个三维投影绘制函数(三视图绘制),函数支持三维曲线、曲面、三维多边形、参数方程曲线、参数方程曲面的投影绘制,以下先给出代码使用方式,文末给出工具函数完整代码:

使用方法

通过介绍如何生成三维多边形投影介绍一下函数咋用,这里的三维多边形指的是使用patchfill3创建的图形,假设我们绘制了如下一个复杂多边形构成的球:

c=1;
d=2*c*(3*sqrt(2)+2)/7;
m=d*(3*sqrt(2)-4)/4;
l=m+d*(2-sqrt(2))/4;
t=d*(2-sqrt(2))/4;
V=[c-l-tc;t-c+lc;-t-c+lc;-c+l-tc;-c+ltc;-tc-lc;tc-lc;c-ltc;ctc-l;...
c-tc-l;c-c+lt;c-c+l-t;c-t-c+l;ct-c+l;cc-l-t;cc-lt;c-lct;c-lc-t;...
tc-c+l;-tc-c+l;-tc-l-c;tc-l-c;c-lt-c;-c+lt-c;-c+lc-t;-cc-l-t;-ct-c+l;...
-c-t-c+l;-c+l-t-c;-tcc-l;tcc-l;-c+lct;-cc-lt;-ctc-l;-c-tc-l;-c-c+lt;...
-c+l-ct;-c+l-c-t;-c-c+l-t;-t-c-c+l;-t-c+l-c;t-c+l-c;t-c-c+l;c-l-c-t;...
c-l-t-c;t-cc-l;-t-cc-l;c-l-ct];
F8=[12345678;1718192025323031;2223454241292421;...
3738404344484647;910111213141516;2627283936353433];
F6=[5630323334;3435363747;1246481110;789161731;202526272421;...
283938404129;142322191815;121345424344];
F4=[673130;11098;234746;453435;32252633;36373839;...
11124448;15161718;19202122;27242928;40414243;13142345];
holdon;axisequal;gridon
axis([-1.5,1.5,-1.5,1.5,-1.5,1.5])
view(3);
patch('Vertices',V,'Faces',F4,'FaceColor',[0.8.9]);
patch('Vertices',V,'Faces',F6,'FaceColor',[0.5.9]);
patch('Vertices',V,'Faces',F8,'FaceColor',[0.5.5]);

在代码最后加入这么一行即可生成投影:

axProjection3D('XYZ')

只生成部分投影:

axProjection3D('XZ')

为每个投影设置不同颜色:

axProjection3D('X')
axProjection3D('Y',[.7,0,0])
axProjection3D('Z',[0,0,.7])

以上是工具函数的基本使用,以下给出应对其他几种图像格式该工具的使用效果:

三维曲面投影

此部分主要是值使用函数surfsurfacemesh函数创建的曲面,完全相同的使用方式:

cplxdemo
axis([-1.5,1.5,-1.5,1.5,-1.5,1.5])

axProjection3D('XYZ')

三维曲线投影

此部分主要是值使用函数lineplot3函数创建的曲线,完全相同的使用方式:

[~,L]=ode45(@(t,L)Lorenz(t,L),0:.01:100,[1;1;1;10;28;8/3]);
plot3(L(:,1),L(:,2),L(:,3))
gridon

axProjection3D('XYZ')

functiondL=Lorenz(t,L)
%L=[x;y;z;a;r;b];
%dL=[dx/dt;dy/dt;dz/dt;0,0,0];
%dz/dt=-a*(x-y)
%dy/dt=x*(r-z)-y
%dz/dt=x*y-b*z
dL=zeros([6,1]);
dL(1)=-L(4)*(L(1)-L(2));
dL(2)=L(1)*(L(5)-L(3))-L(2);
dL(3)=L(1)*L(2)-L(6)*L(3);
dL(4:6)=0;
end

三维参数曲线投影

此部分主要是值使用函数fplot3函数创建的曲线,完全相同的使用方式:

xt=@(t)exp(-t/10).*sin(5*t);
yt=@(t)exp(-t/10).*cos(5*t);
zt=@(t)t;
fplot3(xt,yt,zt,[-1010])

axProjection3D('XYZ')

三维参数曲面投影

此部分主要是值使用函数fsurf函数创建的曲面,完全相同的使用方式:

symsuv;
r=@(u)4-2*cos(u);
x=piecewise(u<=pi,-4*cos(u)*(1+sin(u))-r(u)*cos(u)*cos(v),...
u>pi,-4*cos(u)*(1+sin(u))+r(u)*cos(v));
y=r(u)*sin(v);
z=piecewise(u<=pi,-14*sin(u)-r(u)*sin(u)*cos(v),...
u>pi,-14*sin(u));
fsurf(x,y,z,[02*pi02*pi]);
axis([-8,12,-8,12,-22,18])

axProjection3D('XYZ')

混合类型三维绘图投影

多种类型图像画在一起:

xt=@(t)exp(-t/10).*sin(5*t);
yt=@(t)exp(-t/10).*cos(5*t);
zt=@(t)t;
fplot3(xt,yt,zt,[-1010],'LineWidth',2)
holdon

[X,Y,Z]=peaks(30);
surf(X,Y,Z)
axis([-5,5,-5,5,-8,8])
axProjection3D('XYZ')

工具函数完整代码

functionaxProjection3D(varargin)
%@author:slandarer
%公众号:slandarer随笔
%知乎:hikari


%获取参数
ifisa(varargin{1},'matlab.graphics.axis.Axes')
ax=varargin{1};varargin(1)=[];
else
ax=gca;
end
hold(ax,'on')
ax.XLim=ax.XLim;
ax.YLim=ax.YLim;
ax.ZLim=ax.ZLim;
state=upper(varargin{1});
iflength(varargin)>1
faceColor=varargin{2};
else
faceColor=[.5,.5,.5];
end
[~,state,~]=intersect('XYZ',state);

%记录子图形对象
ChildrenList(length(ax.Children))=ax.Children(end);
forn=1:length(ax.Children)
ChildrenList(n)=ax.Children(n);
end
forn=length(ChildrenList):-1:1
ifstrcmp(ChildrenList(n).Tag,'AP3D')
ChildrenList(n)=[];
end
end

%绘制投影
minLim=[ax.XLim(2),ax.YLim(2),ax.ZLim(1)];
fori=1:length(state)
ii=state(i);
forn=1:length(ChildrenList)
switchtrue
%Patch对象投影
caseisa(ChildrenList(n),'matlab.graphics.primitive.Patch')
tobj=copyobj(ChildrenList(n),ax);
tobj.Vertices(:,ii)=minLim(ii);
tobj.FaceColor=faceColor;
tobj.FaceAlpha=.5;
tobj.EdgeColor=faceColor./5;
tobj.EdgeAlpha=.9;
tobj.Tag='AP3D';
%Surface对象投影
caseisa(ChildrenList(n),'matlab.graphics.chart.primitive.Surface')||isa(ChildrenList(n),'matlab.graphics.primitive.Surface')
tobj=copyobj(ChildrenList(n),ax);
switchii
case1,tobj.XData(:,:)=minLim(ii);
case2,tobj.YData(:,:)=minLim(ii);
case3,tobj.ZData(:,:)=minLim(ii);
end
tobj.FaceColor=faceColor;
tobj.FaceAlpha=.5;
tobj.EdgeColor=faceColor./5;
tobj.EdgeAlpha=.9;
tobj.Tag='AP3D';
%Line对象投影
caseisa(ChildrenList(n),'matlab.graphics.chart.primitive.Line')||isa(ChildrenList(n),'matlab.graphics.primitive.Line')
tobj=copyobj(ChildrenList(n),ax);
switchii
case1,tobj.XData(:,:)=minLim(ii);
case2,tobj.YData(:,:)=minLim(ii);
case3,tobj.ZData(:,:)=minLim(ii);
end
tobj.Color=[faceColor,.5];
tobj.Tag='AP3D';
%三维参数化曲线
caseisa(ChildrenList(n),'matlab.graphics.function.ParameterizedFunctionLine')
tobj=copyobj(ChildrenList(n),ax);
switchii
case1,tobj.XFunction=@(t)t.*0+minLim(ii);
case2,tobj.YFunction=@(t)t.*0+minLim(ii);
case3,tobj.ZFunction=@(t)t.*0+minLim(ii);
end
tobj.Color=[faceColor,.5];
tobj.Tag='AP3D';
%三维参数化曲面
caseisa(ChildrenList(n),'matlab.graphics.function.ParameterizedFunctionSurface')
tobj=copyobj(ChildrenList(n),ax);
switchii
case1,tobj.XFunction=minLim(ii);
case2,tobj.YFunction=minLim(ii);
case3,tobj.ZFunction=minLim(ii);
end
tobj.FaceColor=faceColor;
tobj.FaceAlpha=.5;
tobj.EdgeColor=faceColor./5;
tobj.Tag='AP3D';
end
end
end
end

以上就是Matlab实现三维投影绘制的示例代码的详细内容,更多关于Matlab三维投影的资料请关注我们其它相关文章!

本文标题为:Matlab实现三维投影绘制的示例代码