Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практикум по матлабу.pdf
Скачиваний:
156
Добавлен:
29.03.2015
Размер:
1.19 Mб
Скачать

8.4.Дескрипторная графика (графика низкого уровня)

Этот и следующие разделы будут посвящены графике низкого уровня, которую на русском языке принято называть дескрипторной. В них будут описаны средства решения целого ряда задач, которые не могут быть решены с помощью описанных в разделах 8.1- 8.3 функций высокого уровня.

8.4.1.Графические объекты и их иерархия

Прежде всего познакомимся с понятием графический объект. Графические объекты - это те базисные объекты, из которых на экране возникает изображение. Даже самый элементарный график состоит из нескольких графических объектов. Это окно, в котором выводится график, линии, оси, метки на осях и т.д. Все графические функции высокого уровня, описанные ранее, создавали такие графические объекты как линии (line), оси (axes) и др. Все эти объекты являются строительными блоками, из которых MATLAB создает различные изображения.

Существуют графические команды низкого уровня, которые создают 10 типов графических объектов в дополнение к корневому объекту, который создается автоматически при входе в MATLAB. Эти команды и создаваемые ими объекты перечислены в таблице.

Объект

Команда низкого уровня

 

 

Figure(рисунок)

figure

Axes (оси)

axes

Line(линия)

line(x,y) или line(x,y,z)

Patch (заплата)

patch(x,y,c) или patch(x,y,z,c)

Surface (поверхность)

surface(X,Y,Z,C), surface(X,Y,Z)

 

surface(Z,C), surface(Z)

Image (картинка)

image(C) или image(x,y,C)

Light (освещение)

light(’Prop_name’,’Prop_value’,...)

Text (текст)

text(x,y,text_str) или

 

text(x,y,z,text_str)

User Interface Control

uicontrol

(интерактивное управление)

 

User Interface Menu

uimenu

(меню)

 

 

 

Переменные x,y и z, используемые в качестве аргументов команды line, являются векторами или матрицами одинаковой длины, и они задают последователь-

148

ность координат кривой (или кривых - если переменные матрицы). В случае матриц каждая кривая определяется столбцами соответствующих матриц.

Переменные x,y и z, используемые в качестве аргументов команды patch, являются координатами вершин соответствующего многоугольника (заплатки). Переменная c используется для задания цвета заливки многоугольника.

При создании поверхности (команда surf) X,Y и Z являются матрицами, описывающими координаты четырехугольников, которыми аппроксимируется поверхность. Переменная C определяет цвет.

Размещение текстового объекта (строка text_str) определяется переменными x,y и z. По умолчанию первая буква строки прижимается левым краем и центрируется по вертикали к точке x,y или x,y,z.

Команда light сама не создает какого-либо нового изображения, а только определяет освещение объектов patch и/или surf. Объекты (и соответствующие команды) взаимодействия с пользователем будут описаны в соответствующем месте.

Графические объекты системы MATLAB являются не только физическими объектами, но и объектами в смысле объектно-ориентированного программирования. В связи с этим они связаны иерархической структурой типа родители-дети. Каждый объект-наследник не может появиться без появления соответствующего предка. Например, линия (line) не может быть нарисована перед тем, как будут созданы оси (axes) и рисунок (figure). К счастью, вы не должны сами с помощью команд низкого уровня создавать всю последовательность объектов. Как только вы создадите кривую, например с помощью команды plot(1:10), соответствующие рисунок и оси будут созданы автоматически. С другой стороны, вам не возбраняется написать последовательность низкоуровневых команд типа

figure;

axes;

plot(1:10);

Если после создания рисунка вы закроете его, например с помощью команды close, то при этом исчезнут и дети, т.е. оси и линии. То же самое происходит при использовании команды delete (удалить). Иерархическая структура объектов показана на рис. 7. Основным или корневым объектом root является экран. Он генерируется автоматически при вхождении в систему MATLAB. Рисунок (figure) является следующим в иерархии объектом, и он либо создается специально одноименной командой, либо генерируется при вызове высокоуровневых команд, описанных ранее. При необходимости можно создавать много рисунков, ограничением является только количество памяти у вашего компьютера. Все последующие (после figure)

