1

このコードを開発して、ユーザーが matlab の図をズームインまたはズームアウトしたかどうかを確認しました

function demo3

MainFig = figure;
x = sin(theta) + 0.75*rand(1,300);
y = cos(theta) + 0.75*rand(1,300);
a = 40;
hs=scatter(x,y,a,'MarkerEdgeColor',[0 .5 .5],...
'MarkerFaceColor',[0 .7 .7],...
'LineWidth',1.5);        
h = zoom;

set(MainFig, 'WindowScrollWheelFcn', @figure1_WindowScrollWheelFcn);
set(h, 'ActionPostCallback', @mypostcallback);

function mypostcallback(h, eventdata)
disp('INFO: Direction')
h2 = zoom;
get(h2,'Direction')

function figure1_WindowScrollWheelFcn(hObject, eventdata, handles)
if eventdata.VerticalScrollCount > 0
    disp ('Scrool Up ')
else
    disp ('Scrool Down ')
end

問題は、コードを実行してマウス スクロールを使用すると、情報が正しく、上下にスクロールするかどうかを検出することです。ただし、ズームツールを使用してズームインすると、方向に対して相対的に正しい情報が表示されますが、マウスを上下にスクロールすると、情報は同じです。

情報: 方向

ans =

ズーム ツールまたはスクロール マウスを使用してズームインまたはズームアウトしたかどうかを検出するコードが必要です。

4

1 に答える 1

1

代わりにこれを試してください:

set(h, 'ActionPostCallback', @mypostcallback);
set(h, 'ActionPreCallback', @myprecallback);

function myprecallback(h, eventdata)
set(h, 'UserData', {eventdata.Axes.XLim, eventdata.Axes.YLim})

function mypostcallback(h, eventdata)
old_lims = get(h, 'UserData');
old_d = cellfun(@diff, old_lims);
new_d = [diff(eventdata.Axes.XLim), diff(eventdata.Axes.YLim)];
disp('INFO: Direction')
if all(old_d == new_d)
    disp('No change');
elseif  all(old_d-new_d <= 0)
    disp('Out')
elseif all(old_d-new_d >= 0)
    disp('In')
else
    disp('oops, did not expect this!')
end

axesこれにより、ズーム直前の制限が保存され、ズーム後の制限と比較されます。大きければズームアウトし、小さければズームインします。

于 2016-03-24T23:37:43.613 に答える