3.1. Основные графические объекты и их использование.
Дело в том, что функции, реализующие те или иные действия по созданию графических объектов, а также сами эти объекты (такие как линии, оси, надписи и т.д.) фактически являются объектами в смысле объектно-ориентированного программирования.
В то же самое время большинство из них можно использовать как обычные функции, ничего не зная об их особенной природе.
При реализации же анимации приходится использовать эти особенности, поэтому мы должны вкратце познакомиться с ними.
Существует иерархия объектов:
рисунок (figure),
оси координат (axes),
линия (line).
Обычно старшие объекты называют «родителями», а младшие – их «детьми».
Существуют и другие объекты, но нам пока понадобятся только эти.
Всякий объект имеет дескриптор, которым он однозначно определяется , и набор свойств, таких как цвет, размер, способ вывода и т.д.
Полный список свойств любого объекта можно посмотреть с помощью системы помощи.
Многие свойства, без которых объекты не могут существовать, имеют свои значения по умолчанию. Поэтому можно вызывать объекты, не указывая никаких свойств , кроме обязательных.
Например, для функции line обязательно указать два массива x и y – координаты соединяемых точек. Для задания и/или изменения каких-либо свойств используется функция
set(handle, ’PropertyName’, ’PropertyValue’, ...).
Необходимо только знать имя дескриптора соответствующего объекта handle, имя соответствующего свойства ’PropertyName’ и какие значения оно (свойство) может принимать.
Например, в приведенном далее примере, цвет (зеленый -’g’) отрисовываемого объекта line c дескриптором h задается оператором
set(h, ’color’, ’g’).
Для получения значения какого-либо свойства или его присвоения другой переменной используется оператор get.
Полезно будет заметить, что свойства родительских объектов наследуются объектами-детьми. Поэтому при неизбежно поверхностном знакомстве с системой, внося изменения в свойства каких-либо объектов, мы можем получить иногда непредвиденные изменения в работе программ. (Фактически это свойство унаследовано системой MATLAB от языка C++, на котором она написана.)
3.2. Отрисовка движущихся кривых.
MATLAB предоставляет различные способы создания движущихся графиков или анимации.
Использование свойства графических объектов ’EraseMode’ (режим стирания) удобно для длинных последовательностей простых графиков , у которых изменение от кадра к кадру минимально.
Рассмотрим это на примере динамического вывода волны (программа WAVEPAK).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Программа WAVEPAK предназначенная для вывода %
% волнового пакета с анимацией изображения %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t=0:0.1:100; % Задание вектора времени
x=0:0.3:30; % Задание вектора координат
k=1.3; w=0.9; n=length(t);
% Вычисление формы волны для момента времени t(1)
% во всех точках x
y=cos(k*x-w*t(1))+cos(x-t(1));
h=line(x,y); % Подготовка графика волны и присвоение
% дескриптора этой линии переменной h
% Задание цвета объекта (линии) с дескриптором h
% через свойство ’color’
set(h,’color’,’g’);
axis([0 30 -3 3]);% Выбор осей координат и их масштаб
axis manual;
% Сохранение дескриптора линии волны и выбор значения
% свойства ’EraseMode’ равным ’xor’. Это сообщает
% графической системе MATLAB, чтобы она не
% перерисовывала весь график (включая оси, цвет фона
% и те точки, которые не изменились), а перерисовала
% только те точки, которые изменили свои координаты.
set(h,’EraseMode’,’xor’);
pause; % Пауза перед запуском движения волны.
% Она гарантирует обязательный вывод на экран,
% накопленного в буфере графики. Дальнейшее
% продвижение осуществляется нажатием на любую клавишу.
% Можно задать pause(0), тогда нажимать клавишу не надо
% Основной цикл вычисления и вывода движущейся волны
for i=2:n;
% Вычисление формы волны для момента времени t(i)
y=cos(k*x-w*t(i))+cos(x-t(i));
% Обновление координат линии, изображающей амплитуду
% волны с помощью обновления у объекта (линии)
% с дескриптором h свойства ’XData’ ( замена
% x-координат на новые значения ) и аналогичные
% действия с y-координатами. Это стандартный
% способ обновления координат точек для анимации.
set(h,’XData’, x,’YData’,y);
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Аналогичным образом можно создавать любые движущиеся графики.
Проблема возникает тогда, когда скорость компьютера такова, что лимитирующим фактором плавного вывода на экран является скорость расчета новых точек. В таких случаях либо улучшают (ускоряют) алгоритм расчета, либо готовят анимацию путем последовательной покадровой записи результатов вывода на экран с последующим прокручиванием получаемого файла в режиме анимации (мультфильма).