Когда вы разрабатываете пользовательский график как подкласс 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
method, вызывать 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
участвует в дорогостоящем расчете. The 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;