Получение и настройка свойств

Автоматически вычисляемые свойства

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

Когда вы запрашиваете вычисляемое свойство, MATLAB выполняет неявное drawnow чтобы убедиться, что все значения свойств актуальны перед возвращением значения свойства. Запрос вызывает полное обновление всех зависимых свойств и обновление экрана.

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

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

ОбъектАвтоматически вычисляемые свойства

Оси

CameraPosition, CameraTarget, CameraUpVector, CameraViewAngle

 

Position, OuterPosition, TightInset

 

XLim, YLim, ZLim

 

XTick, YTick, ZTick, XMinorTick, YMinorTick, ZMinorTick

 

XTickLabel, YTickLabel, ZTickLabel, TickDir

 

SortMethod

Текст

Extent

Неэффективные циклы наборов и получений

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

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

  • get вызывает обновление.

  • set помечает графическую модель как требующую обновления.

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

Этот пример получает и устанавливает текст Extent свойство.

Код с плохой эффективностьюКод с лучшей эффективностью
h = gobjects(1,500);
p = zeros(500,3);
for ix = 1:500
   h(ix) = text(ix/500,ix/500,num2str(ix));
end
drawnow

% Gets and sets in the same loop,
% prompting a full update at each pass
for ix = 1:500
   pos = get(h(ix),'Position');
   ext = get(h(ix),'Extent');
   p(ix,:) = [pos(1)+(ext(3)+ext(1)), ...
              pos(2)+ext(2)+ext(4),0];
   set(h(ix),'Position',p(ix,:))
end
drawnow
h = gobjects(1,500);
p = zeros(500,3);
for ix = 1:500
   h(ix) = text(ix/500,ix/500,num2str(ix));
end
drawnow

% Get and save property values
for ix=1:500
   pos = get(h(ix),'Position');
   ext = get(h(ix),'Extent');
   p(ix,:) = [pos(1)+(ext(3)+ext(1)), ...
              pos(2)+ext(2)+ext(4),0];
end

% Set the property values and 
% call a drawnow after the loop
for ix=1:500
   set(h(ix),'Position',p(ix,:));
end
drawnow

Этот код работает плохо, потому что:

  • The Extent свойство зависит от других значений, таких как разрешение экрана, размер фигуры и пределы по осям, поэтому запрос этого свойства может привести к полному обновлению.

  • Каждый набор Position свойство делает полное обновление необходимым при следующем получении Extent свойство происходит.

Эффективность лучше, потому что этот код:

  • Запрашивает все значения свойств в одном цикле и хранит эти значения в массиве.

  • Устанавливает все значения свойств в отдельный цикл.

  • Вызовы drawnow после окончания второго цикла.

Изменение текстовых Extent Вращение меток

В случаях, когда вы меняете текст Extent свойство для поворота меток осей более эффективно использовать свойства осей XTickLabelRotation, YTickLabelRotation, и ZTickLabelRotation.