MATLAB滑鼠事件應用(記錄)
阿新 • • 發佈:2019-01-25
前記:
人機互動的方式--鍵盤開關、滑鼠、觸控式螢幕、體感感測器(Kinect、leap motion)等的使用大大促進人與機器的交流過程。
這裡記錄滑鼠事件與MATLAB的結合,為後期機器人模擬控制打下基礎---如滑鼠直接拖動機器人運動(像很多機器人模擬軟體裡的作用一樣,如Robotstudio、soldworks、proe\core、Adams等)。
1、滑鼠畫矩形
程式碼功能:執行程式碼在出現的figure視窗,點選滑鼠畫出矩形
k = waitforbuttonpress; point1 = get(gca,'CurrentPoint'); % button down detected finalRect = rbbox; % return figure units point2 = get(gca,'CurrentPoint'); % button up detected point1 = point1(1,1:2); % extract x and y point2 = point2(1,1:2); p1 = min(point1,point2); % calculate locations offset = abs(point1-point2); % and dimensions x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)]; y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)]; hold on axis manual plot(x,y)
2、滑鼠拖動直線
function main f =figure; aH=axes('Xlim',[0 1],'Ylim',[0 1]); h=line([0.5 0.5],[0 1],... 'color','red',... 'linewidth',4,... 'ButtonDownFcn',@startDragFcn); set(f,'WindowButtonUpFcn',@startDragFcn); function startDragFcn(varargin) set(f,'WindowButtonMotionFcn',@draggingFcn); end function draggingFcn(varargin) pt=get(aH,'CurrentPoint'); set(h,'Xdata',pt(1)*[1 1]); end function stopDragFcn(varargin) set(f,'WindowButtonMotionFcn',''); end end
3、顯示座標
function ff x = 5:30; y = x.^2-40.*x+400; plot(x,y); axis([5,30,-50,250]); tb = text; set(gcf, 'WindowButtonMotionFcn', @callback); function callback(hObject, event) loc = get(gca, 'CurrentPoint'); loc = loc([1 3]); set(tb, 'string', num2str(loc), 'position', loc); end end
4、畫軌跡並儲存點座標
function MouseDraw(action)
% MouseDraw 本例展示如何以Handle Graphics來設定滑鼠事件
% (MouseDraw Events)的反應指令(Callbacks)
% 本程式在滑鼠移動非常快時,不會造成畫“斷線”
% global不能傳矩陣
global InitialX InitialY FigHandle
if nargin == 0, action = 'start';
end
switch(action)
%%開啟圖形視窗
case 'start'
FigHandle = figure('WindowButtonDownFcn','MouseDraw down');
axis([-600 600 -600 600]); % 設定圖軸範圍
% axis off;
grid on;
box on; % 將圖軸加上圖框
title('手寫體輸入窗');
% % fprintf('start');
%%設定滑鼠按鈕被按下時的反應指令為「MouseDraw down」
% set(gcf, 'WindowButtonDownFcn', 'MouseDraw down');
dlmwrite('IXT.txt', 10, 'delimiter', '\t', 'precision', 10);
dlmwrite('IZT.txt', 10, 'delimiter', '\t', 'precision', 10);
%%滑鼠按鈕被按下時的反應指令
case 'down'
if strcmp(get(FigHandle, 'SelectionType'), 'normal') %如果是左鍵
set(FigHandle,'pointer','hand');
CurPiont = get(gca, 'CurrentPoint');
InitialX = CurPiont(1,1);
InitialY = CurPiont(1,2);
dlmwrite('IXT.txt', InitialX, '-append', 'delimiter', '\t', 'precision', 10);
dlmwrite('IZT.txt', InitialY, '-append', 'delimiter', '\t', 'precision', 10);
% 列印「MouseDraw down!」訊息
% % fprintf('MouseDraw down!\n');
% 設定滑鼠移動時的反應指令為「MouseDraw move」
set(gcf, 'WindowButtonMotionFcn', 'MouseDraw move');
set(gcf, 'WindowButtonUpFcn', 'MouseDraw up');
elseif strcmp(get(FigHandle, 'SelectionType'), 'alt') % 如果是右鍵
set(FigHandle, 'Pointer', 'arrow');
set( FigHandle, 'WindowButtonMotionFcn', '')
set(FigHandle, 'WindowButtonUpFcn', '')
fprintf('MouseDraw right button down!\n');
ImageX = importdata('IXT.txt');
ImageY = importdata('IZT.txt');
InputImage = ones(imSize);
roundX = round(ImageX);
roundY = round(ImageY);
for k = 1:size(ImageX,1)
if 0<roundX(k) && roundX(k)<imSize && 0<roundY(k) && roundY(k)<imSize
InputImage(roundX(k)-1:roundX(k)+2, roundY(k)-1:roundY(k)+2) = 0;
end
end
InputImage = imrotate(InputImage,180); % 影象旋轉
figure(2);
imshow(InputImage);
end
%%滑鼠移動時的反應指令
case 'move'
CurPiont = get(gca, 'CurrentPoint');
X = CurPiont(1,1);
Y = CurPiont(1,2);
% 當滑鼠移動較快時,不會出現離散點。
% 利用y=kx+b直線方程實現。
x_gap = 1; % 定義x方向增量
y_gap = 1; % 定義y方向增量
if X > InitialX
step_x = x_gap;
else
step_x = -x_gap;
end
if Y > InitialY
step_y = y_gap;
else
step_y = -y_gap;
end
% 定義x,y的變化範圍和步長
if abs(X-InitialX) < 0.1 % 線平行於y軸,即斜率不存在時
iy = InitialY:step_y:Y;
ix = X.*ones(1,size(iy,2));
else
ix = InitialX:step_x:X ; % 定義x的變化範圍和步長
% 當斜率存在,即k = (Y-InitialY)/(X-InitialX) ~= 0
iy = (Y-InitialY)/(X-InitialX).*(ix-InitialX)+InitialY;
end
ImageX = [ix, X];
ImageY = cat(2, iy, Y);
line(ImageX,ImageY, 'marker', '.', 'markerSize',1, ...
'LineStyle', '-', 'LineWidth', 2, 'Color', 'Blue');
dlmwrite('IXT.txt', ImageX, '-append', 'delimiter', '\t', 'precision', 10);
dlmwrite('IZT.txt', ImageY, '-append', 'delimiter', '\t', 'precision',10);
InitialX = X; %記住當前點座標
InitialY = Y; %記住當前點座標
% 列印「MouseDraw is moving!」及滑鼠現在位置
% fprintf('MouseDraw is moving! Current location = (%g, %g)\n', ...
% CurPiont(1,1), CurPiont(1,2));
% % fprintf('MouseDraw move!\n');
% 設定滑鼠按鈕被釋放時的反應指令為「MouseDraw up」
% set(gcf, 'WindowButtonUpFcn', 'MouseDraw up');
%%滑鼠按鈕被釋放時的反應指令
case 'up'
% 清除滑鼠移動時的反應指令
set(gcf, 'WindowButtonMotionFcn', '');
% 清除滑鼠按鈕被釋放時的反應指令
set(gcf, 'WindowButtonUpFcn', '');
% 列印「MouseDraw up!」
% % fprintf('MouseDraw up!\n');
end
end
5、也是拖動直線的,不過一個拖動時,另一個不動。點選show position...在命令列返回數值(因為有GUI所以打包放在我的資源裡了,需要的自己下)點選開啟連結。
6、後記
以上為網上資源的收集,主要是供自己學習。如果碰巧你需要,甚幸~.~ //