Урок 7. Специальная графика

1. Урок 7. Специальная графика

 

Урок №7.

Специальная графика

  • Движение точки на плоскости и в пространстве

  • Основные средства анимации 

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

  • Операции над графическими объектами

  • Свойства объектов и управление ими

  • Управление средствами Open GL

  • Управление прозрачностью графических объектов

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

  • Растровая графика

  • Пакет прикладных программ Images

  • Галерея трехмерной графики

В этом уроке мы рассмотрим некоторые виды специальной графики. Это прежде всего анимационная и дескрипторная (handle) графика.

 

2. Движение точки на плоскости

 

Движение точки на плоскости

Для отображения движения точки по траектории используется команда comet. При этом движущаяся точка напоминает ядро кометы с хвостом. Используются следующие формы представления этой команды:

  • comet (Y) — отображает движение «кометы» по траектории, заданной вектором Y;

  • comet (X.Y) — отображает движение «кометы» по траектории, заданной парой векторов Y и X;

  • comet (X.Y.p) — аналогична предшествующей команде, но позволяет задавать длину хвоста кометы (отрезка траектории, выделенного цветом) как p*1ength(Y), где length(Y) - размер вектора Y. а р<1. По умолчанию р = 0.1 [ Обратите внимание, что если Вы используете лупу, как-то иначе пытаетесь изменить размер Вашего рисунка или используете вкладку Copy Figure меню Edit, то график, полученный при использовании comet или cometS, исчезает. — Примеч. ред. ]

Рис. 7.1. Стоп-кадр изображения, полученный из примера использования команды comet

Следующий пример иллюстрирует применение команды comet:

» Х=0:0.01:15;

» comet(X,sin(X) )

Стоп-кадр изображения показан на рис. 7.1. «Хвост кометы» на черно-белом рисунке заметить трудно, поскольку он представляет собой отрезок линии с цветом, отличающимся от цвета линии основной части графика.

 

1.gif

Изображение: 

3. Движение точки в пространстве

 

Движение точки в пространстве

Есть еще одна команда, которая позволяет наблюдать движение точки, но уже в трехмерном пространстве. Это команда comet3:

  • comet3(Z) — отображает движение точки с цветным «хвостом» по трехмерной кривой, определенной массивом Z;

  • comet3 (X.Y.Z) — отображает движение точки «кометы» по кривой в пространстве, заданной точками [X(i),Y(i),Z(i)];

  • comet3(X,Y,Z,p) — аналогична предшествующей команде с заданием длины «хвоста кометы» как p*1ength(Z). По умолчанию параметр р равен 0.1.

Ниже представлен пример применения команды cometS:

» W=0:pi/500:10*pi;

» comet3(cos(W),sin(W)+W/10.W)

На рис. 7.2 показан стоп-кадр изображения, созданного командой comet().

Рис. 7.2. Стоп-кадр изображения, созданного командой comet3

Разумеется, движение точки по заданной траектории как в двумерном, так и в трехмерном пространстве является самым простейшим примером анимации. Тем не менее эти средства существенно расширяют возможности графической визуализации при решении ряда задач динамики.

 

2.gif

Изображение: 

4. Основные средства анимации

 

Основные средства анимации

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

Отметим кратко основные команды, реализующие анимацию в системе MATLAB:

  • capture — захват видеоизображения;

  • getframe — создание кадра для анимации;

  • moviein — выполнение анимации;

  • rotate — вращение фигуры;

  • frame2im — преобразование кадра в графический образ;

  • im2frame — преобразование графического образа в кадр.

Применение некоторых из этих команд мы рассмотрим далее на конкретных примерах. К сожалению, серьезные задачи анимации обычно требуют применения программных средств — главным образом циклов. Мы рассмотрим их далее, но представляется, что читатели знакомы с понятием циклов, так что приведенные примеры не будут слишком сложны. В крайнем случае, оставьте их разбор до знакомства с основами программирования в системе MATLAB (урок 20).

 

5. Вращение фигуры - логотипа MATLAB

 

Вращение фигуры — логотипа MATLAB

Рассмотрим вначале не очень сложный пример вращения сложной трехмерной поверхности — логотипа системы MATLAB, который представлен файлами logo.m и logo.mat. Ниже представлен фрагмент программы, обеспечивающий вращение этой поверхности (фигуры) относительно осей системы координат:

if ~exist('MovieGUIFlag'). figNumber=0; end;

load logo

h=surfl(L.source);

colormap(M);

ax=[7 52 7 52 -.5 .8]:

axis(ax);

axis on:

shading interp;

m=moviein(25):

for n=l:25.

rotate(h.[0 90],15.[21 21 0]);

h=surfl(get(h.'XData'),get(h.'YData').

get(h.'ZData'),source);

axis(ax);

axis on;

shading interp;

