MATLAB 让两个或多个AXES同步旋转
Posted slandarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB 让两个或多个AXES同步旋转相关的知识,希望对你有一定的参考价值。
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
以上是关于MATLAB 让两个或多个AXES同步旋转的主要内容,如果未能解决你的问题,请参考以下文章