Функции создания объектов




Вызов функции с именем какого-либо объекта создает этот объект. Например, функция 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).

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: