Как уже отмечалось, графические средства MATLAB базируются на низкоуровневой графике, которая называется дескрипторной (описательной), или handle графикой. По существу, эта графика обеспечивает объектно-ориентированное программирование как всех рассмотренных выше графических команд, так и пользовательского интерфейса. Графический редактор дескрипторной графики Property Editor в MATLAB 6 является основным редактором графики и нами уже использовался. Хотя обычный пользователь может даже не знать о существовании дескрипторной графики ввиду того, что слово «дескрипторная» в сокращенное название графического редактора не входит, все же надо учитывать, что именно дескрипторная графика дает новые, подчас уникальные возможности создания пользовательских графических программ MATLAB 6, не говоря уже о том, что она помогает понять, каким образом реализованы графические средства системы.
Центральным понятием дескрипторной графики является графический объект. Имеются следующие типы таких объектов:
· figure (рисунок) — объект создания графического окна;
· uicontrol (элемент управления, определенный пользователем) — объект создания элемента пользовательского интерфейса;
· axes (оси) — объект, задающий область расположения графика в окне объекта figure;
· uimenu (определенное пользователем меню) — объект создания меню;
· uicontextmenu (определенное пользователем контекстное меню) - объект создания контекстного меню;
· image (образ) — объект создания растровой графики;
· line (линия) — объект создания линии;
· patch (заплата) — объект создания закрашенных фигур;
· rectangle (прямоугольник) - объект создания закрашенных прямоугольников;
· surface (поверхность) — объект создания поверхности;
· text (текст) — объект создания текстовых надписей;
· light (свет) — объект создания эффектов освещенности.
Объекты подчас взаимосвязаны и могут обращаться друг к другу для получения того или иного графического эффекта.
Создание графического окна и управление им
Прежде чем мы рассмотрим применение дескрипторной графики на реальных примерах, отметим команды и функции, которые предназначены для создания графических окон и управления ими:
· figure — открыть чистое графическое окно;
· gcf — получить дескриптор графического окна figure;
· elf — очистить графическое окно;
· shg — показать ранее свернутое графическое окно;
· close (закрыть) — закрыть графическое окно;
· refresh (обновить) — обновить графическое окно.
Эти команды и функции достаточно очевидны, и мы не будем обсуждать их подробно. Заметим, что команды help name или doc name позволяют уточнить назначение той или иной команды или функции с обобщенным именем name.
Создание координатных осей и управление ими
Еще одна группа простых команд служит для создания координатных осей и управления ими:
· axes (оси) — создать оси координат;
· box (ящик) — построить прямоугольник вокруг рисунка;
· сlа — убрать построения axes;
· gса — получить дескриптор графического объекта axes;
· hold — сохранить оси координат;
· ishold — проверка статуса hold (1, если оси сохранены, и 0 в противоположном случае).
Эти команды также достаточно очевидны. Заметим, что их можно использовать и в обычной (высокоуровневой) графике, например для устранения осей из уже созданного графика.
Пример применения объекта дескрипторной графики
Объем и направленность данной книги не позволяют подробно описать все многообразие возможностей дескрипторной графики. Ограничимся пока одним примером. Пусть надо построить линию,-проходящую через три точки с координатами (0,1), (2,4) и (5,-1). Для этого воспользуемся объектом line, который порождается одноименной графической функцией:
» line([0 2 5],[1 4 -1],'color ', 'blue')
На рис. 7.5 построена заданная линия с помощью дескрипторной команды line, которая явно не входит в высокоуровневую графику. Однако нетрудно понять, что именно эта команда составляет основу высокоуровневой команды pi ot, описанной ранее.
Особенность команды 1 i ne заключается в явном задании всех условий построения графика: координат конкретных точек, параметра цвета 'Color' и самого цвета 'blue' (синий). В итоге строятся два отрезка прямой, проходящих через заданные точки и имеющие синий цвет.
Рис. 7.4.Построение отрезков прямой объектом line
Дескрипторы объектов
С понятием объектов дескрипторной графики связана особая характеристика объектов — дескриптор (описатель). Его можно понимать как некое число — своеобразный идентификатор («распознаватель») объектов.
Рис. 7.5.Графики пяти функций, представляющих значения элементов магической матрицы magic(5)
Дескриптор объектов root всегда равен 0, а дескриптор объектов figure (рисунок) — это целое число, указывающее на номер графического окна. Дескрипторы других объектов — это числа с плавающей запятой. По значениям дескрипторов MATLAB идентифицирует объекты. Дескриптор одного такого объекта представляет собой одно число, а если объектов несколько — несколько чисел (вектор). Например, следующие команды строят пять графиков, представляющих значения элементов магической матрицы (магического квадрата), в одном окне:
» A=magic(5);
» h=plot(A)
h=
3.0013
101.0009
102.0004
103.0004
104.0004
В данном случае вектор h содержит дескрипторы элементов графика, показанного на рис. 7.5.
Мы еще раз обращаем ваше внимание на то, что дескрипторы дают лишь внутреннее описание того или иного объекта и ассоциировать их явно с привычными параметрами, например координатами или цветом объекта, не следует. Более того, нет никаких оснований считать их одинаковыми для разных версий MATLAB, для разных компьютерных платформ и даже для одинаковых команд, но в разных местах сессии.
Операции над графическими объектами
К графическим объектам применяется ряд операций:
· set — установка свойств (параметров) графического объекта;
· get — вывод свойств графического объекта;
· reset — восстановить свойства графического объекта по умолчанию;
· gcbo — возвращает дескриптор объекта, чья функция в данный момент выполняется;
· gcbf — возвращает дескриптор окна, содержащего объект, функция которого в данный момент выполняется;
· drawnow — выполнить очередь задержанных графических команд;
· findobj — найти объекты с заданными свойствами;
· copyobj — скопировать объект и порожденные им объекты.
Кроме того, имеются три утилиты, связанные с операциями над объектами:
· closereq — закрыть окно по запросу;
· ishandle — проверить дескриптор на истинность;
· newplot — восстановить свойства объекта, измененные nextPlot.
Назначение большинства этих операций достаточно очевидно. Мы остановимся на двух наиболее важных операциях, связанных с контролем и установкой свойств объектов.
Свойства объектов — команда get
Каждый объект дескрипторной графики имеет множество параметров, определяющих его свойства. Вернемся к нашему примеру с построением графика из двух отрезков линии и повторим этот пример в следующем виде:
» h=line([0 2 5].[1 4 -1],'Color','blue')
h =
3.0010
Теперь объект имеет дескриптор h и его значение выведено наряду с построением графика. Команда get (name) выводит свойства объекта с заданным именем. Для нашего объекта это выглядит следующим образом:
» get(h) Color = [001]
EraseMode = normal
LineStyle=-
LineWidth = [0.5]
Marker = none
MarkerSize = [6]
MarkerEdgeColor = auto
MarkerFaceColor = none
XData = [0 2 5]
YData = [14 -1]
ZData - []
BeingDeleted = off
ButtonDownFcn =
Children = []
Clipping = on
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [100.001]
Selected =off
SelectionHighlight = on
Tag =
Type=line
UIContextMenu = []
UserData = []
Visible = on
Изменение свойств объекта — команда set
С помощью команды set можно изменить отдельные свойства объекта дескрипторной графики. Эта команда имеет множество параметров, и с ними можно ознакомиться с помощью команд help set или doc set. Ограничимся примером — допустим, нам надо сменить цвет линии с голубого на красный. Для этого достаточно выполнить следующую команду: » set(h,'Color'.'red')
Обратите внимание, что при этом цвет сменится на ранее построенном рисунке с дескриптором h.
Управление работой средств OpenGL
Как уже неоднократно отмечалось, одной из новинок системы MATLAB 6 является поддержка графических средств OpenGL. Эти средства обычно используются чаще всего при реализации трехмерной графики, например при осуществлении сло.жной функциональной окраски поверхностей и трехмерных фигур с учетом характера освещения и структуры материала (рендеринг), при осуществлении анимации для таких объектов, при построении поверхностей из многоугольников, осуществлении эффектов прозрачности и т. д. Целый ряд примеров этого уже приводился как в уроке 6, так и в данном уроке.
Средства OpenGL в MATLAB задействованы автоматически. Это значит, что они будут использованы, если видеокарта компьютера пользователя поддерживает их и если установлены соответствующие драйверы видеоадаптера. На уровне средств стандартной графики MATLAB никаких функций управления OpenGL нет. Однако дескрипторная графика такую возможность предоставляет с помощью команды opengl selectionjnode
Эта команда задает графические режимы осуществления рендеринга. Параметр selectl onjnode может принимать следующие значения:
· autosel ect — задает автоматическое применение OpenGL и вводит в работу средства OpenGL при наличии возможностей для этого;
· neverselect — отключает автоматическое применение OpenGL;
· advise — выводит сообщение о возможности применения OpenGL, но режим рендеринга (RenderMode) устанавливается вручную.
Просто команда opengl выводит сообщение о текущем значении selectionjnode, например:
» opengl
ans =
AutoSelect
А команда opengl info выводит данные о средствах OpenGL ПК, на котором установлена система MATLAB, например:
» opengl info
Version = 1.1.0
Vendor = Microsoft Corporation
Renderer = GDI Generic
MaxTextureSize = 1024
Extensions = GL_WIN_swapJiint GL_EXT_bgra
GL_EXT_paletted_texture
Возможно также управление средствами рендеринга и OpenGL на уровне средств дескрипторной графики с помощью команды set, например: set(gcf.'Renderer','OpenGL')