2017-02-09 4 views
3

Рассмотрим следующую функцию, которая рисует анимированный сюжет cicloid.Matlab: как сохранить анимированный сюжет в gif

function animate1() 
    clear, clc 

    R = 1; 
    na = -pi/2; 
    t = 0:0.05:6; 
    v = 4; 

    for i = 1:length(t) 
     x0 = v*t(i); 
     y0 = R; 
     na = -v*t(i)/R; 
     fi = linspace(na,na+2*pi,100); 
     x = x0 + R*cos(fi); 
     y = y0 + R*sin(fi); 

     xc(i) = x0 + R*cos(na); 
     yc(i) = y0 + R*sin(na); 

     plot(x,y,'b',... 
      xc(i),yc(i),'*m',... 
      xc,yc,'r') 
     axis([-1 25 0 1.5]) 
     axis equal 
     pause(0.01) 
    end 

Возможно ли изменить код таким образом, чтобы он выводил анимированный график, например. к gif?

Спасибо заранее!

ответ

4

Да, imwrite поддерживает анимированные GIF-файлы. Как и для видео AVI, вы захватываете кадры через getframe последовательно. Затем передайте их в imwrite, хотя для GIF вам необходимо преобразовать их из RGB в 256 цветов. Как это:

for i = 1:nFrames 

    % draw stuff 

    frame = getframe(gcf); 
    img = frame2im(frame); 
    [img,cmap] = rgb2ind(img,256); 
    if i == 1 
     imwrite(img,cmap,'animation.gif','gif','LoopCount',Inf,'DelayTime',1); 
    else 
     imwrite(img,cmap,'animation.gif','gif','WriteMode','append','DelayTime',1); 
    end 
end 

Посмотрите openExample('matlab/WriteAnimatedGIFExample') и на doc imwrite для получения дополнительной информации.

+0

но что такое 'gcf' в' frame = getframe (gcf); '? – Eugeny89

+1

@ Eugeny89 'gcf' возвращает текущий указатель фигуры. Взгляните на [документацию] (https://es.mathworks.com/help/matlab/ref/gcf.html?requestedDomain=www.mathworks.com) – codeaviator

+0

Точно, спасибо @Cebri, 'gcf' сокращен для получить текущую цифру. Поэтому 'getframe (gcf)' будет захватывать весь текущий показатель. Вы также можете использовать 'getframe (gca)' ('gca' = получить текущую ось), если вы хотите только захватить текущую ось (т. Е. Без легенд, маркеров меток и т. Д.). – Florian

Смежные вопросы