MATLAB畫圖surf函數顏色控制參數c用法


專業今年開了MATLAB的課程(土木工程學MATLAB?),老師給出了保過題,為了不掛科也是苦逼百度+谷歌了半天,加上自己的琢磨,總算是明白些surf顏色控制方法了,在這里分享記錄一下~初學matlab,理解的不是太深,望海涵。

題目

excel中讀取粒子,這些粒子具有三維的坐標,xyz,並且具有三維的速度,excel中的每一頁內存儲一個時間點的例子信息,xyzvxvyvz,頁的命名為sheet+i,希望能夠先讀取粒子信息到向量當中,然后粒子的位置進行圖像顯示,粒子采用球體進行顯示,球體的顏色和合速度的大小有關,采用從綠色到紅色的漸變關系,然后粒子在三維空間中,根據時間的變化運動起來。

說明:我希望時間步數是作為函數的輸入參數的,也就是顯示多少個時間點是可控的,起始的時間點是可控的

從我多年編程的角度,嗯,邏輯非常簡單,但是動畫這塊就比較蛋疼了,畢竟完全沒接觸過matlab動畫~於是開始在網上搜相關的教程,這些東西還是挺多的。然后就做成了生成一個球並使其運動的代碼,然后hold on繪制多個球。

然后就是顏色控制,第一想法就是使用colormap,用了之后就發現后面設置的會覆蓋之前的,就是所有球都是同一顏色,,,。

之后繼續搜,發現surf(x,y,z,c)的第四個參數就是顏色控制,,,但是搜了好多都說是顏色控制,就是不說到底怎么控制,,這就比較尷尬了。

於是在調試中和搜索中,發現錯誤提示 cDATA必須是M*N矩陣或者M*N*3數組,而c的默認值為z,,,那么不得不去聯想,surf函數是使用網格繪制,c對應每一個網格的顏色,那也就是每個網格可以使用rgb進行顏色設置。那么設置一個和z同大小的矩陣,然后升級為三維數組,第三維(列)對應rgb三色,傳給surf函數,那么正好實現了顏色控制。於是測試(以下為代碼片段,無上下文)

[x,y,z] = sphere(n);

c=zeros(size(x));%獲得o陣大小和x相同

for i=1:1:length(c(1,:))
  for j=1:1:length(c(:,1))
    c(i,j,1)=1;
    c(i,j,2)=0;
    c(i,j,3)=0;%紅色
  end
end

沒問題,所有球都是紅的

那么題目就迎刃而解了

function anim=ani2(numb,start)
dian=[];
v=[];
i=1;
vmax=0;
vmin=100;
while 1
  lsp=xlsread('dian.xlsx',i);
  if length(lsp)==0
    break;
  end
  lsp(1)=lsp(1)+lsp(4)*start;
  lsp(2)=lsp(2)+lsp(5)*start;
  lsp(3)=lsp(3)+lsp(6)*start;
  dian=[dian;lsp(1),lsp(2),lsp(3)];
  v=[v;lsp(4),lsp(5),lsp(6)];
  lsv=sqrt(lsp(4)*lsp(4)+lsp(5)*lsp(5)+lsp(6)*lsp(6));
  if lsv>vmax
    vmax=lsv;
  end
  if lsv<vmin
    vmin=lsv;
  end
  i=i+1;
end

k = 5;
n = 2^k-1;
[x,y,z] = sphere(n);
for i=1:1:length(dian(:,1))
  surf(x+dian(i,1),y+dian(i,2),z+dian(i,3));
  hold on;
end
axis equal
axis tight
set(gcf,'renderer','zbuffer');
set(gca,'nextplot','replacechildren');
title('球體動畫');
j_color=vmax-vmin;
for j=1:1:numb
  k = 5;
  n = 2^k-1;
  [x,y,z] = sphere(n);
  set(gca,'nextplot','replacechildren');
  for i=1:1:length(dian(:,1))
    dian(i,1)=dian(i,1)+v(i,1);
    dian(i,2)=dian(i,2)+v(i,2);
    dian(i,3)=dian(i,3)+v(i,3);
    g=1-(sqrt(v(i,1)*v(i,1)+v(i,2)*v(i,2)+v(i,3)*v(i,3))-vmin)/j_color;
    r=1-g;
    c=zeros(size(z));
    for ll=1:1:length(c(1,:))
      for j=1:1:length(c(:,1))
        c(ll,j,1)=r;
        c(ll,j,2)=g;
        c(ll,j,3)=0;
      end
    end
    surf(x+dian(i,1),y+dian(i,2),z+dian(i,3),c);
    hold on;
  end
  axis equal
  F(j)=getframe;
end

希望對大家使用surf時有所幫助~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM