chart 클래스의 속성 관리하기
ChartContainer
기본 클래스의 서브클래스로 사용자 지정 차트를 개발하면 특정 기법을 사용하여 코드를 더욱 강력하고 효율적이며 사용자의 요구에 맞게 설정할 수 있습니다. 이러한 기법은 클래스의 속성을 정의하고 관리하는 방법에 중점을 둡니다. 만들려는 시각화 유형과 제공하려는 사용자 경험에 도움이 되는 기법을 사용하십시오.
속성값 초기화 — 사용자가 입력 인수 없이 묵시적 생성자를 호출하는 경우 차트의 디폴트 상태를 설정합니다.
속성값 유효성 검사 — 값을 사용하여 계산을 수행하거나 차트의 기본 그래픽스 객체 중 하나를 구성하기 전에 값이 유효한지 확인합니다.
속성 표시 사용자 지정 — 사용자가 세미콜론 없이 chart 객체를 참조할 때 속성의 사용자 지정 목록을 제공합니다.
update
메서드 최적화 — 시간이 오래 걸리는 계산에 일부 속성만 사용되는 경우update
메서드의 성능을 개선합니다.
속성값 초기화하기
클래스의 모든 퍼블릭 속성에 대한 디폴트 값을 할당하십시오. 이렇게 하면 사용자가 생성자 메서드를 호출할 때 이름-값 쌍의 인수 중 일부를 생략하는 경우에도 유효한 차트가 구성됩니다.
좌표 데이터를 저장하는 속성에 대해서는 사용자가 좌표를 지정하지 않을 경우 디폴트 차트가 비어 있도록 초기값을 NaN
값이나 빈 배열로 설정합니다. 클래스 메서드에서 호출하려는 플로팅 함수의 요구 사항에 따라 디폴트 좌표를 선택하십시오. 요구 사항에 대해 알아보려면 사용하려는 플로팅 함수에 대한 도움말 문서를 참조하십시오.
속성값 유효성 검사
코드에서 클래스 속성의 값을 사용하기 전에 이러한 값을 확인하는 것이 좋습니다. 이를 수행하는 간편한 방법은 속성을 정의할 때 속성의 크기와 클래스에 대한 유효성을 검사하는 것입니다. 예를 들어, 다음 속성 블록은 4개 속성의 크기와 클래스의 유효성을 검사합니다.
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
는double
형 클래스의 1×1 배열이어야 합니다.Enclose
의 값은'above'
또는'below'
여야 합니다.CapVisible
는matlab.lang.OnOffSwitchState
형 클래스의 1×1 배열이어야 합니다.Color
는double
형 클래스의 1×3 배열이어야 합니다. 여기서 각 값은[0,1]
범위 내에 있습니다.
차트의 기본 그래픽스 객체를 저장하는 속성의 유효성을 검사할 수도 있습니다. 어떤 객체의 클래스 이름을 확인하려면 명령줄에서 이에 대응하는 플로팅 함수를 호출한 후 class
함수를 호출하여 클래스 이름을 가져오십시오. 예를 들어, setup
메서드에서 patch
함수를 호출하려는 경우 명령줄에서 출력 인수를 지정하여 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
각기 다른 모양과 값 클래스를 저장할 수 있는 속성을 정의하려는 경우도 있을 수 있습니다. 예를 들어, 문자형 벡터, 문자형 벡터로 구성된 셀형 배열 또는 string형 배열을 저장할 수 있는 속성을 정의하는 경우 크기 및 클래스 유효성 검사를 생략하거나 사용자 지정 속성 유효성 검사 방법을 사용하십시오.
속성의 유효성을 검사하는 방법에 대한 자세한 내용은 속성값 유효성 검사 항목을 참조하십시오.
속성 표시 사용자 지정하기
차트를 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
속성 표시를 사용자 지정하는 방법에 대한 자세한 내용은 Customize Property Display 항목을 참조하십시오.
update
메서드 최적화하기
대부분의 경우 클래스의 update
메서드는 퍼블릭 속성에 종속된 차트의 모든 관련 특성을 재구성합니다. 때때로 재구성 작업에 시간과 연산 비용이 많이 드는 계산이 포함되는 경우가 있습니다. 계산에 속성의 일부만 사용되는 경우 필요할 때만 코드를 실행하도록 클래스를 설계할 수 있습니다.
update
메서드를 최적화하는 한 가지 방법은 다음 컴포넌트를 클래스에 추가하는 것입니다.
logical
값을 받는ExpensivePropChanged
라는 프라이빗 속성을 정의합니다. 이 속성은 연산 비용이 많이 드는 계산에 사용되는 속성 중 하나라도 변경되었는지 여부를 나타냅니다.연산 비용이 많이 드는 계산에 사용되는 각 속성에 대해
set
메서드를 작성합니다. 각set
메서드 내에서ExpensivePropChanged
속성을true
로 설정합니다.연산 비용이 많이 드는 계산을 수행하는 보호 메서드를 작성합니다.
ExpensivePropChanged
의 값을 검사하는update
메서드에 조건문을 작성합니다. 값이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
메서드가 실행될 때 ExpensivePropChanged
가 true
인 경우에만 doExpensiveCalculation
을 호출합니다. 그런 다음 update
메서드는 차트의 다른 특성을 계속 업데이트합니다.예제: 사용자 지정된 속성 표시를 갖는 최적화된 등가곡면 차트
isosurface
를 연결된 isocaps
를 사용하여 표시하도록 IsoSurfCapChart
클래스를 정의합니다. 다음과 같은 특징을 갖도록 하십시오.
크기 및 클래스 유효성 검사를 사용하는 속성
사용자 지정된 속성 표시
관련 속성 중 하나 이상이 변경된 경우에만
isosurface
및isocaps
를 재계산하는 최적화된update
메서드
이 클래스를 정의하려면 MATLAB 경로에 있는 폴더에 IsoSurfCapChart.m
이라는 프로그램 파일을 만드십시오. 그런 다음 표에 나와 있는 단계를 따라 클래스를 구현합니다.
단계 | 구현 |
---|---|
|
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;