日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

台湾国立大学郭彦甫Matlab教程笔记(13) 3D

發(fā)布時(shí)間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 台湾国立大学郭彦甫Matlab教程笔记(13) 3D 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

3D plots

幾個(gè)重要指令,重要函數(shù)。

functions:
線圖
plot3: 3D line plot
幾個(gè)畫表面的圖
surf: 3D shaded surface plot
surfc: contour plot under a 3D shaded surface plot 輪廓畫圖
surface: create surface object
meshc:plot a contour graph under mesh graph
contour : contour plot of matrix
contourf: filled 2D contour plot

2D vs.3D

我們先跑一個(gè)二維的圖形,以上次筆記上最后一個(gè)例程為例

我們可以把二維的圖形轉(zhuǎn)換為三維用matlab提供的 三位旋轉(zhuǎn)按鈕
三維旋轉(zhuǎn)的效果:

原始2D跑出來的結(jié)果


附上代碼:

x=[1:10;3:12;5:14]; imagesc(x);%顯示顏色 map=[ 0 1 0;0 0.9 0;0 0.6 0;0 0.5 0;0 0.4 0;0 0.2 0];%自定義map顏色 colormap(map);%涂色,自定義顏色 colorbar;%顯示右邊關(guān)于色度的bar

有了這個(gè)印象,我們逐步開始看關(guān)于3D的一些指令

plot3()三維畫線

畫線line
看一個(gè)例程:三維空間繪制三角函數(shù)sin()

x=0:0.1:3*pi; z1=sin(x);%三個(gè)sin函數(shù) z2=sin(2*x); z3=sin(3*x); y1=zeros(size(x)); y3=ones(size(x)); y2=y3./2; plot3(x,y1,z1,'r',x,y2,z2,'b',x,y3,z3,'g');%plot3()三維畫圖 grid on;%打開柵格 xlabel('x-axis');ylabel('y-axis');zlabel('z-axis');%坐標(biāo)軸名稱

關(guān)于代碼的解釋:
這里

y1=zeros(size(x)); y3=ones(size(x)); y2=y3./2;

意思是:y1這個(gè)y軸上在y=0這個(gè)面上顯示。
y3=1,表示這個(gè)圖在y=1這個(gè)面上顯示
y2=y3/2=0.5表示這個(gè)圖在y=0.5這個(gè)面上顯示

程序運(yùn)行結(jié)果截圖:

我們可以用plot3()函數(shù)畫更多的圖

more 3D Line Plots更多應(yīng)用

原理就是x,y,z是三個(gè)向量,(x0,y0,z0)三個(gè)點(diǎn)描出來,多少個(gè)點(diǎn)描出來多少。這樣就形成了空間中的line。

兩個(gè)例程

程序源代碼:

t=0:pi/50:10*pi; plot3(sin(t),cos(t),t);%x坐標(biāo)是sint,y坐標(biāo)是cost,這樣應(yīng)該是個(gè)圓, %然后縱坐標(biāo)z隨著時(shí)間上升,形成三維的螺旋線 grid on; axis square;

跑出來的結(jié)果:

下面這個(gè)例子是三維的錐線
源程序代碼:

turns=40*pi; t=linspace(0,turns,4000);%時(shí)間從0到turns,中間有4000個(gè)取樣點(diǎn) x=cos(t).*(turns-t)./turns;%x和y隨著時(shí)間增加而減少,圓的半徑減少 y=sin(t).*(turns-t)./turns; z=t./turns; plot3(x,y,z); grid on;

跑出來的結(jié)果:

上面講的都是line的圖形,就是一條線在三維空間中移動(dòng)。
常用的是三維的立體圖 surface圖形

principles for 3D surface plots貼圖

surface的原理:
和line的原理不同,surface 的原理是x,y,z都是一個(gè)矩陣,x和y會(huì)形成一個(gè)網(wǎng)格。


meshgrid這個(gè)指令 會(huì)創(chuàng)建出來關(guān)于x和y的矩陣

x=-2:1:2; y=-2:1:2; [X,Y]=meshgrid(x,y)

執(zhí)行的結(jié)果是如下的矩陣

X =-2 -1 0 1 2-2 -1 0 1 2-2 -1 0 1 2-2 -1 0 1 2-2 -1 0 1 2Y =-2 -2 -2 -2 -2-1 -1 -1 -1 -10 0 0 0 01 1 1 1 12 2 2 2 2

