Något om animering i Matlab

Denna sida visar den teknik du skall  använda för att få en snabb animation i Matlab. I följande exempel rör sig en partikel moturs utmed enhetscirkeln samtidigt som en annan partikel rör sig medurs utmed med en cirkel med halva radien.

% initial positions
x = [1; 0.5];
y = [0;   0];

% new figure window
figure

% plot the particle and save the handle to the plot-data
h = plot(x, y, 'ko', 'MarkerFaceColor', 'k');

% fix handle to title
ht = title('0');

% fix the axis scaling
axis equal
axis(1.1 * [-1 1 -1 1])

factor = 0.05; % controls the update of the angle

% animation loop
for time_step = 1:1000
  angle = time_step * factor;

  % compute new position
  x(1) = cos(angle);
  x(2) = 0.5 * x(1);
  y(1) = sin(angle);
  y(2) = -0.5 * y(1);

  % update position
  set(h, 'XData', x, 'YData', y)

  % update title
  set(ht, 'String', num2str(time_step), 'FontSize', 16, 'FontWeight', 'Bold')

  % wait and force drawing
  pause(0.05)
end


Du kan hämta koden, anim_ex.m, och testa den om du vill.

Några kommentarer. plot-kommandot kan returnera ett så kallat handtag (handle) som gör det möjligt att komma åt samt ändra egenskaper hos det vi plottat. Detta utnyttjar vi i loopen. set-kommandot tar handtaget och uppdaterar x- och y-koordinaterna för partiklarna utan att rita om hela plotten från början (som tar mycket mera tid). 'XData' är namnet på x-koordinaterna och de nya värdena ges av x-vektorn, analogt för 'YData' och y. pause-kommandot används för att få en lagom snabb animering (detta beror också på värdet på factor), men pause-kommandot framtvingar även en uppdatering av figurfönstret. Utan pause skulle vi bara se partiklarnas slutpositioner.

Följande kodsnutt visar hur man fyller på en existerande plot med nya detaljer. Jag plottar först en sinuskurva och sedan en cosinkurva. Sedan raderar jag de två kurvorna och ritar en arctangenskurva.

x = 0:0.05:5;           % skapa lite x-värden
figure                  % nytt fönster
plot(x, sin(x), 'r-')   % en röd, heldragen sinuskurva
hold on                 % håll kvar plotten
plot(x, cos(x), 'b--')  % en blå, streckad cosinuskurva

% vänta ett tag

hold off  % frigör plotfönstret, så nästa plot raderar de föregånede kurvorna
plot(x, atan(x), 'b--')  % en blå, streckad arctankurva


Back