Main Content

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

  • IsoValuedouble형 클래스의 1×1 배열이어야 합니다.

  • Enclose의 값은 'above' 또는 'below'여야 합니다.

  • CapVisiblematlab.lang.OnOffSwitchState형 클래스의 1×1 배열이어야 합니다.

  • Colordouble형 클래스의 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, EncloseCapVisible로 지정합니다.

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의 값을 설정한 후 ExpensivePropChangedtrue로 설정합니다. 따라서, 다음에 update 메서드가 실행될 때 ExpensivePropChangedtrue인 경우에만 doExpensiveCalculation을 호출합니다. 그런 다음 update 메서드는 차트의 다른 특성을 계속 업데이트합니다.

예제: 사용자 지정된 속성 표시를 갖는 최적화된 등가곡면 차트

isosurface를 연결된 isocaps를 사용하여 표시하도록 IsoSurfCapChart 클래스를 정의합니다. 다음과 같은 특징을 갖도록 하십시오.

  • 크기 및 클래스 유효성 검사를 사용하는 속성

  • 사용자 지정된 속성 표시

  • 관련 속성 중 하나 이상이 변경된 경우에만 isosurfaceisocaps를 재계산하는 최적화된 update 메서드

이 클래스를 정의하려면 MATLAB 경로에 있는 폴더에 IsoSurfCapChart.m이라는 프로그램 파일을 만드십시오. 그런 다음 표에 나와 있는 단계를 따라 클래스를 구현합니다.

단계구현

ChartContainer 기본 클래스에서 파생시킵니다.

classdef IsoSurfCapChart < matlab.graphics.chartcontainer.ChartContainer

클래스 및 크기 유효성 검사를 사용하여 퍼블릭 속성을 정의합니다.

  • VolumeData, IsoValue, Colorisosurface에 대한 파라미터입니다.

  • Enclose, WhichCapPlane, CapVisibleisocaps에 대한 파라미터입니다.

    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

프라이빗 속성을 정의합니다.

  • IsoPatchCapPatchisosurfaceisocaps에 대한 Patch 객체를 저장합니다.

  • SmoothData는 평활화된 볼륨 데이터를 저장합니다.

  • ExpensivePropChanged는 update 메서드가 isosurfaceisocaps를 재계산해야 하는지 여부를 나타냅니다.

    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

setup 메서드를 구현합니다. 이 경우, patch 함수를 두 번 호출하여 isosurfaceisocaps에 대한 Patch 객체를 만듭니다. 대응하는 속성에 객체를 저장하고 좌표축을 구성합니다.

    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

update 메서드를 구현합니다. ExpensivePropChanged의 값을 테스트하여 doExpensiveCalculation 메서드를 호출할지 여부를 결정합니다. 그런 다음, 차트의 다른(연산 비용이 적게 드는) 특성을 계속해서 업데이트합니다.

        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

볼륨 데이터를 평활화하고 isosurfaceisocaps의 면과 꼭짓점을 재계산하는 doExpensiveCalculation 메서드를 구현합니다.

        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

getPropertyGroups 메서드를 구현하여 속성 표시를 사용자 지정합니다.

        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

연산 비용이 많이 드는 속성(VolumeData, IsoValueEnclose) 각각에 대해 set 메서드를 구현합니다. 각 메서드 내에서 대응하는 속성값을 설정한 후 ExpensivePropChangedtrue로 설정합니다.

    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;

참고 항목

클래스

함수

관련 항목