Matlab實現(xiàn)三維投影繪制的示例代碼
本期帶來一個三維投影繪制函數(shù)(三視圖繪制),函數(shù)支持三維曲線、曲面、三維多邊形、參數(shù)方程曲線、參數(shù)方程曲面的投影繪制,以下先給出代碼使用方式,文末給出工具函數(shù)完整代碼:
使用方法
三維多邊形投影及基本使用
通過介紹如何生成三維多邊形投影介紹一下函數(shù)咋用,這里的三維多邊形指的是使用patch
或fill3
創(chuàng)建的圖形,假設(shè)我們繪制了如下一個復(fù)雜多邊形構(gòu)成的球:
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')?
為每個投影設(shè)置不同顏色:
axProjection3D('X')? axProjection3D('Y',[.7,0,0])? axProjection3D('Z',[0,0,.7])?
以上是工具函數(shù)的基本使用,以下給出應(yīng)對其他幾種圖像格式該工具的使用效果:
三維曲面投影
此部分主要是值使用函數(shù)surf
、surface
、mesh
函數(shù)創(chuàng)建的曲面,完全相同的使用方式:
cplxdemo axis([-1.5,1.5,-1.5,1.5,-1.5,1.5]) axProjection3D('XYZ')?
三維曲線投影
此部分主要是值使用函數(shù)line
、plot3
函數(shù)創(chuàng)建的曲線,完全相同的使用方式:
[~,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
三維參數(shù)曲線投影
此部分主要是值使用函數(shù)fplot3
函數(shù)創(chuàng)建的曲線,完全相同的使用方式:
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')
三維參數(shù)曲面投影
此部分主要是值使用函數(shù)fsurf
函數(shù)創(chuàng)建的曲面,完全相同的使用方式:
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')
工具函數(shù)完整代碼
function?axProjection3D(varargin) %?@author?:?slandarer %?公眾號??:?slandarer隨筆 %?知乎????:?hikari %?獲取參數(shù) 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'; ????????????%?三維參數(shù)化曲線 ????????????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'; ????????????%?三維參數(shù)化曲面 ????????????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實現(xiàn)三維投影繪制的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Matlab三維投影的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Qt利用QSortFilterProxyModel代理實現(xiàn)自定義排序與聯(lián)合過濾
QsortFilterProxyModel類用來為model和view之間提供強大的排序和過濾支持。這篇文章將利用QSortFilterProxyModel代理實現(xiàn)自定義排序與聯(lián)合過濾,需要的可以參考一下2022-11-11詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實現(xiàn)
這篇文章主要介紹了C語言中字符串拷貝函數(shù)(strcpy)與內(nèi)存拷貝函數(shù)(memcpy)的不同及內(nèi)存拷貝函數(shù)的模擬實現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12C語言動態(tài)內(nèi)存分配和內(nèi)存操作函數(shù)使用詳解
但是在實際的編程中,往往會發(fā)生這種情況,即所需的內(nèi)存空間取決于實際輸入的數(shù)據(jù),而無法預(yù)先確定 。為了解決上述問題,C語言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要動態(tài)的分配內(nèi)存空間,也可把不再使用的空間回收再次利用2022-12-12C++11中內(nèi)聯(lián)函數(shù)(inline)用法實例
內(nèi)聯(lián)函數(shù)本質(zhì)還是一個函數(shù),但在聲明的時候,函數(shù)體要和聲明結(jié)合在一起,否則編譯器將它作為普通函數(shù)來對待,下面這篇文章主要給大家介紹了關(guān)于C++11中內(nèi)聯(lián)函數(shù)(inline)的相關(guān)資料,需要的朋友可以參考下2022-10-10