149

Рис. 7. Иерархическая структура графических объектов

команды осуществляют вывод в текущее окно. Простейшим способом сделать тот или иной рисунок текущим используется команда figure(num), где num - это номер рисунка, который выводится вверху соответствующего окна.

Рисунок (figure) имеет четыре наследника. Три из них - uicontrol, uimenu и Uicontextmenu являются объектами, предназначенными для создания интерфейса пользователя, и о них мы поговорим позже. Объект оси (axes) определяет область вывода детей данного объекта на рисунке. Таких областей может быть несколько, каждая со своими наследниками (т.е. линиями, текстами, поверхностями и т.д.). Это аналогично использованию команды высокого уровня subplot, но обладает более гибкими возможностями.

8.4.2. Дескрипторы и работа с ними

Для того чтобы манипулировать упомянутыми выше, а также другими объектами в системе MATLAB, используются дескрипторы графических объектов (graphics object handles). Эти дескрипторы можно воспринимать как метки, ярлычки соответствующих объектов. Их нельзя изменять. Они создаются и уничтожаются вместе с объектами, но каждый объект однозначно определяется своим дескриптором. Дескриптор экрана (root) и дескриптор рисунка (figure) имеют целые значения, все остальные дескрипторы имеют значения вещественные.

Все функции низкого уровня и большинство функций высокого уровня возвращают значение дескриптора, если они вызываются с выходным аргументом, т.е. в виде graph_handl=function_name.

Например, мы можем создать такие объекты, как рисунок, оси и линию, и сохранить значения их дескрипторов в переменных fig_han, axes_han и line_han с помощью последовательности операторов

fig_han = figure;

150

axes_han = axes;

line_han = plot(exp(-([-3:3].^2)))

Если при вызове, например, функции высокого уровня plot создается несколько однотипных объектов (несколько линий), то возвращаемый дескриптор является вектор-столбцом. Хотя, как мы знаем, объекты-предки, не созданные явно заранее, создаются в процессе создания объекта-наследника, тем не менее, используя только третью строку вышеприведенного примера, мы создадим рисунок и оси, но их дескрипторы не узнаем во время создания самих объектов. Как узнать дескриптор объекта после его создания, будет описано далее.

Не все функции высокого уровня при обращении к ним в виде h=f() возвращают дескрипторы соответствующих объектов. Не возвращают дескрипторы следующие функции:

bar

compass

errorbar

feather

fplot

hist

polar

rose

stairs

quiver

sphere

cylinder

 

 

 

 

Если вы не сохранили дескриптор рисунка, осей или других созданных объектов, их дескриптор можно получить с помощью ряда команд. Например, дескриптор текущего рисунка можно получить с помощью команды gcf(get current figure), дескриптор текущих осей (т.е. тех осей, в которых сейчас будет происходить рисование) можно получить с помощью команды gca(get current axes). Если на рисунке несколько осей, то мы получим дескриптор той области рисования, которая была создана последней или внутри которой последним создавался какой-либо объект. Существует на рисунке еще объект, который называется текущим. Это такой объект, который был последним создан, с которым последним производили манипуляции или на котором последним щелкали мышкой. Дескриптор такого объекта можно получить с помощью команды gco(get current object).

Если тем или иным способом вы сохранили дескрипторы объектов, то вы можете делать текущим тот или иной объект (т.е. переходить от объекта к объекту) с помощью команд figure(fig_handl) и/или axes(axes_handl).

Дескрипторы, или функции, возвращающие дескрипторы (gcf, gca и др.), могут использоваться в качестве аргументов функций, которые изменяют или устанавливают те или иные свойства объектов. Это прежде всего описанные далее функции get и set.

Одним из самых популярных способов узнать и/или использовать дескриптор объекта является обращение к функции findobj. Если эту функцию использовать без параметров, то в результате она выдаст список всех дескрипторов объекта Root

151