m(:,n)=mvframe(figNumber,24); end;

mvstoretfigNumber.m);

Эта программа имеет два блока: в первом задается исходная функция и ее образ, а во втором (с циклом for) выполняется создание кадров и их последовательное воспроизведение, создающее эффект анимации. На рис. 7.3 показан стоп-кадр полученной анимации.

Рис. 7.3. Стоп-кадр программы, обеспечивающей вращение фигуры — логотипа MATLAB

 

3.gif

Изображение: 

6. Волновые колебания мембраны

 

Волновые колебания мембраны

Принцип мультипликации легко распространить на существенно более сложные задачи анимации. В качестве иллюстрации можно рассмотреть системный пример vibes, демонстрирующий волнообразные колебания тонкой пластины — мембраны. Ниже представлен переработанный файл данного примера, в котором сокращены подробные комментарии на английском языке и введены только для пояснения комментарии на русском языке, их следует изъять при попытке запустить программу:

%Волновые колебания мембраны 

%Переработка файла VIBES фирмы MathWorks. Inc. 

if~exist('MovieGUIFlag'): figNumber=0; end; 

hlpStr= ...

[' Это пример анимации - наблюдение колебаний '

' трехмерной поверхности - мембраны. ']: 

mvinit(figNumber.hlpStr):

% Загрузка данных функции

load vibesdat;

[n.n] = size(Ll):

nh = fix(n/2): .

x = (-nh:nh)/nh;

% Вычисление коэффициентов

clear с

for k = 1:12.

eval(['c(k) = L' num2str(k) '(24,13)73:']) 

end;

% Установка графических параметров 

axis([-11-11-11]); caxis(26.9*[-1.5 1]);

colormap(hot); hold on

% Генерация кадров мультипликации

delt = 0.1;

nf names =12:

M - moviein(nf names):

fon k - l:nf names,

% Коэффициенты

t = k*delt;

s = c.*sin(sqnt(1ambda)*t);

% Амплитуды

L = s(l)*Ll + s(2)*L2 + s(3)*L3 + s(4)*L4 +

s(5)*L5 + s(6)*L6 + .

S(7)*L7 + s(8)*l_8 + s(9)*L9 + s(10)*L10 +

s(ll)*Lll + s(12)*L12;

% Скорость мультипликации 

s = s .* lambda;

V = s(l)*Ll + s(2)*L2 +'sC3)*L3 +

s(4)*L4 + s(5)*L5 + s(6)*L6 + ...

s(7)*L7 + s(8)*L8 + s(9)*L9 + s(10)*L10 +

s(11)*L11 + s(12)*L12;

% График поверхности; цвет задается скоростью

V(l:nh.l:nh) = NaN*ones(nh,nh);

Cla

sunf(x.x.L.V);

axis off

% Создание кадров мультипликации

M(:.k) - mvfname(f1gNumben,nfnames): end : hold off

%=======================================

% Запись кадров мультипликации 

mvstone( figNumben , M) ;

Этот пример дан с целью иллюстрации, и подробно эту программу мы описывать не будем. К сожалению, в представленном виде (с русскоязычными комментариями), данная программа MATLAB 6 неработоспособна. Чтобы она работала, эти комментарии должны быть убраны или заменены англоязычными. В этом случае проблем с запуском программы не будет.

 

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

 

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

Как уже отмечалось, графические средства MATLAB базируются на низкоуровневой графике, которая называется дескрипторной (описательной), или handle графикой. По существу, эта графика обеспечивает объектно-ориентированное программирование как всех рассмотренных выше графических команд, так и пользовательского интерфейса. Графический редактор дескрипторной графики Property Editor в MATLAB 6 является основным редактором графики и нами уже использовался. Хотя обычный пользователь может даже не знать о существовании дескрипторной графики ввиду того, что слово «дескрипторная» в сокращенное название графического редактора не входит, все же надо учитывать, что именно дескрипторная графика дает новые, подчас уникальные возможности создания пользовательских графических программ MATLAB 6, не говоря уже о том, что она помогает понять, каким образом реализованы графические средства системы.

Центральным понятием дескрипторной графики является графический объект. Имеются следующие типы таких объектов:

  • root (корень) — первичный объект, соответствующий экрану компьютера; 

  • figure (рисунок) — объект создания графического окна;

  • uicontrol (элемент управления, определенный пользователем) — объект создания элемента пользовательского интерфейса;

  • axes (оси) — объект, задающий область расположения графика в окне объекта figure;

  • uimenu (определенное пользователем меню) — объект создания меню;

  • uicontextmenu (определенное пользователем контекстное меню) - объект создания контекстного меню;

  • image (образ) — объект создания растровой графики;

  • line (линия) — объект создания линии;

  • patch (заплата) — объект создания закрашенных фигур;

  • rectangle (прямоугольник) - объект создания закрашенных прямоугольников;

  • surface (поверхность) — объект создания поверхности;

  • text (текст) — объект создания текстовых надписей;

  • light (свет) — объект создания эффектов освещенности.

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

 

