在图形中用鼠标拖动轴:Matlab Gui Guide

Dragging an axes with a mouse within a figure: Matlab Gui Guide

class 的目的是允许用户单击图像(即轴)并将其拖过图形。当检测到鼠标单击时,该函数会检测鼠标位置位于哪些轴内并启动 'windowbuttonmotionfcn' 调用函数 'movit'。函数 'movit' 的目的是在按下鼠标按钮时拖动鼠标移动时选择的轴。[​​=14=]

    function Mclicked(this, src, event)
        % get location of mouse click on the gui
         set(gca,'units','pix') ;
         mousePositionData = get(gca, 'CurrentPoint')
         this.x = mousePositionData(1,1);
         this.y = mousePositionData(1,2);

        %get origin position of all axes within the figure
        set(gca,'units','pix') ;
        AxesHandle=findobj(gcf,'Type','axes');
        pt1 = get(AxesHandle,{'Position','tightinset'}); % [left bottom right top] 

        %get the axes that mouse as clicked on and it in Values as a mat
            set(gcf,'windowbuttonmotionfcn',@( src, event) movit(this,src, event));
            set(gcf,'windowbuttonupfcn',@( src, event) stopmovit(this, src, event));   
        end
    end

我在变量x和y中存储了第一次点击鼠标时的原始位置。下面的算法在按下按钮时获取鼠标的新位置,并计算这两次鼠标移动之间的 difference/distance。添加此差异以获得轴的新位置。

    function movit(this, src, event)
        %get location of new mouse position on the gui
        set(gca,'units','pix') ;
        mousePositionData = get(gca, 'CurrentPoint')
        this.x2 = mousePositionData(1,1);
        this.y2 = mousePositionData(1,2);
        this.distancex= this.x2-this.x;
        this.distancey= this.y2-this.y;
        %get the new location of the image.
        this.x2=this.Values(1,1)+this.distancex;
        this.y2=this.Values(1,2)+this.distancey;

        set(gca,'Position',[this.x2 this.y2 this.h this.w]); %x y h w
        drawnow;
    end

我遇到的问题是轴没有移动到鼠标附近。例如,当鼠标按钮按下时,鼠标向下移动甚至向上移动时,image/axes向下移动并消失。它不会与鼠标光标一起移动。

我做了一个测试来验证 set(gca,'Position',[...]); %x y h w 是否正常工作,方法是使用一个计数器在图中移动,我将计数器加 1 并将值添加到原始位置。轴按预期移动并且对 user.Therefore 可见,set(gca,'Position',[...]); %x y h w 工作正常。但是,我不确定错误是什么。我假设它与我想调用的计算或一段代码有关。

mousePositionData = get(gca, 'CurrentPoint') 行获取轴内鼠标位置的坐标。但是,我们需要获取鼠标在图形或图形用户界面中的位置。因此,我将gca改为gcf.

另外,我发现x和y坐标需要互换。 set(gca,'Position',[this.y2 this.x2 this.h this.w]); %x y h w

图像现在位于鼠标光标旁边。仍然需要一些小的调整来完善它。