#matlab #matlab-figure
#matlab #matlab-рисунок
Вопрос:
Глупый, простой вопрос — всегда ли значение gcf
в matlab будет номером активной фигуры? Т.е., если я работаю над рисунком 5, будет gcf
всегда возвращаться 5
?
Ответ №1:
GCF возвращает дескриптор «текущей цифры». Это всегда номер активной фигуры. Однако, если вы тем временем нажмете на другую цифру, эта другая цифра станет активной. Таким образом, если вы уже знаете, с какой цифрой работаете, потому что вы либо принудительно присвоили дескриптору значение 5 путем вызова figure(5)
, либо потому, что вы записали дескриптор в переменную путем вызова fh=figure;
, безопаснее использовать дескриптор вместо gcf
всякий раз, когда вы хотите изменить цифру, чтобы избежать риска непреднамеренного включения другой цифры в действие.
Кроме того, если в данный момент нет открытой фигуры, gcf
откроется новая фигура.
Комментарии:
1. @yoda — спасибо, мой главный вопрос заключался в том, что Джонас сказал во втором предложении — всегда ли верно, что
current handle === figure number of active figure
. Спасибо!
Ответ №2:
Это немного сложнее, чем простой ответ «да» или «нет». Дескриптор для текущего рисунка будет соответствовать числу, отображаемому в верхнем левом углу окна рисунка, но это число отображается только тогда, когда для 'NumberTitle'
свойства figure установлено значение 'on'
(по умолчанию).
Еще одна проблема заключается в том, что дескриптор figure не гарантированно является целым числом. Существует 'IntegerHandle'
свойство figure, которое определяет, является ли дескриптор, созданный для фигуры, целым числом или вещественным числом, не подлежащим повторному использованию. Если для этого свойства установлено значение 'off'
, вы получаете значения дескрипторов, которые не являются целыми числами, поэтому первое число, которое вы открываете, не будет иметь дескриптор 1. Например:
>> hFigure = figure('IntegerHandle','off') %# The only window open
hFigure =
173.0040
И цифра пронумерована соответствующим образом:
Обратите внимание, что при отображении номера цифры и дескриптора происходит некоторое округление числа. В окне рисунка отображаются только 6 цифр после запятой. Становится очевидным, что вы имеете дело с числами с плавающей запятой, когда вы меняете формат окна командной строки, чтобы показывать больше десятичных знаков:
>> format long
>> hFigure
hFigure =
1.730040283203125e 002
В этом случае отображаемый номер цифры и дескриптор цифры немного отличаются.
Комментарии:
1. что было бы хорошей причиной для установки
'IntegerHandle'
в'off'
?2. @yoda: Я предполагаю, что это помогает изолировать ваши цифры от всего, что может сделать пользователь. Например, если вы создаете графический интерфейс с дескриптором цифры, равным 1, и пользователь запускает какой-то другой код, пока графический интерфейс открыт, который делает что-то вроде
set(1,...);
(т. Е. они жестко кодируют его для изменения первого открытого рисунка), то они, вероятно, сломают ваш графический интерфейс. Использование нецелочисленных дескрипторов делает ваш графический дескриптор уникальным, а номера дескрипторов не перерабатываются, как целочисленные дескрипторы.3. Здесь у вас есть точка. Хотя алгоритм, который генерирует дескрипторы, очень детерминирован и дескрипторы в разных сеансах могут быть идентичными, внутри сеанса он не перерабатывается.
4. Из документов:
IntegerHandle: If you set this property to off, MATLAB assigns nonreusable real-number handles (for example, 67.0001221) instead of integers. This feature is designed for dialog boxes where removing the handle from integer values reduces the likelihood of inadvertently drawing into the dialog box.
Ответ №3:
Да, gcf
вернет дескриптор выбранного в данный момент (или активного) числа. Из документации,
H = GCF возвращает дескриптор текущего значения. Текущая цифра — это окно, в котором отображаются графические команды, такие как PLOT, TITLE, SURF и т.д. будет отрисовываться.
Но также помните, что:
Текущая цифра не обязательно является самой передней цифрой на экране.
Один из способов сделать цифру «текущей» — это:
Щелчок по uimenus и uicontrols, содержащимся в фигуре, или щелчок по области рисования фигуры приводит к тому, что эта фигура становится текущей.
Другой способ — использовать дескриптор рисунка. т.е., если вы назвали рисунок как h=figure;
, то figure(h)
это сделает его текущим рисунком.