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