zoukankan      html  css  js  c++  java
  • 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时有所帮助~

  • 相关阅读:
    蓝桥杯之递归算法基本框架

    Dubbo是什么
    java
    java
    java
    java
    java
    负载均衡的理解
    设计模式学习
  • 原文地址:https://www.cnblogs.com/gaokaitai/p/5290176.html
Copyright © 2011-2022 走看看