有了x和y形成的網(wǎng)格,我們就可以畫圖

畫圖基本的函數(shù)是

surface plots:mesh() and surf()

mesh得到的是網(wǎng)格,網(wǎng)格是空洞的。
surf是格子上面有貼圖。
區(qū)別如下

下面通過例程查看mesh和surf怎么用
通過繪制這個(gè)函數(shù)

程序:

x=-3.5:0.2:3.5; y=-3.5:0.2:3.5; [X,Y]=meshgrid(x,y); Z=X.*exp(-X.^2-Y.^2); subplot(1,2,1);mesh(X,Y,Z); subplot(1,2,2);surf(X,Y,Z);

繪制結(jié)果:

這個(gè)函數(shù)我們?cè)诟叩葦?shù)學(xué)中經(jīng)常遇到,包括積分運(yùn)算等等,現(xiàn)在我們可以通過matlab直接繪制出來其圖像,簡(jiǎn)潔明了,極大地方便了我們的科研

我們?cè)賮砜聪乱粋€(gè)函數(shù)

contour()輪廓

功能:把3D圖中相同高度的值畫在同一個(gè)二維平面上投影。

看一個(gè)例程:

x=-3.5:0.2:3.5; y=-3.5:0.2:3.5; [X,Y]=meshgrid(x,y); Z=X.*exp(-X.^2-Y.^2); subplot(2,1,1); mesh(X,Y,Z);%畫出網(wǎng)格圖 axis square; subplot(2,1,2); contour(X,Y,Z);%等高線 axis square;

例程運(yùn)行結(jié)果:

可以清楚看到contour投影的特點(diǎn):相同高度的投影在同一圈。

Contour也有自己的變化

Various Contour plots

想讓contour畫出來的線更密集
1.可以在contour中加數(shù)值,讓contour畫線更緊密。
contour(Z,[-.45:.05:.45]);
2.也可以在contour圖上標(biāo)出數(shù)值。用clabel這個(gè)指令
clabel(C,h);
3.可以涂顏色
用contourf()來做。

得到的效果圖:

例程:

x=-3.5:0.2:3.5; y=-3.5:0.2:3.5; [X,Y]=meshgrid(x,y); Z=X.*exp(-X.^2-Y.^2); subplot(1,3,1); contour(Z,[-.45:.05:.45]);%用來讓線更密集 axis square; subplot(1,3,2); [C,h]=contour(Z); clabel(C,h);%用來標(biāo)注數(shù)字 axis square; subplot(1,3,3); contourf(Z);%用來添加顏色 axis square;

作業(yè):

線的密度是0.05,涂上顏色,標(biāo)注數(shù)字在一張圖上。

我的練習(xí):
思路:首先我要自己先回顧出來這個(gè)的三維圖形過程:首先meshgrid產(chǎn)生x,y的網(wǎng)格
然后,寫出來函數(shù)表達(dá)式。之后就是contour直接繪制。

運(yùn)行這個(gè)版本,發(fā)現(xiàn)奇怪,明明設(shè)置了contour(Z,[-0.4:0.05:0.4]);,這個(gè)線的密度間隔應(yīng)該是0.05,但是發(fā)現(xiàn)是這樣的:間隔線密度并沒有變化
經(jīng)過修改,發(fā)現(xiàn),這里面不能存在幾個(gè)contour函數(shù),前面的contour函數(shù)被后面的contour函數(shù)執(zhí)行覆蓋了。

踩坑:這是一個(gè) 錯(cuò)誤的版本 ,出現(xiàn)的結(jié)果如上圖所示,線密度并沒有改變。

x=-2:0.2:2; y=-2:0.2:2; [X,Y]=meshgrid(x,y); Z=X.*exp(-X.^2-Y.^2); contour(Z,[-0.4:0.05:0.4]); axis square;%坐標(biāo)軸顯示 [C,h]=contour(Z); clabel(C,h);%標(biāo)注數(shù)字

這個(gè)題的解決如下:
只需要一行代碼同時(shí)實(shí)現(xiàn)三個(gè)功能:[C,h]=contourf(Z,[-0.4:0.05:0.4]);clabel(C,h);%添加數(shù)字表示
改變線了密度,出現(xiàn)數(shù)字,顏色覆蓋。

最終代碼:正確的版本

