Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекция 6. Основы дескрипторной графики

..pdf
Скачиваний:
136
Добавлен:
28.03.2016
Размер:
506.31 Кб
Скачать

Лекция 6

 

Лекция 6. Основы дескрипторной графики.

 

1. Введение в дескрипторную графику. ..................................................................................................

1

1.1. Понятие объектно-ориентированного программирования. .....................................................

1

1.2. Основные объекты дескрипторной графики. .............................................................................

2

Создание и управление объектами. ........................................................................................................

3

Свойства графических объектов. Функции get и set. ........................................................................

5

Примеры использования дескрипторной графики................................................................................

6

1.Введение в дескрипторную графику.

1.1.Понятие объектно-ориентированного программирования.

С момента возникновения компьютера, в эволюции систем программирования произошли значительные изменения. На первоначальном этапе в распоряжении программистов были низкоуровневые языки программирования типа ассемблера, с помощью которых можно было создавать небольшие программы размером, не превышающим нескольких десятков байт. В настоящее время их использование ограничивается написанием небольших системных приложений, драйверов устройств, вирусов и т.п.

Наиболее эффективными, с точки зрения производительности труда программистов, стали так называемые языки программирования высокого уровня, такие как C, Basic, Pascal и др. Разрабатывать программы на языках высокого уровня значительно проще, а ошибок при создании программ допускается гораздо меньше. Заложенные в языках высокого уровня идеи структурного (процедурного) программирования позволил программистам в разумные сроки (несколько месяцев) создавать приложения объемом в сотни тысяч строк. Однако такой объем уже приблизился к пределам возможностей человека, и потребовались новые технологии программ.

В начале 80-х годов в программировании возникло новое направление – объектно-

ориентированное программирование (ООП), основанное на понятии объекта. С появлением этого направления связывают значительное развитие как самих языков высокого уровня (на смену вышеупомянутым языкам пришли C++, Visual Basic, Object Pascal и др.) так и программного обеспечения в целом. До того времени основные ограничения на возможность создания больших и надежных систем накладывалась разобщенность в программе данных и методов. Для решения этой проблемы была взята аналогия из окружающего мира.

Реальные объекты окружающего мира обладают тремя базовыми характеристиками: они имеют набор свойств, способны разными методами изменять эти свойства и реагировать на события, возникающие как в окружающем мире, так и внутри самого объекта. Именно в таком виде в языках программирования и реализовано понятие объекта как совокупность свойств (структур данных, характерных для этого объекта), методов их обработки (подпрограмм изменения свойств) и событий, на которые данный объект может реагировать и которые приводят, как правило, к изменению его свойств.

Появление возможности создания объектов в программах качественно повлияло на производительность труда программистов. Максимальный объем приложений, которые стали доступны для создания группой программистов из 10 человек, за несколько лет увеличился до миллионов строк кода, при этом одновременно удалось добиться высокой надежности программ и, что не маловажно, повторно использовать ранее созданные объекты.

Система MATLAB не является в полной мере объектно-ориентированной средой программирования, тем не менее, графические возможности системы, а также организация диалогового взаимодействия с пользователем основаны на концепции ООП.

1

Лекция 6

1.2. Основные объекты дескрипторной графики.

MATLAB предоставляет в распоряжение программиста так называемую дескрипторную или управляемую графику (Handle Graphics), основанную на низкоуровневых графических функциях. Дескрипторная графика, в отличие от высокоуровневой графики, которой была посвящена лекция 2, позволяет получить доступ к свойствам всех графических объектов и изменять их по своему усмотрению.

Все графические элементы (графическое окно, оси, линии, поверхности, текстовые области и т.д.) являются объектами и являются основой управляемой графики в MATLAB. Объекты расположены в определенной иерархической структуре (см. рис. 1). Этим отражается связь графических объектов. Например, графическому окну (Figure) может принадлежать одна или несколько пар осей (Axes) со своими объектами: линиями (Line), поверхностями (Surface) или текстом (Text). То есть линия, поверхность или текст не могут просто быть выведены в графическое окно – в нем обязательно должны находиться оси, которым принадлежат эти объекты. Такая связь между объектами определяет отношение "Родитель-Потомок" (Parent-Children). "Родителем" для объекта может быть только объект того типа, который расположен выше на диаграмме рис.1.