8. Создание графического окна и управление им

 

Создание графического окна и управление им

Прежде чем мы рассмотрим применение дескрипторной графики на реальных примерах, отметим команды и функции, которые предназначены для создания графических окон и управления ими:

  • figure — открыть чистое графическое окно;

  • gcf — получить дескриптор графического окна figure;

  • elf — очистить графическое окно;

  • shg — показать ранее свернутое графическое окно;

  • close (закрыть) — закрыть графическое окно;

  • refresh (обновить) — обновить графическое окно.

Эти команды и функции достаточно очевидны, и мы не будем обсуждать их подробно. Заметим, что команды help name или doc name позволяют уточнить назначение той или иной команды или функции с обобщенным именем name.

 

9. Создание координатных осей и управление ими

 

Создание координатных осей и управление ими

Еще одна группа простых команд служит для создания координатных осей и управления ими:

  • axes (оси) — создать оси координат; 

  • box (ящик) — построить прямоугольник вокруг рисунка; 

  • сlа — убрать построения axes;

  • gса — получить дескриптор графического объекта axes;

  • hold — сохранить оси координат;

  • ishold — проверка статуса hold (1, если оси сохранены, и 0 в противоположном случае).

Эти команды также достаточно очевидны. Заметим, что их можно использовать и в обычной (высокоуровневой) графике, например для устранения осей из уже созданного графика.

 

10. Пример применения объекта дескрипторной графики

 

Пример применения объекта дескрипторной графики