x=-2:0.1:2; y=-2:0.1:2; [X,Y]=meshgrid(x,y); Z=X.*exp(-X.^2-Y.^2); [C,h]=contourf(Z,[-0.4:0.05:0.4]); axis square;%顯示坐標(biāo)軸 clabel(C,h);%添加數(shù)字表示

運(yùn)行結(jié)果:

下面看函數(shù)

meshc() and surfc()

功能:
combination of surface/mesh and contours
把繪制表面和網(wǎng)格的函數(shù)與繪制等高線的函數(shù)結(jié)合

程式案例:

x=-3.5:0.2:3.5; y=-3.5:0.2:3.5; [X,Y]=meshgrid(x,y); Z=X.*exp(-X.^2-Y.^2); subplot(1,2,1); meshc(X,Y,Z); subplot(1,2,2); surfc(X,Y,Z);

執(zhí)行過程:

再來角度的部分 View Angle :view()

用兩個(gè)角度來看物件的位置
這里兩個(gè)角度分別是:
Azimuth and Elevation

舉例子,下面繪制一個(gè)三維的立體球,然后用view函數(shù)來從不同的角度查看這個(gè)球

sphere(50); shading flat; light('position',[1,3,2]);%添加燈光,讓球更真實(shí)立體 light('position',[-3 -1 3]); material shiny; axis vis3d off;%不顯示三維坐標(biāo)系 set(gcf,'color',[1 1 1]);

畫出來的結(jié)果是一個(gè)球

添加下面的代碼:
view(-45,20)

給出的又是另一個(gè)視角

現(xiàn)在看光線的部分 Light:light()

打光的時(shí)候位置會(huì)變化
L1=light(‘position’,[-1 -1 -1]);

我們可以設(shè)置打光的位置
set(L1,‘position’,[-1,-1,-1]);

我們也可以設(shè)置光的顏色:比如綠色
set(L1,‘color’,‘g’);
可以選擇位置
程序:

[X,Y,Z]=sphere(64);%球坐標(biāo)系h=surf(X,Y,Z);%畫出球 axis square vis3d off;%坐標(biāo)軸不見 reds=zeros(256,3); reds(:,1)=(0:256.-1)/255;%自定義顏色 colormap(reds);%上色 shading interp; lighting phong; set(h,'AmbientStrength',0.75,'DiffuseStrength',0.5);%設(shè)置 L1=light('position',[-1 -1 -1]);%打光的位置

運(yùn)行結(jié)果:

再來

patch指令,用來畫立體多邊形

patch()

a graphical object containing polygons

學(xué)習(xí)到:vertex是頂點(diǎn)的意思(在‘facevertexCData’中)

例程:自己看一下怎么使用理解

v=[0 0 0; 1 0 0;1 1 0;0 1 0;0.25 0.25 1;0.75 0.25 1;0.75 0.75 1;0.25 0.75 1]; f=[ 1 2 3 4;5 6 7 8;1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8]; subplot(1,2,1); patch('vertices',v,'faces',f,'facevertexCData',hsv(6),'facecolor','flat'); view(3); axis square tight; grid on; subplot(1,2,2); patch('vertices',v,'faces',f,'facevertexCData',hsv(8),'facecolor','interp'); view(3); axis square tight; grid on;

執(zhí)行結(jié)果:

最后,看一下matlab畫圖非常專業(yè)


我把代碼又敲了一遍:

load cape X=conv2(ones(9,9)/81,cumsum(cumsum(randn(100,100)),2)); surf(X,'edgecolor','none','edgelighting','phong','facecolor','interp'); colormap(map); caxis([-10,300]); grid off; axis off;

自己跑一遍的結(jié)果:

這個(gè)程序筆者還沒有研究哦。后續(xù)可能會(huì)研究研究吧。

【總結(jié)】
本文記錄的matlab3D畫圖的一些知識(shí):
functions:
線圖
plot3: 3D line plot
幾個(gè)畫表面的圖
surf: 3D shaded surface plot
surfc: contour plot under a 3D shaded surface plot 輪廓畫圖
surface: create surface object
meshc:plot a contour graph under mesh graph
contour : contour plot of matrix
contourf: filled 2D contour plot
看物件角度的函數(shù)
view()
繪制立體多邊形的函數(shù)
patch()

總結(jié)

以上是生活随笔為你收集整理的台湾国立大学郭彦甫Matlab教程笔记(13) 3D的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。