MATLAB에서 그림 그리기 도구를 만들어 보았다 (마우스 조작 이벤트에 따른 프로그램 예)

소개



MATLAB에서는 마우스 조작에 따라 프로그램을 실행할 수 있습니다. 여기에서는 간단한 그림 그리기 도구를 예로 그 방법을 설명합니다.

어떻게 프로그래밍합니까?



스크립트나 함수를 기술하는 MATLAB에 있어서, 마우스 조작에 따른 프로그래밍을 어떻게 하는지, 확실히 알기 어렵습니다만, 실은, 그래프 등을 묘화 하는 figure 에 콜백 함수를 설정하는 것으로, 마우스 조작에 적절한 프로그램을 할 수 있습니다. 마우스 조작에 따른 선을 그리면 그림 도구를 만들 수 있습니다.

마우스 조작에 대한 figure 콜백 함수



figure에는 마우스 조작에 따라 다음과 같은 콜백 함수가 있습니다.


콜백 함수
개요


WindowButtonDownFcn
마우스를 클릭할 때 호출되는 콜백 함수

WindowButtonMotionFcn
마우스를 움직일 때 호출되는 콜백 함수

WindowButtonUpFcn
마우스를 놓을 때 호출되는 콜백 함수


덧붙여서, 이번 예제에서는 사용하지 않지만, figure에는 키보드 입력에 대응하는 WindowKeyPressFcn이라는 콜백 함수도 있습니다.

마우스 위치 얻기



마우스가 있는 장소는, figure, 또는, axes 의 CurrentPoint property로 취득할 수가 있습니다. 이 그림 그리기 도구는 축의 좌표를 원하므로 축의 CurrentPoint를 사용합니다.

프로그램 예



다음 아이디어로 프로그램을 만듭니다.
  • figure 전체에 axes를 표시
  • 마우스 버튼을 누르면 버튼 누름 상태를 공통 변수에 저장하고 그 점을 라인으로 표시합니다.
  • 버튼을 누른 상태에서 마우스를 이동하면 라인의 X 좌표와 Y 좌표에 새 좌표를 추가하여 업데이트합니다.
  • 마우스 버튼을 놓으면 버튼 누름 상태가 꺼집니다

  • 그럼 실제 프로그램의 예입니다.

    simple_draw.m
    function simple_draw()
    
    %% 共通変数の定義
    ButtonState = false;      % マウスボタンの押下状態
    curLineH    = gobjects(); % 現在のLineのオブジェクト
    curLineX    = [];         % 現在のLineのX座標
    curLineY    = [];         % 現在のLineのY座標
    
    %% Figureの表示
    figH                       = figure();                     % figH: Figureオブジェクト
    figH.MenuBar               = 'none';                       % メニューをオフ
    figH.WindowButtonDownFcn   = @WindowButtonDownFcn_figH;    % マウスボタン押下時のコールバック関数を指定
    figH.WindowButtonMotionFcn = @WindowButtonMotionFcn_figH;  % マウスボタン移動時のコールバック関数を指定
    figH.WindowButtonUpFcn     = @WindowButtonUpFcn_figH;      % マウスボタンリリース時のコールバック関数を指定
    
    %% Axesの表示
    axH               = axes(figH);    % axH: 軸オブジェクト
    axH.XTick         = [];            % X軸目盛をオフ
    axH.YTick         = [];            % Y軸目盛をオフ
    axH.Units         = 'normalized';  % Positionの単位指定
    axH.Position      = [0,0,1,1];     % Figure全体にAxesを表示
    axH.XLim          = [0,1];         % X軸範囲を指定
    axH.YLim          = [0,1];         % Y軸範囲を指定
    
        %% コールバック関数の定義
        function WindowButtonDownFcn_figH(~,~)
            %% マウスボタン押下時のコールバック        
            ButtonState = true; % 押下状態を保存
    
            % マウスの位置の取得
            curLineX = axH.CurrentPoint(1,1);
            curLineY = axH.CurrentPoint(1,2);
    
            % 線の描画
            curLineH = line(axH,curLineX, curLineY);
        end
    
        function WindowButtonMotionFcn_figH(~,~)
            %% マウスボタン移動時のコールバック
            if ButtonState
                % マウスボタンを押下時には、Lineの描画を更新
    
                % 現在のマウスの位置
                X = axH.CurrentPoint(1,1);
                Y = axH.CurrentPoint(1,2);
    
                % 線の座標値を更新
                curLineX = [curLineX;X];
                curLineY = [curLineY;Y];
    
                % 描画の更新
                curLineH.XData = curLineX;
                curLineH.YData = curLineY;
            end
        end
    
        function WindowButtonUpFcn_figH(~,~)
            %% マウスボタンリリース時のコールバック
            ButtonState = false;  % ボタン押下状態を解除
        end
    end
    

    콜백 함수를 중첩 함수로 설정하면 마우스 클릭 상태를 유지하는 ButtonState를 공통 변수로 사용합니다.

    실행 예



    실행하면 아무것도 표시되지 않는 figure가 표시되므로 마우스를 클릭하여 그림을 그릴 수 있습니다.
    이런 느낌입니다. (그림 마음이 없어서 스미마센..)
    일반적인 PC를 상정해, 「마우스」라고 설명해 왔습니다만, 터치 패널 대응의 PC라면, 손가락이나 펜으로 그림을 그릴 수도 있습니다.




    끝에



    MATLAB에서 마우스 조작에 대응하는 프로그램 예로서, figure의 콜백 함수를 이용한 그림 그리기 도구의 예를 소개했습니다. 60행 정도의 프로그램으로 되어 버리므로, 콜백 함수를 알면 여러가지 예에 적용하고 싶어지는군요.
    그림 그리기 도구의 응용 프로그램은 라인의 속성을 변경하여 선의 두께와 색상 등을 변경하거나 그린 그림을 이미지 파일로 저장하는 기능을 추가 할 수 있습니다. OCR 기능을 사용하여 필기 문자 인식도 가능하네요. 「좋아요」가 많이 붙으면 다음에 소개하고 싶습니다!

    계속 기사 : MATLAB에서 그림 그리기 도구를 만들어 보았습니다 (2) (버튼으로 다양한 설정)

    【보충】uifigure, uiaxes의 경우



    최신 MATLAB은 AppDesginer에서 사용되는 새로운 기술을 사용하는 uifigure를 제공하지만 uifigure는 비슷한 콜백 함수를 제공합니다.

    좋은 웹페이지 즐겨찾기