Объем и направленность данной книги не позволяют подробно описать все многообразие возможностей дескрипторной графики. Ограничимся пока одним примером. Пусть надо построить линию,-проходящую через три точки с координатами (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

 

4a.gif

Изображение: 

4b.gif

Изображение: 

11. Дескрипторы объектов

 

Дескрипторы объектов

С понятием объектов дескрипторной графики связана особая характеристика объектов — дескриптор (описатель). Его можно понимать как некое число — своеобразный идентификатор («распознаватель») объектов.

Рис. 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, для разных компьютерных платформ и даже для одинаковых команд, но в разных местах сессии.

 

5a.gif

Изображение: 

5b.gif

Изображение: 

12. Операции над графическими объектами

 

Операции над графическими объектами

К графическим объектам применяется ряд операций:

  • set — установка свойств (параметров) графического объекта;

  • get — вывод свойств графического объекта;

  • reset — восстановить свойства графического объекта по умолчанию;

  • delete — удалить созданный графический объект;

  • gсо — возвращает дескриптор текущего графического объекта;

  • gcbo — возвращает дескриптор объекта, чья функция в данный момент выполняется;

  • gcbf — возвращает дескриптор окна, содержащего объект, функция которого в данный момент выполняется;

  • drawnow — выполнить очередь задержанных графических команд;

  • findobj — найти объекты с заданными свойствами;

  • copyobj — скопировать объект и порожденные им объекты.

Кроме того, имеются три утилиты, связанные с операциями над объектами:

  • closereq — закрыть окно по запросу;

  • ishandle — проверить дескриптор на истинность;

  • newplot — восстановить свойства объекта, измененные nextPlot.

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

 

13. Свойства объектов - команда get

 

Свойства объектов — команда 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

 

14. Изменение свойств объекта - команда set

 

Изменение свойств объекта — команда set

С помощью команды set можно изменить отдельные свойства объекта дескрипторной графики. Эта команда имеет множество параметров, и с ними можно ознакомиться с помощью команд help set или doc set. Ограничимся примером — допустим, нам надо сменить цвет линии с голубого на красный. Для этого достаточно выполнить следующую команду: » set(h,'Color'.'red')

Обратите внимание, что при этом цвет сменится на ранее построенном рисунке с дескриптором h.

 

15. Управление работой средств OpenGL

 

Управление работой средств 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')

 

16. Управление прозрачностью графических объектов

 

Управление прозрачностью графических объектов

Пожалуй, наиболее впечатляющие и внешне заметные результаты дает применение свойства прозрачности изображений (transparency), доступное только при использовании средств Open GL. Это свойство позволяет строить изображения полупрозрачных струй жидкостей или газов, в которых видны их сгустки или вкрапления твердых тел, изображения галактик со звездными вкраплениями, изображения клеток в биологических объектах и т. д.

В книгу «MATLAB. Using MATLAB Graphics. Version 6.0» введен обширный раздел, посвященный управлению прозрачностью объектов. Ниже представлена краткая «выжимка» из этого раздела.

Свойство прозрачности основано на представлении изображений в виде отдельных слоев, что обычно требует применения многомерных массивов. Данные о прозрачности размещаются в матрице размера mxn AlphaData, элементы которой должны иметь тип double или uint8 (элементы типа NaN недопустимы). Возможности задания прозрачности поддерживаются графическими файлами с расширением PNG. В изображениях, хранящихся в этих файлах, возможна поддержка кодирования цветов с разным разрешением - вплоть до 48 бит при RGB графике.

Для управления прозрачностью служит специальная системная переменная alpha, значение которой лежит в пределах от 0 до 1. Если построенный вами графический объект содержит элементы прозрачности, то для их наблюдения нужно задать команду alpha(x), где х задает уровень прозрачности. Например, задав alpha(0.5), мы получим «полупрозрачное» изображение, на котором будут видны обычно скрытые его детали.

Приведем наглядный пример использования свойств прозрачности из описания графики системы MATLAB, где строится график скорости жидкости на пути ракеты подводного базирования в бесконечной емкости:

[х у z v] = flow;

p=patch(isosurface(x,y,z,v,-3));

isonormals(x,y,z,v,p);

set(p,'facecolor','blue','edgecolor','none');

daspect([1 1 1]);

view(3); axis tight; grid on;

camlight; lighting gouraud;

Здесь строится график трехмерной фигуры flow (течение). Она представлена тремя массивами своих точек х, у и z и дополнительным массивом класса AlphaData — v. При первом построении свойство прозрачности отсутствует (по умолчанию) и построенная фигура будет иметь вид, представленный на рис. 7.6.

Рис. 7.6. Трехмерная фигура в обычном представлении (без свойства прозрачности)

Если исполнить команду alpha(0.5), то в массиве AlphaData будут заданы эле-менхы, обеспечивающие степень прозрачности 0.5. При этом изображение объекта будет иметь вид, представленный на рис. 7.7. Теперь на нем четко видна скрытая ранее твердая сердцевина фигуры и даже проглядывают координатные оси.

Рис. 7.7. Трехмерная фигура с установкой свойства прозрачности

Более подробные сведения об использовании свойства прозрачности можно найти в обширной документации по графике в формате PDF. Эта документация в виде файла graphg.pdf объемом свыше 12 Мбайт поставляется с системой MAT-LAB 6.

 

6a.gif

Изображение: 

6b.gif

Изображение: 

17. Примеры, иллюстрирующие возможности дескрипторной графики

 

Примеры, иллюстрирующие возможности дескрипторной графики

Теперь рассмотрим более сложные примеры, наглядно демонстрирующие возможности дескрипторной графики. Воспользовавшись File > New > M-File или edit msl.m. создадим файл msl.m следующего содержания:

[х,у] = meshgrid([-2:.4:2]);

Z =sin(x. ^ 2+y.^2);

fh = figureCPosition'.[350 275 400 300].'Color ' . V);

ah = axes('Color'.[.8 .8 .8].'XTick'.[-2 -1 0 1 2]....

'YTick',[-2 -1 0 1 2]};

sh = surfaceCXData'.x.'YData'.y.'ZData'.Z....

'FaceColor',get(ah.'Color')+.....

'EdgeColor'. 'k'.'Marker'.'o'....

'MarkerFaceColor',[.5 1 .85]):

В этом файле заданы три объекта: прямоугольник fh — объект класса figure, оси с метками ah — объект класса axes и трехмерная поверхность sh — объект класса surface. Она является результатом наложения объектов fh и ah друг на друга. При этом объект ah класса axes явно наследует свойства объекта fh класса figure. Наследование здесь проявляется в том, что при задании свойства «цвет граней» (FaceColor) объекта sh используется осветление (добавлением константы 0.1) цвета осей, полученного при помощи функции get (ah. color).

Команда v1ew(3) изменяет точку обзора трехмерной поверхности. Раньше, когда параметры осей были жестко заданы, мы смотрели на поверхность строго сверху. Теперь команда v1ew(3) установила точку обзора трехмерных графиков, принятую по умолчанию.

Теперь создадим второй файл — ms2.m:

h(l) = axes('Position',[0 Oil]);

sphere;

h(2) = axesCPosition'.[0 0 .4 .6]);

peaks:

h(3) = axes('Position'.[0 .5 .5 .5]);

sphere:

h(4) = axes('Position'.[.5 0 .4 .4]);

sphere;