Root

Figure

Axes

 

UI Objects

Image

 

 

Line

 

Surface

 

 

Text

 

 

 

 

 

 

 

 

 

 

Light

 

 

Rectangle

 

Patch

 

 

 

Рис. 1 Иерархия объектов системы MATLAB.

 

 

1Объект Root является вершиной иерархии. Он соответствует экрану компьютера. MATLAB автоматически создает его вначале сеанса работы. Мы не будем изучать этот объект, единственно отметим, что его описатель (дескриптор, см. дальше) всегда равен 0.

2Объекты Figure представляют собой известные нам графические окна системы

MATLAB.

3Группа объектов, объединенных на рисунке под общим названием UI Objects представляют собой широко известные и достаточно стандартизированные графические элементы управления, такие как кнопки, раскрывающиеся списки, редактируемые поля ввода и т.д. Эти объекты будут подробно рассмотрены дальше при изучении темы: графический интерфейс пользователя.

4Объекты Axes определяет область в окне Figure, предназначенную для вывода графических изображений, и ориентацию дочерних объектов в этой области. Они являются наиболее сложными, ибо содержат довольно много составляющих – собственно оси с их подписями, легенды, возможность увидеть объект из разных позиций наблюдателя и многое другое.

5Объекты Image предназначены для воспроизведения растровых изображений, которые либо считываются из графических файлов, либо специальным образом формируются в

2

Лекция 6

оперативной памяти. Это двумерные объекты, которые выводит MATLAB, используя элементы прямоугольного массива как индексы в палитре.

6 Объекты Line являются основными графическими базисными элементами для большинства двумерных графиков. Они создаются почти всеми функциями построения плоских и пространственных кривых (plot, loglog, plotyy, plot3, fplot и др.), которые возвращают указатель (дескриптор, см. дальше) на появившуюся кривую. Объект Line мы более рассмотрим далее.

7Объекты Surface – это трехмерное представление данных матрицы, созданное путем графического отображения данных как высот над плоскостью x-y. Объекты этого типа создаются 3-D графическими функциями построения поверхностей: surf, surfl, mesh и др.

8Объекты Text представляют собой строку символов и предназначены для вывода информации в графическом окне.

9Объекты Light определяют источник света, действующий на все объекты в пределах

Axes.

10Объекты Rectangle используются для отображения прямоугольников, прямоугольников с закругленными краями и эллипсов.

11Объект Patch (полигональный объект) представляет собой один или несколько многоугольников на плоскости, или фигуру с одной или несколькими гранями в трехмерном пространстве. Свойства объекта Patch допускают гибкое управление его цветом – от постоянного до изменяющегося по заданному закону. Универсальность

полигональных объектов позволяет моделировать сложные двумерные и трехмерные физические объекты.

На рисунке 2 приведены примеры некоторых графических объектов.

Объект figure

Объект surface

Объекты line

Объекты axes

Рис. 2 Графические объекты.

Создание и управление объектами.

Для того чтобы манипулировать упомянутыми выше, а также другими объектами в системе

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

3

Лекция 6

Вызов одноименной с именем какого-либо объекта функции создает этот объект. Например, функция figure создает объект figure, функция text создает объект text и т.д. Графические функции MATLAB высокого уровня (такие как plot, surf) вызывают необходимые функции низкого уровня для отображения соответствующих графиков. Все функции низкого уровня и большинство функций высокого уровня возвращают значение дескриптора, если они вызываются с выходным аргументом, т.е. в виде

handl_graph=function_name.

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

hfig = figure; haxes = axes;

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

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

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

figure(handl_fig)

и/или axes(handl_axes).

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

Одним из самых популярных способов узнать и/или использовать дескриптор объекта является обращение к функции findobj. Если эту функцию использовать без параметров, то в результате она выдаст список всех дескрипторов объекта Root и всех его наследников. При использовании функции в виде H=findobj(hl), где hl -дескриптор какого-нибудь созданного объекта, будет возвращен и занесен в массив H список дескрипторов данного объекта и всех его наследников. При использовании же этой функции в виде

h=findobj('Имя_Свойства','Значение_Свойства')

будет получен список всех дескрипторов объектов, у которых свойство с именем 'Имя_Свойства' имеет значение 'Значение_Свойства'. Если таких объектов окажется несколько, то будет получен вектор дескрипторов.

