Как анимировать поверхность, если ее координаты изменяются во времени (например, эллипсоид) с помощью MATLAB?
Анимация в MATLAB
Ответы (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);
Вы хотите, чтобы анимация отображалась на экране или сохранялась в виде видеофайла? Если вы хотите, чтобы анимация отображалась на экране, вы можете сделать так, чтобы ваша программа неоднократно перерисовывала график, который вы рисуете, с паузой там, как у Гновиса в его ответе, который только что появился.
Если вы хотите сохранить в файл для воспроизведения, я бы посоветовал взглянуть на функцию movie
(учебник здесь) и, возможно, помощник mpgwrite из файлового обмена MATLAB.
Если вам нужен простой способ создания анимации, взгляните на 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
На рисунке будет панель инструментов «фильм», где вы можете нажать «воспроизведение» и посмотреть анимацию. Или вы можете сохранить его в файл.
Одно небольшое отличие, которое я хотел обрисовать между двумя реализациями, приведенными выше:
1) пауза():
pause() можно использовать для простых анимаций с небольшим объемом данных. Это мой предпочтительный метод, так как он прост и понятен. Но я использую паузу только в том случае, если для анимации требуется мало данных, поскольку pause() блокирует обработку на указанное время.
2) Таймер: если я хочу анимировать спектрограммы или спектры и рассчитать их в «реальном времени» или синхронизировать их со звуком, я обычно использую объект таймера, который тем временем не блокирует обработку. Если я использую pause() с такими анимациями, синхронизация между звуком и анимацией быстро теряется...