Анимация в MATLAB

Как анимировать поверхность, если ее координаты изменяются во времени (например, эллипсоид) с помощью MATLAB?


person Kate    schedule 26.04.2010    source источник


Ответы (4)


Вот несколько примеров того, как вы можете анимировать графики в MATLAB...

Измените график в цикле for:

Вы можете создать цикл, в котором вы изменяете координаты поверхности, обновляете объект графика, используя set и используйте команду pause для приостанавливать каждую итерацию цикла на короткий период времени. Вот пример:

[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1);  % Make an ellipsoid shape
hMesh = mesh(x, y, z);                    % Plot the shape as a mesh
axis equal                                % Change the axis scaling
for longAxis = 4:-0.1:1
  [x, y, z] = ellipsoid(0, 0, 0, longAxis, 1, 1);  % Make a new ellipsoid
  set(hMesh, 'XData', x, 'YData', y, 'ZData', z);  % Update the mesh data
  pause(0.25);                                     % Pause for 1/4 second
end

Когда вы запустите приведенное выше, вы должны увидеть, как длинная ось эллипсоида сжимается, пока он не станет сферой.


Измените график с помощью таймера:

Вы также можете использовать объект таймера вместо цикла для выполнить обновления сюжета. В этом примере я сначала создам функцию timer_fcn, которую я хочу выполнять каждый раз, когда срабатывает таймер:

function timer_fcn(obj,event,hMesh)
  n = get(obj, 'TasksExecuted');  % The number of times the
                                  %   timer has fired already
  [x, y, z] = ellipsoid(0, 0, 0, 4-(3*n/40), 1, 1);  % Make a new ellipsoid
  set(hMesh, 'XData', x, 'YData', y, 'ZData', z);    % Update the mesh data
  drawnow;                                           % Force the display to update
end

Теперь я могу создать график и таймер и запустить таймер следующим образом:

[x, y, z] = ellipsoid(0, 0, 0, 4, 1, 1);  % Make an ellipsoid shape
hMesh = mesh(x, y, z);                    % Plot the shape as a mesh
axis equal                                % Change the axis scaling
animationTimer = timer('ExecutionMode', 'fixedRate', ...  % Fire at a fixed rate
                       'Period', 0.25, ...                %   every 0.25 seconds
                       'TasksToExecute', 40, ...          %   for 40 times and
                       'TimerFcn', {@timer_fcn, hMesh});  %   run this function
start(animationTimer);  % Start timer, which runs on its own until it ends

Это будет отображать ту же анимацию, что и в примере с циклом for. И как только вы закончите с объектом таймера, не забывайте всегда удалять его:

delete(animationTimer);
person gnovice    schedule 26.04.2010
comment
Действительно хорошо, только одно предложение. Измените переменную цикла for с i на k, i и j обычно используются для комплексных чисел. - person flopex; 27.04.2010
comment
Хотя я нахожу решение Anymate намного более удобным, его ответ является отличным примером для одновременного обучения дескрипторам и таймерам. +1 - person Jonas; 27.04.2010

Вы хотите, чтобы анимация отображалась на экране или сохранялась в виде видеофайла? Если вы хотите, чтобы анимация отображалась на экране, вы можете сделать так, чтобы ваша программа неоднократно перерисовывала график, который вы рисуете, с паузой там, как у Гновиса в его ответе, который только что появился.

Если вы хотите сохранить в файл для воспроизведения, я бы посоветовал взглянуть на функцию movie (учебник здесь) и, возможно, помощник mpgwrite из файлового обмена MATLAB.

person Michael Herold    schedule 26.04.2010
comment
В прошлом у меня был успех с mpgwrite. - person bta; 27.04.2010

Если вам нужен простой способ создания анимации, взгляните на ANYMATE от обмен файлами. Посмотрите справку к файлу и примеры, чтобы увидеть, как вы делаете анимацию в фигуре или создаете анимированные GIF-файлы.

Взгляните на обзор anymate в выборе недели для обмена файлами< /а>

ИЗМЕНИТЬ

Вот как можно анимировать эллипсоид из примера @gnovice с помощью anymate

%# create an sphere
[xs,ys,zs] = sphere; %# default is center at 0, radius 1
%# create an ellipsoid
[xe,ye,ze] = ellipsoid(0,0,0,4,1,1);

%# use anymate to interpolate between the two
anymate(@surf,{cat(3,xe,xs) cat(3,ye,ys) cat(3,ze,zs)});
%# color the surface
colormap(jet);
%# fix axes
axis equal

На рисунке будет панель инструментов «фильм», где вы можете нажать «воспроизведение» и посмотреть анимацию. Или вы можете сохранить его в файл.

person Jonas    schedule 26.04.2010

Одно небольшое отличие, которое я хотел обрисовать между двумя реализациями, приведенными выше:

1) пауза():

pause() можно использовать для простых анимаций с небольшим объемом данных. Это мой предпочтительный метод, так как он прост и понятен. Но я использую паузу только в том случае, если для анимации требуется мало данных, поскольку pause() блокирует обработку на указанное время.

2) Таймер: если я хочу анимировать спектрограммы или спектры и рассчитать их в «реальном времени» или синхронизировать их со звуком, я обычно использую объект таймера, который тем временем не блокирует обработку. Если я использую pause() с такими анимациями, синхронизация между звуком и анимацией быстро теряется...

person amir.audio    schedule 26.02.2013