4

Лекция 6

Свойства графических объектов. Функции get и set.

Каждый из объектов, упомянутых выше, имеет набор свойств, которые ассоциируются только с ним. В этих свойствах заключается вся информация, которая необходима для того, чтобы этот объект был выведен на экран. В момент создания объекта те свойства, которые вы не определили, принимают свои значения по умолчанию. Всякое свойство имеет имя ('Property_Name') и значение, в качестве которого может быть строка, вектор или матрица. Для того чтобы работать со свойствами объектов, вовсе не обязательно помнить все их имена и их возможные значения.

Не обязательно также постоянно консультироваться со справочной системой или с руководством. Для определения имен свойств и возможных значений этих свойств, а также для изменения их значений имеются две функции get и set.

Для того чтобы получить полный список имен свойств некоторого графического объекта с дескриптором h, достаточно ввести команду get(h). Следует при этом отметить, что этот объект должен быть создан, пусть даже формально. Например, если вы хотите определить, какие свойства имеет объект line, то достаточно определить дескриптор линии командой hl=line(1,1) или даже просто hl=line, после чего можно будет с помощью команды get(hl) определить список имен свойств, а также присвоенные им на данный момент значения. Большинство свойств имеет вполне понятные имена (конечно, для знающего английский язык). Например, легко увидеть, что у объекта line(линия) имеются свойства

Color = [0 0 0]

Цвет = [0 0 0]

EraseMode = normal

Режим стирания = normal

LineStyle = -

Стиль линии = -

LineWidth= [0.5]

Ширина линии = [0.5]

Marker = none

Маркер = none

MarkerSize = [6]

Размер маркера = [6]

MarkerEdgeColor = auto

Цвет контура маркера = auto

MarkerFaceColor = none

Цвет заливки маркера = none

XData = [0 1]

XДанные = [0 1]

YData = [0 1]

YДанные = [0 1]

ZData = []

ZДанные = []

...

...

Ряд свойств может принимать произвольные значения, а другие свойства – только определенные. Если необходимо узнать, какие значения может принимать то или иное свойство, то используется оператор set(hl), где hl -дескриптор соответствующего, интересующего вас объекта. В результате получаем на экране информацию, подобную приведенной далее

Color

EraseMode: [ {normal} | background | xor | none ] LineStyle: [ {-} | -- | : | -. | none ] LineWidth

Marker: [ + | o | * | . | x | square | diamond | v | ^ | >] MarkerSize

MarkerEdgeColor: [ none | {auto} ] -or- a ColorSpec. MarkerFaceColor: [ {none} | auto ] -or- a ColorSpec.

....

Данные, приведенные в квадратных скобках и отделенные друг от друга вертикальной чертой, являются вариантами возможных значений, а значения в фигурных скобках являются значениями по умолчанию. Для получения значения свойства какого-либо объекта и возможного присвоения этого значения переменной используется оператор get в форме

5

Лекция 6

x=get(hl,'Property_Name')

Такая запись приведет к тому, что переменной x будет присвоено значение свойства 'Property_Name'. Например, если в предыдущем примере записать оператор

x=get(hl,'Color')

то будет создан вектор x=[0 0 0] - это запись цвета линии в RGB-формате. Для присвоения соответствующему свойству нового значения используется оператор set в виде:

set(hl,'Prop_Name','Prop_Value');

Например, для смены цвета линии (объект line с дескриптором hl) используется оператор set(hl,'Color','red')

или, что эквивалентно, set(hl,'Color',[1 0 0])

Необходимо пару слов сказать о формировании цветов. Цвет в MATLAB формируется с помощью вектор-строки из трех чисел, определяющих интенсивности красного, зеленого и синего цветов в результирующем цвете: RGB-формат (Red, Green, Blue). Интенсивности базовых цветов изменяются в пределах от нуля до единицы. В предыдущем примере красный цвет для объекта hl определялся вектором [1 0 0]. Первое число в векторе-строке [1 0 0] определяет интенсивность красного цвета, второе - зеленого и третье - синего.

Примеры использования дескрипторной графики.

Рассмотрим некоторые объекты и приведем некоторые примеры по использованию дескрипторной графики.

Рис. 3. Пример использования figure.

