Animación en MATLAB

Muchas veces es útil realizar animaciones en Matlab, bien sea por motivos didácticos o caprichos del programador. En este caso es más un capricho que quiero cumplir porque pienso realizar un videojuego en Matlab (o al menos tengo la intención).

¡Manos a la obra!


El concepto:

¿Qué es una animación? -> Al menos en el ámbito 2D se puede ver como una sucesión de imágenes (frames), una tras otra  a cierta velocidad (framerate).

¿Cómo lo logramos en Matlab? -> Supongo que ya sabemos realizar gráficos en Matlab (señales, funciones matemáticas, esas cosas...)  así que la idea es seguir realizando gráficos como sabemos, pero si actualizamos cada gráfico constantemente, uno diferente del anterior, obtendremos la dichosa animación o sensación de movimiento.

Realización:

Vamos a graficar una partícula que se mueva de forma que sigue la onda sinusoidal. Es simple, lo que tenemos que hacer primero es generar los datos de la onda sinusoidal:

x=0:1:360; 
y=sind(x);

Ahora, para graficar con plot() a la partícula, ponemos algo como:

plot(x(85),y(85))

Esto mostrará un punto en la coordenada x=84 y y=seno(84°).
Luego, si graficamos

plot(x(86),y(86)) y luego plot(x(87),y(87)) y luego plot(x(87),y(87)) vamos a ver que el puntito se estará desplazando hacia una nueva posición cada vez. No podemos escribir comando a comando para realizar la animación, eso no es programar! u_u así que usaremos un bucle. Puede ser un For o un while, no importa cual siempre y cuando los usemos correctamente. Vamos a usar un While porque... pues porque sí :v

la idea es hacer algo como:

i=0;
while 1

    i=i+1;
    plot(x(i),y(i))
    drawnow
end

El comando drawnow obliga a actualizar la imagen justo en ese momento. Nuestro vector x tiene 361 elementos, ¿Qué sucede entonces si i alcanza un valor superior a 361? Arrojará un error evidentemente ya que no existe el elemento x(362) y tampoco y(362), así que debemos poner una restricción sobre ese asunto.

s=size(x);
i=0;
while

    i=i+1;
    if i > s(2) 
        break 
    end

    plot(x(i),y(i)) 
    drawnow
   
end

el comando break rompe el ciclo, así que si i alcanza un valor superior a 361, pues el programa sale del while y finaliza.

Ahora hay algo que debemos tener en cuenta ¿Recuerdan que les hablé de la velocidad en el refresco de las imágenes? Pues Matlab ejecutará nuestro código a la velocidad que le de la gana (ya sé, no es tan así, pero ustedes me entienden). De manera que nosotros debemos pautarle esa velocidad, y una forma de hacerlo es poner una pequeña pausa después de que actualice la gráfica. Con 0.05 segundos está bien! Y bueno, decorando un poquito el punto para que se vea mejor, y dejando a los pinches ejes quietecitos, tenemos finalmente este código:


clear all
clc

%Se va a dibujar la curva seno:
x=0:1:360; %<--Vector de grados
y=sind(x);

%cálculo del tamaño del vector x
s=size(x);

%inicialización de la variable de conteo.
i=0;
while 1 %<-- Ciclo infinito
    i=i+1;
    if i > s(2) %<--Si el sub-índice supera el tamaño del vector X, debe romper el ciclo.
        break %<-- Sale del ciclo.
    end
    plot(x(i),y(i),'r*','LineWidth',6)
    axis([0 361 -1 1]);
    drawnow
    pause(.05)
end

Espero que haya sido útil :)