exponenta event banner

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

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

Некоторые свойства зависят от значения других свойств. 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

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

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

Этот код работает плохо, поскольку:

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

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

Производительность выше, поскольку этот код:

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

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

  • Требования drawnow после завершения второго цикла.

Изменение текста Extent поворот меток

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