Вызов функции с именем какого-либо объекта создает этот объект. Например, функция text создает объект text, функция figure создает объект figure и т.д. Графические функции MATLAB высокого уровня (такие как plot и surface) вызывают необходимые функции низкого уровня для отображения соответствующих графиков.
Функции низкого уровня просто создают один из одиннадцати графических объектов, определенных MATLAB (за исключением корневого объекта root, который создает только MATLAB), и возвращают его дескриптор. Например,
h = line ([1 3 6], [8 -2 0], 'Color', 'red')
Свойства объекта
Все объекты обладают свойствами, которые определяют, как они выводятся на экран. MATLAB предоставляет два механизма для задания свойств. Свойства объекта могут быть установлены функцией создания объекта или могут быть изменены функцией set, когда объект уже существует. Например, следующий фрагмент кода создает три объекта и заменяет некоторые из их свойств по умолчанию.
days = [ 'Su'; 'Mo'; 'Tu'; 'We'; 'Th'; 'Fr'; 'Sa' ]
temp = [ 21.1 22.2 19.4 23.3 23.9 21.1 20.0 ];
f = figure;
a = axes('YLim', [16 26], 'Xtick', 1:7, 'XtickLabel', days)
h = line(1:7, temp)
days - это массив символов, содержащий сокращения дней недели, a temp - это численный массив с типичной температурой. Окно изображений создается после вызова figure без аргументов, т.е. со значениями по умолчанию. Оси существуют внутри figure и имеют заданный диапазон по y и заданные метки для приращении но х. Линии существуют внутри осей и имеют заданные значения для данных по х и у. Три идентификатора объектов f, а и h сохранены для дальнейшего использования.
Set и get
Свойства объекта задаются или изменяются обращением к нему после его создания. Для этого используется дескриптор, возвращаемый создаваемой функцией.
|
Функция set позволяет устанавливать свойства объектов указанием дескриптора объекта и совокупности пар название свойства / значение. В качестве упражнения изменим цвет и ширину линии из предыдущего примера.
set (h, 'Color', [0.8.8], 'LineWidth', 3)
Для того, чтобы увидеть список всех доступных свойств заданного объекта, следует вызвать set с идентификатором объекта.
Set(h)
Color
EraseMode: [ {normal} | background | xor | none ]
LineStyle: [ {-} | -- |: | -. | none ]
LineWidth
Marker: [ + | o | * |. | x | square | diamond | v | ^ | > | < | pentagram | hexagram | {none} ]
MarkerSize
...
XData
YData
Zdata
...
Чтобы вывести список всех текущих установленных свойств заданного объекта, вызовете get с идентификатором объекта
Get (h)
Color = [0 0 1]
EraseMode = normal
LineStyle = -
LineWidth = [0.5]
Marker = none
MarkerSize = [6]
...
XData = [ (1 by 7) double array]
YData = [ (1 by 7) double array]
ZData = []
Для запроса значения отдельного свойства используйте get с именем свойства.
Get(h, 'Color')
ans =
0 0.8000 0.8000
Объекты axes имеют много детальных свойств для всего графика. Например, заголовок - title.
t = get(a, 'title');
Set(t, 'String', 'Temperature', 'FontAngle', 'oblique')
Функция title обеспечивает другой интерфейс к этим же свойствам.
Следующий пример демонстрирует возможность изменения оформления осей координат, что обеспечивает появление на оси ординат трех участков с одинаковой маркировкой. Вначале нарисуем три функции Бесселя со сдвигом по оси ординат на две единицы:
x = 0:.2:12; te = 'Функция Бесселя J_'; hold on
for k = 0:2, y = besselj(k, x); plot(x, 2*k+y)
s = strcat(te, num2str(k)); text(5, 2*k +.4, s), end
После этого можно запустить команду переназначения меток насечек, подставив свою последовательность чисел для параметра YtickLabel вместо автоматически сгенерированного возрастающего числового ряда
|
set(gca, 'YtickLabel', [-0.5 0 0.5 1])
В результате на рисунке каждой кривой будет отвечать отрезок оси ординат с правильными значениями для соответствующей функции Бесселя.
Графический Пользовательский Интерфейс (GUI)
Ниже приведен пример иллюстрирующий использование управляемой графики (Handle Graphics) для создания пользовательского интерфейса.
b = uicontrol('Style', 'pushbutton', 'Units', 'normalized',...
'Position', [.5.5.2.1], 'String', 'click here');
создает pushbutton в центре окна изображения (figure) и возвращает дескриптор нового объекта. Однако пока нажатие на эту кнопку ни к чему не приводит.
s = ' set(b,''Position'', [.8*rand.9*rand.2.1])';
создает строку, содержащую команду, которая меняет положение кнопки. Повторное использование
Eval(s)
будет передвигать кнопку в случайные места. Окончательно,
Set(b, 'Callback', s)
установит s в качестве обработки нажатия кнопки. Поэтому каждый раз, когда вы её нажимаете, она перемещается на новое место.
Анимация
MATLAB предоставляет несколько способов для создания двигающейся, анимационной графики. Использование свойства EraseMode предназначено для длинной последовательности простых графиков, где изменение от кадра к кадру минимально. Ниже представлен пример, имитирующий броуновское движение. Определим количество точек
n = 20;
Температуру или скорость как
s =.02;
Лучшие значения этих параметров зависят от скорости вашей машины. Сгенерируем n случайных точек с координатами (х,у) между -½ и ½.
x = rand(n,1)-0.5;
y = rand(n,1)-0.5;
Отобразим точки в квадрате со сторонами в пределах от -1 до 1. Сохраним дескриптор для вектора точек и установим свойство EraseMode равным хоr. Это укажет графической системе MATLAB не перерисовывать весь график, когда изменяется координата одной точки, а восстанавливать цвет фона в окрестности точки, используя операцию исключающего ИЛИ.
|
h = plot(x, y, '.');
axis([-1 1 -1 1])
Axis square
Grid off
set(h, 'EraseMode', 'xor', 'MarkerSize',18);
While 1
Drawnow
x = x + s*randn(n,1);
y = y + s*randn(n,1);
Set(h, 'Xdata', x, 'Ydata', y)
End
Сколько нужно времени, чтобы одна из точек вышла за пределы квадрата? Через какое время все точки окажутся вне квадрата? Сделайте необходимые добавления к программе, чтобы можно было ответить на эти вопросы.
Movie
Если сильно увеличить число точек в броуновском движении, например, n = 300, то в этом случае движение может оказаться не очень подвижным, так как потребуется слишком много времени на каждом шаге. Становится более эффективным сохранить определенное число кадров как bitmap и проигрывать их как кино.
Во-первых, пусть число кадров
nframes = 50;
Во-вторых, установим первый график как и ранее, за исключением использования EraseMode
х = rand(n,1)-0.5;
…
Set(h, 'MarkerSize', 18)
…
Grid off
Сгенерируем полученный фильм и используя getframe, сохраним каждый кадр.
Clear M
for k = 1:nframes
x = x + s*randn(n,1);
y = y + s*randn(n,1);
Set(h, 'XData', x, 'YData', y)
M(:, k) = getframe;
End
Теперь проиграем фильм
Movie(M)
Практикум
В примерах будут использоваться команды построения теплицевой матрицы, т.е. матрицы вида
Чтобы построить такую матрицу достаточно воспользоваться командой
Toeplitz(a,b),
причёмtoeplitz(a) =toeplitz(a,a).