您当前的位置: 首页 >  matlab

slandarer

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

slandarer 发布时间:2021-08-22 22:00:42 ,浏览量:0

0试验效果

在这里插入图片描述

.

1问题描述

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

.

2解决思路

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

% 创建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

在这里插入图片描述

关注
打赏
1664692598
查看更多评论
立即登录/注册

微信扫码登录

0.0391s