这篇文章主要讲解了“Matlab如何实现三维投影绘制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Matlab如何实现三维投影绘制”吧!
三维多边形投影及基本使用
通过介绍如何生成三维多边形投影介绍一下函数咋用,这里的三维多边形指的是使用patch
或fill3
创建的图形,假设我们绘制了如下一个复杂多边形构成的球:
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 -t c; t -c+l c; -t -c+l c; -c+l -t c; -c+l t c; -t c-l c; t c-l c; c-l t c; c t c-l;... c -t c-l; c -c+l t; c -c+l -t; c -t -c+l; c t -c+l; c c-l -t; c c-l t; c-l c t; c-l c -t;... t c -c+l; -t c -c+l; -t c-l -c; t c-l -c; c-l t -c; -c+l t -c; -c+l c -t; -c c-l -t; -c t -c+l;... -c -t -c+l; -c+l -t -c; -t c c-l; t c c-l; -c+l c t; -c c-l t; -c t c-l; -c -t c-l; -c -c+l t;... -c+l -c t; -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 -c c-l; -t -c c-l; c-l -c t]; F8 = [1 2 3 4 5 6 7 8; 17 18 19 20 25 32 30 31; 22 23 45 42 41 29 24 21;... 37 38 40 43 44 48 46 47; 9 10 11 12 13 14 15 16; 26 27 28 39 36 35 34 33]; F6 = [5 6 30 32 33 34; 3 4 35 36 37 47; 1 2 46 48 11 10; 7 8 9 16 17 31; 20 25 26 27 24 21;... 28 39 38 40 41 29; 14 23 22 19 18 15; 12 13 45 42 43 44]; F4 = [6 7 31 30; 1 10 9 8; 2 3 47 46; 4 5 34 35; 32 25 26 33; 36 37 38 39;... 11 12 44 48; 15 16 17 18; 19 20 21 22; 27 24 29 28; 40 41 42 43; 13 14 23 45]; hold on;axis equal;grid on 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])
以上是工具函数的基本使用,以下给出应对其他几种图像格式该工具的使用效果:
此部分主要是值使用函数surf
、surface
、mesh
函数创建的曲面,完全相同的使用方式:
cplxdemo axis([-1.5,1.5,-1.5,1.5,-1.5,1.5]) axProjection3D('XYZ')
此部分主要是值使用函数line
、plot3
函数创建的曲线,完全相同的使用方式:
[~,L]=ode45(@(t,L)Lorenz(t,L),0:.01:100,[1;1;1;10;28;8/3]); plot3(L(:,1),L(:,2),L(:,3)) grid on axProjection3D('XYZ') function dL=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,[-10 10]) axProjection3D('XYZ')
此部分主要是值使用函数fsurf
函数创建的曲面,完全相同的使用方式:
syms u v; 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, [0 2*pi 0 2*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,[-10 10],'LineWidth',2) hold on [X,Y,Z] = peaks(30); surf(X,Y,Z) axis([-5,5,-5,5,-8,8]) axProjection3D('XYZ')
function axProjection3D(varargin) % @author : slandarer % 公众号 : slandarer随笔 % 知乎 : hikari % 获取参数 if isa(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}); if length(varargin)>1 faceColor=varargin{2}; else faceColor=[.5,.5,.5]; end [~,state,~]=intersect('XYZ',state); % 记录子图形对象 ChildrenList(length(ax.Children))=ax.Children(end); for n=1:length(ax.Children) ChildrenList(n)=ax.Children(n); end for n=length(ChildrenList):-1:1 if strcmp(ChildrenList(n).Tag,'AP3D') ChildrenList(n)=[]; end end % 绘制投影 minLim=[ax.XLim(2),ax.YLim(2),ax.ZLim(1)]; for i=1:length(state) ii=state(i); for n=1:length(ChildrenList) switch true % Patch对象投影 case isa(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对象投影 case isa(ChildrenList(n),'matlab.graphics.chart.primitive.Surface')||isa(ChildrenList(n),'matlab.graphics.primitive.Surface') tobj=copyobj(ChildrenList(n),ax); switch ii case 1,tobj.XData(:,:)=minLim(ii); case 2,tobj.YData(:,:)=minLim(ii); case 3,tobj.ZData(:,:)=minLim(ii); end tobj.FaceColor=faceColor; tobj.FaceAlpha=.5; tobj.EdgeColor=faceColor./5; tobj.EdgeAlpha=.9; tobj.Tag='AP3D'; % Line对象投影 case isa(ChildrenList(n),'matlab.graphics.chart.primitive.Line')||isa(ChildrenList(n),'matlab.graphics.primitive.Line') tobj=copyobj(ChildrenList(n),ax); switch ii case 1,tobj.XData(:,:)=minLim(ii); case 2,tobj.YData(:,:)=minLim(ii); case 3,tobj.ZData(:,:)=minLim(ii); end tobj.Color=[faceColor,.5]; tobj.Tag='AP3D'; % 三维参数化曲线 case isa(ChildrenList(n),'matlab.graphics.function.ParameterizedFunctionLine') tobj=copyobj(ChildrenList(n),ax); switch ii case 1,tobj.XFunction=@(t)t.*0+minLim(ii); case 2,tobj.YFunction=@(t)t.*0+minLim(ii); case 3,tobj.ZFunction=@(t)t.*0+minLim(ii); end tobj.Color=[faceColor,.5]; tobj.Tag='AP3D'; % 三维参数化曲面 case isa(ChildrenList(n),'matlab.graphics.function.ParameterizedFunctionSurface') tobj=copyobj(ChildrenList(n),ax); switch ii case 1,tobj.XFunction=minLim(ii); case 2,tobj.YFunction=minLim(ii); case 3,tobj.ZFunction=minLim(ii); end tobj.FaceColor=faceColor; tobj.FaceAlpha=.5; tobj.EdgeColor=faceColor./5; tobj.Tag='AP3D'; end end end end
感谢各位的阅读,以上就是“Matlab如何实现三维投影绘制”的内容了,经过本文的学习后,相信大家对Matlab如何实现三维投影绘制这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。