MATLAB 让两个或多个AXES同步旋转

Posted slandarer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB 让两个或多个AXES同步旋转相关的知识,希望对你有一定的参考价值。

0试验效果


.

1问题描述

问题是这样的,我希望在旋转其中一个AXES的视角的同时,其他AXES跟着以相同视角旋转。


.

2解决思路

2.1AXES标签
我们首先需要确认AXES是哪个是哪个,因此我们需要为AXES设置标签,TagUserData 均可(其实用位置信息也可以,但显得没有那么整洁):

% 创建figure窗口
fig=figure();
fig.Position=[200 100 900 450];

% 创建axes1
ax1=axes(fig);
ax1.Position=[0.05 0.1 0.4 0.8];
ax1.UserData=1;
hold(ax1,'on') % 这步hold是必要的,防止UserData属性或Tag属性被刷掉
grid(ax1,'on') % 加个网格,为了好看而已不必要

% 创建axes2
ax2=axes(fig);
ax2.Position=[0.55 0.1 0.4 0.8];
ax2.UserData=2;
hold(ax2,'on')
grid(ax2,'on')

2.2鼠标按住且滑动判断
判断鼠标是否在点击状态下滑动
与之前刮刮乐那篇类似,首先判断鼠标是否否被按住。因此我们设置一个名为 isClicking 的变量,并设置鼠标按下和鼠标松开两个回调函数,当鼠标点击时将 isClicking 设置为true,当鼠标松开时 isClicking 设置为false。
之后就可以通过WindowButtonMotionFcn回调判断鼠标是否移动:

isClicking=false;
set(fig,'WindowButtonDownFcn',@bt_down);  % 设置鼠标按下回调
set(fig,'WindowButtonUpFcn',@bt_up);      % 设置鼠标松开回调
set(fig,'WindowButtonMotionFcn',@bt_move);% 设置鼠标移动回调

function bt_down(~,~),isClicking=true;end % 鼠标按下回调
function bt_up(~,~),isClicking=false;end  % 鼠标松开回调
function bt_move(~,~)
    if isClicking
        % 代码能运行到这里说明鼠标被按住的同时滑动了
        % 以下为后续要写的一大堆代码:
        % 。。。 。。。
    end
end

2.3更改其他AXES的view属性
我们首先可以获得fig的CurrentAxes属性,即当前点击的坐标区域,然后我们获得当前坐标区域的UserData属性能够判断出当前点击的是哪个坐标区域,之后就可以将其他坐标区域的view属性设置的与当前坐标区域相同:
把bt_move函数做如下更改即可:

function bt_move(~,~)
    if isClicking
        tempAxes=fig.CurrentAxes;
        for i=1:2 % 两个axes
            if i~=tempAxes.UserData
                otherAxes=findobj('UserData',i);
                otherAxes.View=tempAxes.View;
            end
        end

    end
end

.

3完整代码

3.1 两个或多个AXES
以下代码只做为示例,想要更多的坐标区域只需要设置更多的axes并调整position userdata等参数即可:

function SCR_2Axes
% @author:slandarer

% 创建figure窗口
fig=figure();
fig.Position=[200 100 900 450];

% 创建axes1
ax1=axes(fig);
ax1.Position=[0.05 0.1 0.4 0.8];
ax1.UserData=1;
hold(ax1,'on') % 这步hold是必要的,防止UserData属性或Tag属性被刷掉
grid(ax1,'on') % 加个网格,为了好看而已不必要

% 创建axes2
ax2=axes(fig);
ax2.Position=[0.55 0.1 0.4 0.8];
ax2.UserData=2;
hold(ax2,'on')
grid(ax2,'on')

isClicking=false;
set(fig,'WindowButtonDownFcn',@bt_down);  % 设置鼠标按下回调
set(fig,'WindowButtonUpFcn',@bt_up);      % 设置鼠标松开回调
set(fig,'WindowButtonMotionFcn',@bt_move);% 设置鼠标移动回调

function bt_down(~,~),isClicking=true;end % 鼠标按下回调
function bt_up(~,~),isClicking=false;end  % 鼠标松开回调
function bt_move(~,~)
    if isClicking
        tempAxes=fig.CurrentAxes;
        for i=1:2 % 两个axes
            if i~=tempAxes.UserData
                otherAxes=findobj('UserData',i);
                otherAxes.View=tempAxes.View;
            end
        end

    end
end

% 在这里绘图===============================================================
plot3(ax1,[0,1],[0,1],[0,1],'LineWidth',2)
scatter3(ax2,rand([10,1]),rand([10,1]),rand([10,1]),'filled')
% =========================================================================

end


3.2 超多AXES
以下给出mxn个AXES批量构建的方法,使用到坐标区域数组:

function SCR_mnAxes
% @author:slandarer

% 创建figure窗口
fig=figure();
fig.Position=[200 100 900 450];

M=2;N=4;% 两行四axes
% 创建axes
for m=1:M
    for n=1:N
        ax(m,n)=axes(fig);
        ax(m,n).Position=[0.1*(1/N)+(1/N)*(n-1),...
                          0.1*(1/M)+(1/M)*(m-1),...
                          0.8*(1/N),0.8*(1/M)];
        ax(m,n).UserData=[m,n];
        hold(ax(m,n),'on')
        grid(ax(m,n),'on')
    end
end

isClicking=false;
set(fig,'WindowButtonDownFcn',@bt_down);  % 设置鼠标按下回调
set(fig,'WindowButtonUpFcn',@bt_up);      % 设置鼠标松开回调
set(fig,'WindowButtonMotionFcn',@bt_move);% 设置鼠标移动回调

function bt_down(~,~),isClicking=true;end % 鼠标按下回调
function bt_up(~,~),isClicking=false;end  % 鼠标松开回调
function bt_move(~,~)
    if isClicking
        tempAxes=fig.CurrentAxes;
        for mm=1:M
            for nn=1:N
                if ~all([mm,nn]==tempAxes.UserData)
                    ax(mm,nn).View=tempAxes.View;
                end
            end
        end

    end
end
% 在这里绘图===============================================================
for m=1:M
    for n=1:N
        scatter3(ax(m,n),rand([5,1]),rand([5,1]),rand([5,1]),'filled')
    end
end
% =========================================================================

end

以上是关于MATLAB 让两个或多个AXES同步旋转的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB 让两个或多个AXES同步旋转

MATLAB | 一行代码实现多子图同步调整视角

MATLAB | 一行代码实现多子图同步调整视角

matlab gui 中怎样 让图形和axes大小一样;

matlab如何让坐标轴的值减少一百倍

MATLAB 50行代码绘制超好看的旋转九边形