Объекты figure представляют собой известные нам графические окна системы MATLAB. Создаются эти объекты одноименной функцией. Для примера создадим графическое окно и зададим некоторые его свойства, такие как расположение ('Position'), цвет ('Color'), заголовок ('Name'):

hf=figure;

set(hf,'Position',[50 50 500 200],...

'Color',[0 1 0],'Name','Демонстрационное окно');

Обратите внимание, что с помощью функции set можно задавать как одно, так и несколько

6

Лекция 6

свойств сразу. Свойство 'Position' определяется в следующем формате [x y w h], где x,y – координаты относительно нижнего левого угла родителя (в данном случае экрана) w,h – ширина и высота объекта соответственно. На рис. 3 приведен результат выше приведенного кода.

Свойства объектов также можно задавать одновременно с их созданием. Например, предыдущий пример эквивалентен следующему примеру:

hf=figure('Position',[50 50 500 200],...

'Color',[0 1 0],'Name','Демонстрационное окно');

Объекты axes определяет область в окне figure, предназначенную для вывода графических изображений, и ориентацию дочерних объектов в этой области. Они являются наиболее сложными, ибо содержат довольно много составляющих – собственно оси с их подписями, легенды, возможность увидеть объект из разных позиций наблюдателя и многое другое. Мы только кратко коснемся некоторых их свойств. Рассмотрим пример:

hA=axes('Color',[0.5, 0.8, 0.5]); set(hA,'Units','pixels','Position',[25, 50, 400, 200]);

Рис. 4. Пример использования axes.

Здесь мы создали оси салатного цвета и расположили их в графическом окне с заданными размерами. Размеры осей и их расположение мы вырази в пикселах, для чего мы задали свойство 'Units' равным 'pixels'. По умолчанию для осей это свойство равно 'normalized', когда точка (0 ,0) соответствует левому нижнему углу, а точка (1.0, 1.0) – верхнем правому углу графического окна.

Если объект axes создается высокоуровневыми функциями, например plot, или дочерними объектами, например line, то доступ к объекту можно получить, используя gca:

x=[0 1 2];y=[0 5 1]; plot(x,y);

hA=gca;

set(hA,'xtick',[0, 1, 2],'ytick',[0, 5]);

7

Лекция 6

Рис. 5. Пример использования axes.

Здесь мы получили дескриптор hA объекта axes который автоматически был создан функцией plot. А затем 'вручную' установили метки на осях x и y – свойства 'xtick' и 'ytick'.

Объекты line являются основными графическими базисными элементами для большинства двумерных графиков. Они создаются почти всеми функциями построения плоских и пространственных кривых (plot, loglog, plotyy, plot3 и др.), которые возвращают указатель (дескриптор, см. дальше) на появившуюся кривую. Для примера построим график функции sin с очень толстой линией:

x=0:0.1:3; y=sin(x); hLine=plot(x,y); set(hLine,'LineWidth',7);

Высокоуровневая функция plot создает объект типа line и дескриптор (указатель) на него помещает в переменную hLine. Объект line проводит отрезки прямых линий через опорные точки с координатами x, y. Зная дескриптор – hLine, с помощью функции set мы установили толщину линии 'LineWidth' равную 7.

Также мы можем поменять тип линии ('LineStyle'), маркер и его размер ('Marker', 'MarkerSize'), видимость линии ('Visible') и другие свойства.

Очевидно, что объект line мы можем создать, непосредственно вызвав одноименную функцию line(). Например в предыдущем примере вместо строчки hLine=plot(x,y) мы могли записать hLine=line(x,y).

8

Лекция 6

Рис. 6. Пример использования line.

Объекты text представляют собой строку символов и предназначены для вывода информации в графическом окне. Пример:

hT=text(0.5, 0.2, 'Некоторый текст'); set(hT,'FontName','Arial','FontSize',14,'Rotation',30);

Здесь мы создали строку: 'Некоторый текст' и поместили с координатами x=0.5, y=0.2 (относительно родительских осей). Затем мы задали размер ('FontSize') и имя шрифта ('FontName'), и повернули надпись на 30 градусов.

Рис. 7. Пример использования text.

Чтобы поменять содержание уже существующей надписи с дескриптором hT необходимо поменять свойство:

set(hT,'String','Это уже другой текст');

9