天天看點

antd tree 動态添加_一文了解Matlab如何制作動态圖像

antd tree 動态添加_一文了解Matlab如何制作動态圖像

今天的推文,我們主要來介紹matlab中幾種繪制動态圖像的方法。首先,以之前介紹過的心形圖為例,來說明在matlab中如何将繪圖過程儲存為gif動态圖像。

antd tree 動态添加_一文了解Matlab如何制作動态圖像

1. Matlab繪制GIF圖像

Step1:生成三維心形線坐标 ,三維空間下的心形線方程為:

antd tree 動态添加_一文了解Matlab如何制作動态圖像

為了求解滿足該方程所有點坐标,首先定義了在xyz坐标軸上[-3,3]範圍内分别取101個點,用meshgrid得到101*101*101的三維網格點資料,計算每個網格點上函數

antd tree 動态添加_一文了解Matlab如何制作動态圖像

的取值 val ,所有 val 為 0 的點即為心形線坐标點。 Step2:在YOZ平行平面上繪制心形線 ,令X取定值,提取該平面上所有val取值為0的網格點(Y,Z)坐标,繪制心形線。在這裡,提取val為0的點,通過提取等值線來實作,(Y,Z)=contourc(val(:,X,:),[0,0]),具體這部分matlab代碼為:

for X = 35:67    %提取不同X取值下,與YOZ平行的平面上,f(y,z)取值    plane = reshape(val(:,X,:),101,101);    %提取val為0的等值線,即滿足f(y,z)=0的坐标點    c_data = contourc(plane,[0,0]);    x_data = X*ones(1,c_data(2,1));    %繪制在YOZ平行平面上的心形線    plot3(x_data,c_data(2,2:end),c_data(1,2:end),'r');    axis([30,80,30,80,30,80])axis offEnd
           

Step3:将圖像儲存為gif檔案 ,在matlab可以使用imwrite将圖像儲存為gif,但需要将圖像資料儲存為索引圖像。其中,儲存第一張圖像時,需要建立gif檔案,之後的圖像全部采用append的方式進行添加即可。儲存gif檔案的基本架構為: 其中,getframe是為了抓取目前繪制的圖像,frame2im函數将目前圖形儲存為rgb圖像,rgb2ind函數将rgb圖像儲存為索引圖像。 所謂索引圖像是指一個資料矩陣A,一個顔色映像矩陣Map。其中Map是一個包含三列、若幹行的資料陣列,其中每個元素的值均為[0, 1]之間的雙精度浮點型資料。Map矩陣的每一行分别表示紅色、綠色和藍色的顔色值。 在MATLAB中,索引圖像是從像素值到顔色映射表值的“直接映射”。像素顔色由資料矩陣X作為索引指向矩陣Map進行索引,例如,值1指向矩陣Map中的第一行,值2指向第二行,以此類推。 索引圖像的使用解決了圖像資料矩陣消耗記憶體過大的問題,rgb圖像需要一個三維資料矩陣才可以表示,索引圖像隻需要一維資料矩陣和一個map就可以表示了。 Setp4:同理,繪制XOY平行平面和XOZ平面的心形線,并繼續儲存到gif檔案中即可。 完整代碼在公衆号背景回複“ 動态心形線 ”即可擷取。

2. Matlab建立動畫線條

我們在繪制動态圖像的目的一般是為了展示圖像的繪制過程,或者是為了在串行擷取資料時,實時展示圖像。

antd tree 動态添加_一文了解Matlab如何制作動态圖像

為了實作實時繪圖的動畫,我們需要借助于matlab中的animatedline函數(注意:這是matlab在2014a版本之後才才更新的一個函數,2014a包括2014a之前版本的matlab都不能實作這個功能)。

  • an = animatedline 建立一根沒有任何資料的動畫線條并将其添加到目前坐标區中;
  • an = animatedline(x,y) 建立一根包含由 x 和 y 定義的初始資料點的動畫線條;
  • an = animatedline(x,y,z) 建立一根包含由 x、y 和 z 定義的初始資料點的三維動畫線條;
  • an = animatedline(___,Name,Value) 使用一個或多個名稱-值對組參數指定動畫線條屬性。例如,'Color','r' 将線條顔色設定為紅色。

當然,animatedline建立了一個動畫線條,為了讓這個線條動起來,我們需要給它繼續添加坐标點,這裡就需要用到addpoints函數。

  • addpoints(an,x,y) 向動畫線條an中,添加二維點;
  • addpoints(an,x,y,z) 向動畫線條an中,添加三維點。

由此,我們寫一下,實作動态線條的基本架構:

h = animatedline('Color','r','LineWidth',3);for k = 1:length(x)    addpoints(h,x(k),y(k));  end
           

基于這兩個函數,就可以完成上圖的動态繪圖效果了,結合第一節中介紹的gif檔案儲存方式,我們還可以将繪圖過程輸出為gif檔案。

t = 0:0.1:2*pi;x = 16*(sin(t)).^3;y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t);axis off;set(gcf,'color',[1 1 1]);[A,map] = rgb2ind(frame2im(getframe),256);imwrite(A,map,'xin2.gif','LoopCount',65535,'DelayTime',0.1);h = animatedline('Color','r','LineWidth',3);for k = 1:length(x)    addpoints(h,x(k),y(k));    axis([-20,20,-20,20])    [A,map] = rgb2ind(frame2im(getframe),256);    imwrite(A,map,'xin2.gif','WriteMode','append','DelayTime',0.1);end
           

3. Matlab動畫循環播放

Movie函數可以實作電影動畫,一次運作結果可以儲存起來進行多次播放,同時可以生成avi視訊檔案,獨立于matlab進行使用。 在進行movie函數建立動畫之前,需要用moviein函數儲存繪制的圖形資料,建立一個足夠大的矩陣,使之能夠容納基于目前繪制的圖形(此處稱為幀)。 當建立了一系列的動畫幀後,可以利用movie函數按照指定的速度和次數運作該電影動畫。 m ovie函數的調用格式為:

  • movie(M) 将矩陣M中的動畫幀播放一次;
  • movie(M,n) 将矩陣M中的動畫幀播放n次;
  • movie(M,n,fps) 将矩陣M中的動畫幀以每秒fps幀的速度播放n次。

接下來,我們以三維曲面的動态變化為例,展示一下movie函數效果。

antd tree 動态添加_一文了解Matlab如何制作動态圖像

本文介紹了幾種關于matlab繪制動畫的基本函數,在這些基本的函數基礎上,可以結合圖像處理技術還可以做出更多豐富的動畫特效,這些内容可以在之後的推文中慢慢了解。  

antd tree 動态添加_一文了解Matlab如何制作動态圖像

繼續閱讀