MATLAB三维画图、画线、动态刷新、不同视角、自动保存多张图像

作者:金良([email protected]) csdn博客:http://blog.csdn.net/u012176591

MATLAB三维画图、画线、动态刷新、不同视角、自动保存多张图像_第1张图片

效果图(http://www.tuyitu.com/gif/可以将多张图片转换成gif,不限图片张数,不过一定要等待转换结束才能保存,否则转换成的gif图片不能完全播放):

1.例1



代码:

x=linspace(-2, 2, 100); % 在x轴上取100点
y=linspace(-2, 2, 100); % 在y轴上取100点
r = 0.5;%学习率
m=-1.5;n=-1.5;
[xx,yy]=meshgrid(x, y); % xx和yy都是100x100的矩阵
zz=exp(-xx.^2-yy.^2); % 计算函数值,zz也是100x100的矩阵
plot3(xx, yy, zz,'g-'); % 画出立体曲面图
%shading interp%去掉网格
colormap([]);  % 去掉颜色剩网线了
hold on;
delta=100;
plot3(m,n,exp(-m^2-n^2),'k*');
pause(1)  
i=0;
while delta>0.005
    vx=-m*exp(-m^2-n^2);%梯度上升法求梯度
    vy=-n*exp(-m^2-n^2);
    mtemp = m+r*vx;%更新位置
    ntemp = n+r*vy;
    hold on;%画图前,先hold on
    plot3(mtemp,ntemp,exp(-mtemp^2-ntemp^2),'k*')%画点
    plot3([m,mtemp],[n,ntemp],[exp(-m^2-n^2),exp(-mtemp^2-ntemp^2)],'r-')%连线
    hold off;%画图后,要先释放
    m=mtemp;
    n=ntemp;
    delta = sqrt(vx^2+vy^2);
    pause(0.25);
    F=getframe(gcf);
    %保存图像,第二个参数是图像路径名,由于保存多张,每张都有一个动态的编号
    imwrite(F.cdata,['e:\pic\jin_',num2str(i),'.jpg']);
    i=i+1;%图像编号
end
el=30;  %设置仰角为30度。
for az=0:20:360  %让方位角从0变到360,绕z轴一周
    view(az,el);
    drawnow;
    pause(0.25);%暂停0.25s,不暂停的话图像将得不到刷新
    F=getframe(gcf);
    imwrite(F.cdata,['e:\pic\jin_',num2str(i),'.jpg']);
    i=i+1;
end

微笑画图前先要hold on,画图之后要hold off,并且要暂停一会儿pause(0.25),这样才能看到图像的刷新。

微笑图像刷新后,用F=getframe(gcf);获得图像的操作句柄,用imwrite(F.cdata,图像文件名);来保存图片。上边的代码中['e:\pic\jin_',num2str(i),'.jpg']将三个字符串连接成保存图片的路径名和文件名,其中i是一个不断的整数,作为图片的序号并体现在文件名里。图片格式是.jpg。

微笑至于view(az,el);中的两个参数(方位角和仰角)的概念,这里有详细的介绍和例子http://blog.csdn.net/u012176591/article/details/40921033。


2.例2

在擦除模式上做文章,擦除模式有3种:
  • none--MATLAB does not erase the objects when it is moved.
  • background--MATLAB erases the object by redrawing it in the background color. This mode erases the object and anything below it (such as grid lines).
  • xor--This mode erases only the object and is usually used for animation.
下面是代码,使用了none模式,你可以试试其它两个模式
A = [ -8/3 0 0; 0 -10 10; 0 28 -1 ];
y = [35 -10 -7]';
h = 0.01;
p = plot3(y(1),y(2),y(3),'.', ...
    'EraseMode','none','MarkerSize',5); % Set EraseMode to none
axis([0 50 -25 25 -25 25])
hold on
for i=1:4000
    A(1,3) = y(2);
    A(3,1) = -y(2);
    ydot = A*y;
    y = y + h*ydot;
    % Change coordinates
    set(p,'XData',y(1),'YData',y(2),'ZData',y(3)) 
    drawnow 
    i=i+1;
end

  • Erase Modes http://matlab.izmiran.ru/help/techdoc/creating_plots/specia36.html 



你可能感兴趣的:(matlab,画图,视角,自动保存图像)