專業今年開了MATLAB的課程(土木工程學MATLAB?),老師給出了保過題,為了不掛科也是苦逼百度+谷歌了半天,加上自己的琢磨,總算是明白些surf顏色控制方法了,在這里分享記錄一下~初學matlab,理解的不是太深,望海涵。
題目
從excel中讀取粒子,這些粒子具有三維的坐標,xyz,並且具有三維的速度,excel中的每一頁內存儲一個時間點的例子信息,x,y,z,vx,vy,vz,頁的命名為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時有所幫助~