h(5) = axes('Position 1 .[.5 .5 .5 .3]):

cylinder([0 0 0.5]);

set(h,'Visible 1 .'off):

alpha(0.l):

set(gcf.'Renderer'.'opengl')'

Здесь задано 5 трехмерных объектов: три сферы разных размеров, поверхность peaks и цилиндр.

Запустив файл ms2, мы получим еще более интересную картину. Заново будет вычислена величина z, а затем построены изображения пяти фигур:

z = 3*(1-х). ^ 2.*ехр(-(х. ^ 2) - (у+1). ^ 2) ...

- 10*(х/5 - х.'З - у."5).*ехр(-х.^2-у.^2) ...

- 1/3*ехр(-(х+1).^2 - у.^2)

Последовательность наложения фигур, заданных в файле ms2, определяется последовательностью их появления в файле. Любопытен вид цилиндра — похоже, что произошедшее с ним преобразование связано с изменением системы координат с декартовой на сферическую.

Рис. 7.8. Комбинированный рисунок, полученный при запуске файла ms2.m после запуска ms1.m

Чтобы понять, какие из объектов наследуют свойства других объектов, следует рассмотреть диаграмму иерархии объектов дескрипторной графики MATLAB, что объекты surface расположены ниже объектов axes, а те, в свою очередь, расположены ниже объектов класса figure. Поэтому ясно, что в случае запуска файла msl свойства сетки, построенной с применением объекта axes, будут унаследованы объектом sh, построенным командой surface.

 [ Обратите внимание, что трехмерная графика в этом примере строится с рендерингом MATLAB 6 ('opengl'). В MATLAB 5.3 без установки патча Open GL по умолчанию был бы выбран рендеринг с использованием Z-буфера и на некоторых компьютерах были бы возможны искажения. Не было бы прозрачной фигуры. В MATLAB 6 при включенном режиме видеоадаптера TrueColor можно пропустить последнюю команду. Но при необходимости вывода изображения на печать set(gcf,'Renderer','opengl') можно быстро отредактировать и заменить на set(gcf,'Renderer', 'painters'). — Примеч. ред. ]

Все объекты второго файла — ms2 — относятся к классу axes. Именно поэтому они строятся поверх объектов, показанных на рис. 7.10. Координаты всех пяти трехмерных фигур (см. рис. 7.11) жестко заданы в соответствующих командах axes. В заключение этого раздела следует еще раз отметить, что дескрипторная графика рассчитана не столько на конкретных пользователей, использующих MATLAB как прикладную программу, сколько на опытных разработчиков программного обеспечения для этой системы. Разумеется, это не исключает полезную возможность изменения параметров графиков путем настройки свойств графических объектов, что особенно наглядно видно из последних приведенных примеров. Многие тайны дескрипторной графики познаются только в ходе практических экспериментов с ней.

 

7.gif

Изображение: 

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

 

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

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

В новой версии MATLAB дескрипторная графика позволяет конструировать детали пользовательского интерфейса. Полный список команд и функций для проектирования пользовательского интерфейса можно получить, выполнив команду help uitools.

Ниже перечислены все команды и функции данного назначения. Функции пользовательского интерфейса GUI: 

  • ulcontrol — создание управляющего элемента; 

  • ulmenu — создание пользовательского меню; 

  • ginput — графический ввод с помощью мыши.

Перечень команд и функций пользовательского интерфейса:

  • dragrect — создание выделяющего прямоугольника с помощью мыши;

  • rbbox — растягивание прямоугольника мышью;

  • selectmoveresize — интерактивное выделение, перемещение и копирование объектов с помощью мыши;

  • waitforbuttonpress — ожидание нажатия клавиши клавиатуры или кнопки мыши в окне; 

  • waltfor — прекращение выполнения программы в ожидании уничтожения заданного графического объекта или изменения его свойств;

  • uiwait — прекращение выполнения программы в ожидании вызова функции uiresume или закрытия заданного графического окна;

  • inresume — возобновить выполнение после блокировки;

  • uisuspend — прекращение интерактивного состояния фигуры;

  • uirestore — возобновление интерактивного состояния фигуры.

Средства проектирования пользовательского интерфейса:

  • guide — создание GUI;

  • align — выровнять положение объектов интерфейса;

  • cbedit — изменение повторного вызова объектов;

  • menuedit — изменение меню;

  • propedit — изменение свойств объектов.

Средства создания диалоговых окон:

  • dialog — создание диалогового окна;

  • axlimdlg — ограничение размеров диалогового окна;

  • errordlg — создание окна с сообщением об ошибке;

  • helpdlg — создание справочного окна;

  • inputdlg — создание окна диалога ввода;

  • listdlg — создание окна диалога для выбора вариантов параметра из списка;

  • menu — создание меню диалогового ввода;

  • msgbox — создание окна сообщений;

  • questdlg — создание окна запроса;

  • warndlg — создание окна предупреждения;

  • uigetfile — создание стандартного окна открытия файлов;

  • uiputfile — создание стандартного окна записи файлов;

  • uisetcolor — создание окна выбора цвета;

  • uisetfont — создание окна выбора шрифта;

  • pagedlg — создание диалогового окна параметров страницы;

  • printdlg — создание диалогового окна печати;

  • waitbar — создание окна с индикатором прогресса.

Создание меню:

  • makemenu — создать структуры меню;

  • menubar — устанавливать типовые свойства для объекта MenuBar;

  • umtoggle — изменять статус параметра "checked" для объекта uimenu;

  • winmenu — создать подменю для меню Window.

Создание кнопок панели инструментов и управление ими:

  • btngroup — создать кнопку панели инструментов;

  • btnstate — запросить статус кнопки; 

  • btnpress — управление кнопкой;

  • btndown — нажать кнопку; 

  • btnup — отпустить кнопку

Утилиты задания свойств объектов figure/axes:

  • сlruprop — удалить свойство объекта;

  • getuprop — запросить свойство объекта;

  • setuprop — установить свойство объекта.

Вспомогательные утилиты:

  • all child — запросить все порожденные объекты;

  • findall — найти все объекты;

  • hidegui — скрыть/открыть объекты GUI;

  • edtext — интерактивное редактирование объектов text;

  • getstatus — запросить свойства строки объекта figure;

  • setstatus — установить свойства строки объекта figure;

  • popupstr — запросить свойства строки выпадающего меню;

  • remapflg — изменить положение объекта figure;

  • setptr — установить указатель на объект figure;

  • getptr — получить указатель на объект figure;

  • overobj — запросить дескриптор объекта, над которым находится курсор мыши.

Таким образом, MATLAB содержит обширный набор команд и функций для создания типовых элементов пользовательского интерфейса. Объем данной книги не позволяет останавливаться на детальном описании этих функций, тем более что оно имеется в справочной системе. Поэтому мы ограничимся единственным примером: создание кнопки, на которой можно щелкнуть мышью и перевести ее в нажатое состояние.

 

19. Пример создания объекта интерфейса

 

Пример создания объекта интерфейса

Ниже представлена программа (распечатка m-файла с именем ui), которая при запуске создает 4 объекта интерфейса:

k1=uicontrol('Style','pushbutton'....

'Units'.'normalized','Position',[.7 .5 .2 .1],... 

'String'.'click here'); 

k2=ui control('Style'.'pushbutton

'Units'.'normalized','Position',[.6 .3 .2 .1].... 

'String'.'click here'); 

ck = uicontrol('Style', 'pushbutton', 'String', 'Clear'....

'Position', [150 150 100 70], 'Callback', 'da'); 

hpop = uicontrol('Style', 'popup'....

'String', 'hsv|hot|cool|gray'....

 'Position', [30 320 100 50],... 

'Callback ' , 'setmap');

Первые два объекта k1 и k2 — это малые кнопки с надписью click here («щелкни здесь»). Объект ck — это большая кнопка Clear (кстати, действующая). Объект hpop — раскрывающийся список (тоже действующий, хотя и содержащий незаполненные поименованные позиции). Для создания всех этих объектов используется команда ui control с соответствующими параметрами, задающими стиль (вид) объекта интерфейса, место его размещения и надпись (на кнопках). На рис. 7.9 построены все эти объекты, причем раскрывающийся список показан в открытом состоянии.

Рис. 7.9. Пример построения объектов пользовательского интерфейса

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

 

4b.gif

20. Растровая графика

 

Растровая графика

Одна из отличительных черт системы MATLAB — мощные возможности в реализации обработки изображений (images) класса BitMap (так называемая растровая графика .bmp). Весьма небольшое число команд такой графики включено в ядро системы. Часть из них была рассмотрена выше. Остановимся на некоторых наиболее важных командах.

Команды image(A) и imagesc(A) служат для представления содержимого матрицы А в виде рисунка. Так, исполнив команду 

» image(25+5*peaks)

можно наблюдать представление матрицы трехмерной поверхности peaks в наглядном «цветовом» масштабе (рис. 7.10). При этом цвет каждой точки поверхности задается ее высотой.

Рис. 7.10. Представление матрицы peaks в виде растрового рисунка

Для достаточно представительного отображения матрицы peaks в данном случае пришлось ввести нормирующие множитель 5 и слагаемое 25. Другая команда — Imagesc(A) — этого уже не требует. Результат исполнения приведенной ниже команды показан на рис. 7.11:

» imagesc(peaks)

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

  • RGB=hsv2rgb(HSV) — преобразует матрицу изображения HSV в матрицу изображения RGB;

  • HSV=rgb2hsv(RGB) — преобразует матрицу изображения RGB в матрицу изображения HSV.

Работа этих функций наглядна лишь при цветной графике. Поскольку иллюстрации в книге черно-белые, мы ограничимся лишь упоминанием о данных функциях преобразования.

Рис. 7.11. Представление матрицы с помощью команды imagesc

Для получения детальной информации о графических файлах используется команда imfinfo( 'name'), где name — имя файла с расширением. Пример получения информации о файле saturn.tif (снимок планеты Сатурн) приводится ниже:

» imfinfo('saturn.tif') 

ans =

ans =


Filename : ' E : \MATLABR12\tool box\images\imdemos\saturn .tif '

FileModDate:

'26-Oct-1996 01:12:02'

FileSize:

144184

Format :

'tif w

FormatVersion:

[]

Width:

438

Height:

328

BitOepth:

8

Color-Type:

'grayscale'

FormatSignature:

[73 73 42 0]

ByteOrder:

'little-endian'

NewSubfileType:

0

BitsPerSample:

8

Compression:

'Uncompressed'

Photomet ri с I nterpretati on :

'BlacklsZero'

StripOffsets:

[19x1 double]

SamplesPerPixel :

1

RowsPerStrip:

18

StripByteCounts:

[19x1 double]

XResolution:

72

YResolution:

72

ResolutionUnit:

'Inch'

Colormap:

[]

PlanarConfiguration:

'Chunky'

TileWidth:

[]

Ti 1 eLength :

[]

TileOffsets:

[]

TileByteCounts:

[]

Orientation:

1

Fill Order:

1

GrayResponseUnit:

0.0100

MaxSampleValue:

255 

MinSampleValue:

0

Thresholding:

1

ImageDescription:

[1x168 char]

Более интересна работа MATLAB с реальными изображениями. Она положена в основу многочисленных средств создания иллюстраций в пакетах прикладных программ системы MATLAB, и прежде всего специализированного пакета Images (полное название пакета — Image Processing Toolbox (Пакет обработки изображений)).

 

10a.gif

Изображение: 

10b.gif

Изображение: 

11a.gif

Изображение: 

11b.gif

Изображение: 

21. Пакет прикладных программ Images

 

Пакет прикладных программ Images

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

» help images

Image Processing Toolbox. 

Version 2.2.2 (R12) 10-Mar-2000 

Release information.

Readme = Display information about

versions 2.0. 2.1. and 2.2. 

Toolbox preferences.

iptgetpref = Get value of Image Processing

Toolbox preference.

iptsetpref = Set value of Image Processing

Toolbox preference. Demos.

dctdemo- 2-0 DCT image compression demo.

edgedemo - Edge detection demo.

firdemo = 2-D FIR filtering and filter design demo.

imadjdemo - Intensity adjustment and histogram

equalization demo.

landsatdemo = Landsat color composite demo.

nrfiltdemo = Noise reduction filtering demo.

qtdemo = Quadtree decomposition demo.

roidemo = Region-of-interest processing demo.

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

Пакет Images поддерживает следующие возможности:

  • отображение рисунков различных графических форматов (в том числе с высоким разрешением) на экране дисплея;

  • расширенные функции записи рисунков в файл, считывание их из файла и получение информации о файле;

  • выполнение геометрических операций с графическими объектами, таких как разворот или интерполяция данных;

  • операции на уровне элементарных частей изображений — пикселов;

  • аналитические операции с изображениями;

  • осуществление компрессии и декомпрессии изображений;

  • выполнение различных видов фильтрации изображений и конструирование фильтров;

  • выполнение различных преобразований изображений; 

  • поразрядные (битовые) операции с рисунками;

  • операции задания и преобразования цветов; 

  •  преобразование типов и форматов рисунков; 

  • демонстрация возможностей пакета; 

  • организация показа слайдов.

Объем данной книги не позволяет описать этот пакет подробно, но в этом нет и особого смысла. Если вы уяснили методы работы с системой MATLAB, вам не составит особого труда ознакомиться с составом всех команд и функций пакета и опробовать их на практике. В связи с этим мы остановимся лишь на нескольких демонстрационных примерах.

 

22. Примеры применения пакета Images

 

Примеры применения пакета Images

Есть ряд способов ознакомиться с весьма обширными и впечатляющими возможностями пакета Images: с помощью демонстрационных примеров (Demos) в справочной базе данных системы, путем непосредственного запуска этих примеров (список приводился выше), запуском отдельных команд и т. д.

Пример реконструкции изображений с управлением оригиналом, создаваемым изображением и ошибкой реконструкции представлен в файле dctdemo. Он выводит свое окно со средствами пользовательского интерфейса. Можно задать выбор той или иной исходной картинки, задать степень компрессии изображения и визуально наблюдать за характером преобразований (рис. 7.16). Для просмотра следует нажать кнопку Apply (Применить), кнопка Close (Закрыть) закрывает окно, а кнопка Info выводит информацию о примере.

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

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

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

 

23. Примеры программирования задач со средствами пакета Images

 

Примеры программирования задач со средствами пакета Images

Вы можете ознакомиться с каждым демонстрационным примером пакета Images, выполнив команду type fname, где fname — имя файла с демонстрационным примером. Однако следует отметить, что демонстрационные программы являются весьма сложными, поскольку создают окна в виде стандартных панелей с современными элементами пользовательского интерфейса и переключателями выбора вариантов. Мы рекомендуем читателю воздержаться от знакомства с этими программами до ознакомления с уроком 20, в котором систематически описаны средства программирования системы MATLAB. А пока мы ограничимся парой характерных примеров, наглядно показывающих, что при работе с системой MATLAB вполне можно руководствоваться народной поговоркой: «Не боги горшки обжигают».

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

% Picture filter 

I = imreadCsaturn.tif);

h = [1 2 1: 0 0 0: -1 -2 -1];

I2 - filter2(h.I);

imshow(I2,[ ]). colorbar

В результате исполнения этой простой и вполне очевидной программы можно получить отфильтрованное изображение из файла saturn.tif . Хотите попробовать обработать какой-либо снимок? Все, что для этого нужно, — подготовить снимок в нужном формате (например, tif) и заменить во второй строке имя демонстрационного файла на имя вашего файла.

Рассмотрим еще один достаточно простой пример — построение сферы в виде глобуса и наклеивание на полушарие этого глобуса изображения карты погоды:

load earth sphere: h - findobjC'Type'.'surface');

