Когда вы разрабатываете пользовательский график как подкласс ChartContainer базовый класс, можно использовать определенные методы, чтобы сделать код более устойчивым, эффективным, и созданным в соответствии с нуждами пользователей. Это особое внимание методов о том, как вы задаете и управляете свойствами своего класса. Используйте любого, которые полезны для типа визуализации, которую вы хотите создать и пользовательский опыт, который вы хотите обеспечить.
Инициализируйте значения свойств — Набор состояние по умолчанию графика в случае, если ваши пользователи вызывают неявного конструктора без любых входных параметров.
Подтвердите значения свойств — Убедитесь, что значения допустимы перед использованием их, чтобы выполнить вычисление или сконфигурировать один из базовых графических объектов в вашем графике.
Настройте отображение свойства — Предоставляют индивидуально настраиваемый список свойств когда справочники пользователя объект диаграммы без точки с запятой.
Оптимизируйте update метод — Улучшает производительность update метод, когда только подмножество ваших свойств используются в длительном вычислении.
Присвойте значения по умолчанию для всех публичных свойств вашего класса. Выполнение так конфигурирует допустимый график, если пользователь не использует некоторые аргументы пары "имя-значение", когда они вызывают метод конструктора.
Для свойств, которые хранят координатные данные, установите начальные значения к NaN значения или пустые массивы так, чтобы график по умолчанию был пуст, когда пользователь не задает координаты. Выберите координаты по умолчанию согласно требованиям функций построения графика, которые вы планируете вызвать в своих методах класса. Чтобы узнать о требованиях, см. документацию для функций построения графика, которые вы планируете использовать.
Хорошая практика должна проверить значения ваших свойств класса, прежде чем ваш код будет использовать те значения. Удобный способ сделать это должно подтвердить размер и класс свойств, когда вы задаете их. Например, этот блок свойства подтверждает размер и класс четырех свойств.
properties IsoValue (1,1) double = 0.5 Enclose {mustBeMember(Enclose,{'above','below'})} = 'below' CapVisible (1,1) matlab.lang.OnOffSwitchState = 'on' Color (1,3) double {mustBeGreaterThanOrEqual(Color,0),... mustBeLessThanOrEqual(Color,1)} = [.2 .5 .8] end
IsoValue должен быть массив 1 на 1 класса double.
Enclose должен иметь значение любого 'above' или 'below'.
CapVisible должен быть массив 1 на 1 класса matlab.lang.OnOffSwitchState.
Color должен быть 1 3 массив класса double, где каждое значение находится в области значений [0,1].
Можно также подтвердить свойства, которые хранят базовые графические объекты в графике. Чтобы определить имя класса объекта, вызовите соответствующую функцию построения графика в командной строке, и затем вызовите class функция, чтобы получить имя класса. Например, если вы планируете вызвать patch функционируйте в своем setup метод, вызовите patch функция в командной строке с выходным аргументом (входные параметры не имеют значения). Затем передайте выход class функция, чтобы получить ее имя класса.
x = patch(NaN,NaN,NaN); class(x)
ans =
'matlab.graphics.primitive.Patch'Используйте выход class функция, чтобы подтвердить класс для соответствующего свойства в вашем классе. Например, каждое из следующих свойств хранит Patch объект.
properties (Access = private,Transient,NonCopyable) IsoPatch (1,1) matlab.graphics.primitive.Patch CapPatch (1,1) matlab.graphics.primitive.Patch end
Иногда, вы можете хотеть задать свойство, которое может сохранить различные формы и классы значений. Например, если вы задаете свойство, которое может сохранить вектор символов, массив ячеек из символьных векторов, или массив строк, не использовать размер и валидацию класса или использовать пользовательский метод валидации свойства.
Для получения дополнительной информации о проверке свойств, см. Проверку значений свойств.
Одно из преимуществ определения вашего графика как подкласс ChartContainer базовый класс - то, что это также наследовалось matlab.mixin.CustomDisplay класс. Таким образом можно настроить список свойств MATLAB® отображения в Командном окне, когда вы ссылаетесь на график без точки с запятой. Чтобы настроить отображение свойства, перегрузите getPropertyGroups метод. В рамках того метода можно настроить, какие свойства перечислены и порядок списка. Например, рассмотрите IsoSurfCapChart класс, который имеет следующие публичные свойства.
properties IsoValue (1,1) double = 0.5 Enclose {mustBeMember(Enclose,{'above','below'})} = 'below' CapVisible (1,1) matlab.lang.OnOffSwitchState = 'on' Color (1,3) double {mustBeGreaterThanOrEqual(Color,0),... mustBeLessThanOrEqual(Color,1)} = [.2 .5 .8] end
Следующий getPropertyGroups метод задает скалярный список свойств объекта как Color, IsoValue, Enclose, и CapVisible.
function propgrp = getPropertyGroups(obj) if ~isscalar(obj) % List for array of objects propgrp = getPropertyGroups@matlab.mixin.CustomDisplay(obj); else % List for scalar object propList = {'Color','IsoValue','Enclose','CapVisible'}; propgrp = matlab.mixin.util.PropertyGroup(propList); end end
Когда справочники пользователя экземпляр этого графика без точки с запятой, MATLAB отображает индивидуально настраиваемый список.
c = IsoSurfCapChart
c =
IsoSurfCapChart with properties:
Color: [0.2000 0.5000 0.8000]
IsoValue: 0.5000
Enclose: 'below'
CapVisible: on
Для получения дополнительной информации о настройке отображения свойства, см. Отображение пользовательских свойств.
update МетодВ большинстве случаев, update метод вашего класса реконфигурировал все соответствующие аспекты вашего графика, которые зависят от публичных свойств. Иногда, реконфигурирование включает дорогое вычисление, которое является трудоемким. Если вычисление включает только подмножество свойств, можно спроектировать класс, чтобы выполнить тот код только, когда это необходимо.
Один способ оптимизировать update метод должен добавить эти компоненты в ваш класс:
Задайте частную собственность под названием ExpensivePropChanged это принимает logical значение. Это свойство указывает, изменилось ли какое-либо из свойств, используемых в дорогом вычислении.
Запишите set метод для каждого свойства, вовлеченного в дорогое вычисление. В каждом set метод, набор ExpensivePropChanged свойство к true.
Запишите защищенный метод, который выполняет дорогое вычисление.
Напишите условный оператор в update метод, который проверяет значение ExpensivePropChanged. Если значением является true, выполните метод, который выполняет дорогое вычисление.
Следующий код предоставляет упрощенное внедрение этого проекта.
classdef OptimizedChart < matlab.graphics.chartcontainer.ChartContainer properties Prop1 Prop2 end properties(Access=private,Transient,NonCopyable) ExpensivePropChanged (1,1) logical = true end methods(Access = protected) function setup(obj) % Configure chart % ... end function update( obj ) % Perform expensive computation if needed if obj.ExpensivePropChanged doExpensiveCalculation(obj); obj.ExpensivePropChanged = false; end % Update other aspects of chart % ... end function doExpensiveCalculation(obj) % Expensive code % ... end end methods function set.Prop2(obj,val) obj.Prop2 = val; obj.ExpensivePropChanged = true; end end end
Prop2 вовлечен в дорогое вычисление. set.Prop2 метод устанавливает значение Prop2, и затем это устанавливает ExpensivePropChanged к true. Таким образом, в следующий раз update запуски метода, это вызывает doExpensiveCalculation только если ExpensivePropChanged true. Затем update метод продолжает обновлять другие аспекты графика.Задайте IsoSurfCapChart класс для отображения isosurface со связанным isocaps. Включайте следующие функции:
Свойства, которые используют валидация класса и размер
Индивидуально настраиваемое отображение свойства
Оптимизированный update метод, который повторно вычисляет isosurface и isocaps только если один или несколько соответствующих измененных свойств
Чтобы задать этот класс, создайте программный файл под названием IsoSurfCapChart.m в папке, которая находится на пути MATLAB. Затем реализуйте класс путем выполнения шагов в таблице.
| Шаг | Реализация |
|---|---|
Выведите из |
classdef IsoSurfCapChart < matlab.graphics.chartcontainer.ChartContainer |
Задайте публичные свойства с помощью валидации размера и класса.
|
properties
VolumeData double = rand(25,25,25)
IsoValue (1,1) double = 0.5
Enclose {mustBeMember(Enclose,{'above','below'})} = 'below'
WhichCapPlane {mustBeMember(WhichCapPlane,{'all','xmin',...
'xmax','ymin','ymax','zmin','zmax'})} = 'all'
CapVisible (1,1) matlab.lang.OnOffSwitchState = 'on'
Color (1,3) double {mustBeGreaterThanOrEqual(Color,0),...
mustBeLessThanOrEqual(Color,1)} = [.2 .5 .8]
end |
Задайте частные свойства.
|
properties(Access = private,Transient,NonCopyable)
IsoPatch (1,1) matlab.graphics.primitive.Patch
CapPatch (1,1) matlab.graphics.primitive.Patch
SmoothData double = [];
ExpensivePropChanged (1,1) logical = true
end |
Реализуйте |
methods(Access = protected)
function setup(obj)
ax = getAxes(obj);
% Create two Patch objects
obj.IsoPatch = patch(ax,NaN,NaN,NaN, 'EdgeColor', 'none', ...
'FaceColor',[.2 .5 .8],'FaceAlpha',0.9);
hold(ax,'on');
obj.CapPatch = patch(ax,NaN,NaN,NaN,'EdgeColor', 'none', ...
'FaceColor','interp');
% Configure the axes
view(ax,3)
camlight(ax, 'infinite');
camlight(ax,'left');
lighting(ax, 'gouraud');
hold(ax,'off');
end |
Реализуйте |
function update(obj) % Perform expensive computation if needed if obj.ExpensivePropChanged doExpensiveCalculation(obj); obj.ExpensivePropChanged = false; end % Update visibility of CapPatch and update color obj.CapPatch.Visible = obj.CapVisible; obj.IsoPatch.FaceColor = obj.Color; end |
Реализуйте |
function doExpensiveCalculation(obj) % Update isosurface obj.SmoothData = smooth3(obj.VolumeData,'box',7); [F,V] = isosurface(obj.SmoothData, obj.IsoValue); set(obj.IsoPatch,'Faces',F,'Vertices',V); isonormals(obj.SmoothData,obj.IsoPatch); % Update isocaps [m,n,p] = size(obj.SmoothData); [Xc,Yc,Zc] = meshgrid(1:n,1:m,1:p); [Fc,Vc,Cc] = isocaps(Xc,Yc,Zc,obj.SmoothData,obj.IsoValue,... obj.Enclose,obj.WhichCapPlane); set(obj.CapPatch,'Faces',Fc,'Vertices',Vc,'CData',Cc); end |
Реализуйте |
function propgrp = getPropertyGroups(obj) if ~isscalar(obj) % List for array of objects propgrp = getPropertyGroups@matlab.mixin.CustomDisplay(obj); else % List for scalar object propList = {'Color','IsoValue','Enclose','CapVisible',... 'WhichCapPlane','VolumeData'}; propgrp = matlab.mixin.util.PropertyGroup(propList); end end end |
Реализуйте |
methods
function set.VolumeData(obj,val)
obj.VolumeData = val;
obj.ExpensivePropChanged = true;
end
function set.IsoValue(obj, val)
obj.IsoValue = val;
obj.ExpensivePropChanged = true;
end
function set.Enclose(obj, val)
obj.Enclose = val;
obj.ExpensivePropChanged = true;
end
end
end |
Затем создайте массив данных об объеме, и затем создайте экземпляр IsoSurfCapChart.
[X,Y,Z] = meshgrid(-2:0.1:2); v = (1/9)*X.^2 + (1/16)*Y.^2 + Z.^2; c = IsoSurfCapChart('VolumeData',v,'IsoValue',0.5)
c =
IsoSurfCapChart with properties:
Color: [0.2000 0.5000 0.8000]
IsoValue: 0.5000
Enclose: 'below'
CapVisible: on
WhichCapPlane: 'all'
VolumeData: [41×41×41 double]
Измените цвет c и скройте isocaps.
c.Color = [1 0.60 0]; c.CapVisible = false;
