专业今年开了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时有所帮助~