hemisphere= [ones(257.125).X.ones(257,125)];

set(h.'CData'.f1i pud(hemi sphere).'FaceColor'.

'texturemap')

colormap(map)

axis equal

view([90 0]) 

setCgca.'CameraViewAngleMode'.'manual')

view([65 30])

Пакет Images можно рассматривать как полезный инструмент для создания новых алгоритмов и методов обработки изображений и обучения специалистов. Применение его непосредственно для обработки изображений вполне возможно, но все же едва ли целесообразно. Дело в том, что обширнейшие возможности по обработке изображений открывают профессиональные графические пакеты, например Adobe Photoshop, Ulead Photolmpact, Corel Draw и др., в которых реализованы самые современные методы обработки изображений и использованы последние новации пользовательского интерфейса. В этом случае достоинство средств MATLAB проявляется только в математической прозрачности реализаций алгоритмов обработки изображений.

 

24. Галерея трехмерной графики

 

Галерея трехмерной графики

Для знакомства с возможностями трехмерной графики и построением пользовательского интерфейса MATLAB имеет галерею (Gallery) в виде профессионально выполненных графических программ. Доступ к ним возможен как из режима демонстрации (команда Examples and Demos в меню Help командного окна MATLAB), так и путем запуска команды из командной строки с указанием имени соответствующего файла.

