Как мне анимировать поверхность, если она координирует изменение во времени (например, эллипсоида) с помощью MATLAB?
Анимация в MATLAB
Ответ 1
Вот несколько примеров способов анимации графиков в 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-loop. И как только вы закончите с объектом таймера, не забудьте всегда его удалять:
delete(animationTimer);
Ответ 2
Хотите ли вы отображать анимацию на экране или сохранить ее в виде видеофайла? Если вы хотите, чтобы анимация отображалась на экране, вы можете повторно перерисовать сюжет, который вы нарисовываете, с паузой там, как gnovice в своем ответе, который только что появился.
Если вы хотите сохранить файл для повтора, я бы предложил посмотреть функцию movie
(учебник здесь) и, возможно, вспомогательный инструмент mpgwrite из обмена файлами MATLAB.
Ответ 3
Если вам нужен простой способ создания анимации, просмотрите ANYMATE из обмена файлами. Посмотрите на помощь в файле и примерах, чтобы увидеть, как вы делаете анимацию на фигуре или создаете анимированные gifs.
Посмотрите обзор любого участника в выбор файла обмена за неделю
ИЗМЕНИТЬ
Здесь вы можете оживить эллипсоид из @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
На рисунке появится панель инструментов "movie", в которой вы можете нажать "играть" и посмотреть анимацию. Или вы можете сохранить его в файл.
Ответ 4
Одна небольшая разница, которую я хотел выделить между двумя реализациями, приведенными выше:
1) pause():
pause() может использоваться для простых анимаций с небольшими данными. Это мой предпочтительный метод, поскольку он прост и понятен. Но я использую паузу, если анимация требует мало данных, так как pause() блокирует обработку для заданного времени.
2) Таймер: Если я хочу оживить спектрограммы или спектры и вычислить их в режиме реального времени или синхронизировать их со звуком, я обычно использую объект таймера, который не блокирует обработку в то же время. Если я использую pause() с такими анимациями, синхронизация между аудио и анимацией быстро теряется...