- •Санкт-Петербургский государственный электротехнический университет
- •______________________________________________________________________ Кафедра моэвм
- •Санкт-Петербург
- •2007 Введение
- •Взаимодействие между пользователем и компьютером
- •Основные принципы создания интерфейса
- •Проектирование эргономичного интерфейса
- •Размещение информации на экране
- •Использование цвета
- •Выделение элементов интерфейса
- •Непротиворечивость и стандартизация
- •Отображение текстовой информации
- •Ввод текстовой информации
- •Дизайн заголовков и полей
- •Средства управления графическим интерфейсом
- •Принципы создания и проектирования меню
- •5. Дескрипторная графика
- •5.1. Назначение дескрипторной графики
- •5.2. Иерархия графических объектов
- •5.3. Текущий графический объект; указатели на объекты
- •5.4. Доступ к значениям свойств графических объектов
- •5.5. Свойства осей
- •5.6. Свойства графических окон
- •5.6.1. Расположение и вид графических окон
- •5.6.2. Способы графического вывода
- •5.6.3. Цветовая палитра
- •5.6.4. Печать графического окна
- •5.7. Базовые графические объекты.
- •5.7.1. Текстовый объект, вывод текста и математических формул в графическое окно.
- •5.7.2. Размещение текстового объекта, определение его размеров и положения.
- •5.7.3. Размещение текста на трехмерных графиках.
- •5.7.4. Изменение вида текстового объекта.
- •5.7.5. Указание положения текстового объекта и надписи при помощи свойств. Пример: "бегущая строка".
- •5.7.6. Вывод многострочного текста.
- •5.7.7. Примечание про логическое индексирование.
- •5.7.8. Заголовок и подписи осей это текстовые объекты, потомки осей.
- •6. Приложения с gui
- •6.1. Создание приложения hello в среде guide
- •6.2. Запуск приложения без среды guide и редактирование
- •6.3. Как работает приложение, созданное в среде guide?
- •7. Заключение
5.7.7. Примечание про логическое индексирование.
Логическое индексирование, т.е. обращение к элементам массива, удовлетворяющим некоторому условию, является очень удобным средством MATLAB для обработки данных. Примеры логического индексирования приведены в справочной системе MATLAB в разделе: Programming: Data Types: How Logical Arrays are Used. Например, если в некотором массиве A
A = [1 2 3; 12 1 2; 33 90 1];
надо заменить элементы, превосходящие среднее арифметическое его значений в полтора раза на среднее арифметическое, то достаточно использовать операторы:
m = mean(mean(A))
A(A>1.5*m) = m
Так происходит потому, что результатом операции сравнения (примененной к исходному массиву A) является логический массив (тип logical array) того же размера, что и A, в котором единицы означают выполнение проверяемого условия для соответствующих элементов массива A
A>1.5*m
ans =
0 0 0
0 0 0
1 1 0
Указание этого массива в качестве индекса для исходного массива A приводит к обращению к тем его элементам, которым соответствуют логические единицы. В нашем примере это элементы с индексами 3, 1 и 3, 2, которые как раз и превосходят в полтора раза среднее арифметическое элементов заданного массива A.
5.7.8. Заголовок и подписи осей это текстовые объекты, потомки осей.
При создании осей MATLAB создает сразу четыре потомка осей - текстовые объекты для заголовка и подписей для каждой из трех осей. Однако, если создать оси
hA = axes('CameraPosition', [-4 -5 5], 'Box', 'on')
и попытаться получить указатели на их потомков при помощи функции get и свойства Children осей, то мы получим пустой массив
get(hA,'Children')
ans =
Empty matrix: 0-by-1
Так происходит потому, что в MATLAB по умолчанию эти четыре потомка осей имеют скрытые указатели и функция get их "не видит". Изменение этой установки производится с уровня объекта Root - корневого объекта в иерархии графических объектов MATLAB. Указатель на корневой объект всегда равен нулю, а за отображение скрытых указателей отвечает свойство ShowHiddenHandles корневого объекта. Если оно имеет значение 'off' (как по умолчанию), то объекты со скрытыми указателями не видны, а если 'on', то видны. Скрытие указателей используется для предотвращения случайного изменения пользователем вида графических объектов (см. разделе Скрытие указателей объектов приложения с GUI).
Установим свойство корневого объекта ShowHiddenHandles в 'on' и снова применим функцию get для получения указателей на потомков осей:
set(0, 'ShowHiddenHandles', 'on')
h = get(hA, 'Children')
h =
155.0035
154.0035
153.0035
152.0035
Действительно, оси содержат четырех потомков, которые являются текстовыми объектами, в чем несложно убедиться, обратившись к их свойству Type:
get(h, 'Type')
ans =
'text'
'text'
'text'
'text'
Функция get допускает задание массива указателей в качестве ее первого входного аргумента. В этом случае она возвращает результат в массиве ячеек (в нашем примере ans), каждая строка которого содержит значение свойства Type соответствующего графического объекта.
То, что MATLAB должен скрывать указатели на эти текстовые объекты при значении 'off' свойства ShowHiddenHandles корневого объекта, определяется значениями свойства HandleVisibility текстовых объектов. В данном случае значение свойства HandleVisibility всех четырех потомков осей есть 'off'
get(h, 'HandleVisibility')
ans =
'off'
'off'
'off'
'off'
Итак, в массиве h содержится четыре указателя:
h(1) - указатель на текстовый объект, предназначенный для заголовка к осям. Это тот самый заголовок, который добавляется при помощи функции title.
h(2) - указатель на текстовый объект, предназначенный для подписи к оси z, которая может быть изменена при помощи функции zlabel.
h(3) - указатель на текстовый объект, предназначенный для подписи к оси y, которая может быть изменена при помощи функции ylabel.
h(4) - указатель на текстовый объект, предназначенный для подписи к оси x, которая может быть изменена при помощи функции xlabel.
Если Вы проделали приведенные выше команды, то теперь желательно вернуть свойству ShowHiddenHandles корневого объекта его первоначальное значение:
set(0, 'ShowHiddenHandles', 'off')
Используя свойства текстовых объектов, рассмотренные выше в разделе Текстовый объект, вывод текста и математических формул в графическое окно, легко настроить вид заголовка и подписей к осям по своему усмотрению.
На самом деле этот пример с доступом к скрытым указателям к текстовым объектам был приведен только для того, чтобы убедиться, что создаваемые оси действительно имеют четырех потомков - текстовые объекты. Указатели на эти объекты могут быть получены при помощи свойств Title, XLabel, YLabel и Zlabel осей.
Изменение свойств заголовка и подписей осей может быть выполнено при помощи высокоуровневых функций title, xlabel, ylabel и zlabel, которые допускают следующие способы вызова:
title('текст заголовка', 'Свойство', значение, 'Свойство', значение, ... )
xlabel('подпись к оси x', 'Свойство', значение, 'Свойство', значение, ... )
ylabel('подпись к оси y', 'Свойство', значение, 'Свойство', значение, ... )
zlabel('подпись к оси z', 'Свойство', значение, 'Свойство', значение, ... )
Здесь пары 'Свойство'-значение это название свойства текстового объекта и его возможное значение. Например, для получения заголовка, состоящего из нескольких строк, достаточно указать массив ячеек, каждая ячейка которого содержит нужную строку (см. Вывод многострочного текста)
title({'Results'; 'of my experiment'})
Функции xlabel, ylabel и zlabel также допускают подписи к той паре осей, указатель на которую задан в их первом входном аргументе, например:
xlabel (указатель на оси, 'подпись к оси x', 'Свойство', значение, 'Свойство', значение, ...)
При таком же способе обращения к функции title выводится ошибка, однако имеется функция title4ax (4 значит for, созвучное с four, а ax - axes), которая предназначена для вывода заголовка на определенные оси:
title4ax (указатель на оси , 'текст заголовка', 'Свойство', значение, 'Свойство', значение, ...)
Впрочем, всегда можно узнать, какие оси текущие при помощи функции gca, которая возвращает указатель на текущие оси, затем вызывать функцию axes и сделать текущими нужные оси, разместить на них заголовок и подписи, а затем использовать функцию axes для того, чтобы вернуть предыдущее состояние осей:
hA0=gca % узнаем указатель на текущие оси
axes(hA) % делаем текущими оси с указателем hA
title('Заголовок')
axes(hA0) % делаем текущими оси с указателем hA0, как и было раньше
ими оси с указателем hA0, как и было раньше.