Галерея представлена фигурами и файлами, список которых приведен в табл. 7.1.

Таблица 7.1. Состав галереи трехмерной графики MATLAB

Knot

Knot.m

Завязанный узел

Quiver

Quivdemo. m

Векторное объемное поле

Klein II

Kleinl. m

Объемное кольцо

Cruller

Cruller.m

Объемное кольцо Мебиуса

Hoops

Tory4.m

Четыре объемных обруча

Slosh

Spharm2.m

Построение фигуры, напоминающей улитку

Modes

Modes. m

Демонстрация фаз анимации трехмерной поверхности

Logo

Logo.m

Построение логотипа системы MATLAB

Обратите внимание на то, что иногда имя файла не совпадает с именем фигуры в галерее. Некоторые из фигур галереи мы уже описывали — это knot (см. рис. 4.4) и logo . Ниже приведено еще несколько примеров, которые дают наглядное представление о возможностях дескрипторной графики системы MATLAB.

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

Команда kleinl строит график объемной ленты Мебиуса с одним перекручиванием. Этот график хорошо иллюстрирует хотя и одноцветную, но функциональную закраску фигуры с имитацией ее освещения источником света, расположенным вверху справа, и реализацией эффектов отражения света.

Команда cruller строит объемное кольцо Мебиуса с двойным перекручиванием. В данном случае используется обычная функциональная окраска с сохранением линий каркаса фигуры.

Команда tory4 строит четыре переплетающихся друг с другом тора (объемных кольца) в пространстве (рис. 7.25). Наглядности этой картины также способствует функциональная окраска торов и видимые линии каркаса. Обратите внимание, что невидимые линии удалены.

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

Еще одна команда — modes — иллюстрирует построение фаз анимации поверхности . Она генерирует 12 фигур, отражающих положение поверхности в пространстве в различные моменты времени.

В целом указанный набор программ дает хорошее представление о возможностях трехмерной графики системы MATLAB. Команда type name, где name — имя соответствующей команды, выводит полный листинг программы, реализующей построение той или иной фигуры.

 

25. Что нового мы узнали?

 

Что нового мы узнали?

В этом уроке мы научились:

  • Строить графики с анимацией.

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

  • Создавать графические окна и управлять ими.

  • Работать с графическими объектами.

  • Создавать элементы интерфейса.

  • Использовать некоторые средства пакета Images для обработки изображений.

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