home *** CD-ROM | disk | FTP | other *** search
- function [out1,out2,out3] = ginput(arg1, arg2)
- %GINPUT Graphical input from a mouse or cursor.
- % [X,Y] = GINPUT(N) gets N points from the current axes and returns
- % the X- and Y-coordinates in length N vectors X and Y. The cursor
- % can be positioned using a mouse (or by using the Arrow Keys on some
- % systems). Data points are entered by pressing a mouse button
- % or any key on the keyboard. A carriage return terminates the
- % input before N points are entered.
- %
- % [X,Y] = GINPUT gathers an unlimited number of points until the
- % return key is pressed.
- %
- % [X,Y,BUTTON] = GINPUT(N) returns a third result, BUTTON, that
- % contains a vector of integers specifying which mouse button was
- % used (1,2,3 from left) or ASCII numbers if a key on the keyboard
- % was used.
-
- % Copyright (c) 1984-93 by The MathWorks, Inc.
-
- c = computer;
- if ~strcmp(c(1:2),'PC') & ~strcmp(c(1:2),'MA')
- tp = get(0,'TerminalProtocol');
- else
- tp = 'micro';
- end
-
- if ~strcmp(tp,'none') & ~strcmp(tp,'x') & ~strcmp(tp,'micro'),
- if nargout == 1,
- if nargin == 1,
- eval('out1 = trmginput(arg1);');
- else
- eval('out1 = trmginput(arg1,arg2);');
- end
- elseif nargout == 2,
- if nargin == 1,
- eval('[out1,out2] = trmginput(arg1);');
- else
- eval('[out1,out2] = trmginput(arg1,arg2);');
- end
- elseif nargout == 3,
- if nargin == 1,
- eval('[out1,out2,out3] = trmginput(arg1);');
- else
- eval('[out1,out2,out3] = trmginput(arg1,arg2);');
- end
- end
- else
-
- fig = gcf;
- ax = gca;
-
- if nargin == 0
- how_many = -1;
- b = [];
- else
- how_many = arg1;
- b = [];
- if isstr(how_many), error('Requires a positive integer.'),end
- if how_many == 0
- ptr_fig = 0;
- while(ptr_fig ~= fig)
- ptr_fig = get(0,'PointerWindow');
- end
- scrn_pt = get(0,'PointerLocation');
- loc = get(fig,'Position');
- pt = [scrn_pt(1) - loc(1), scrn_pt(2) - loc(2)];
- out1 = pt(1); y = pt(2);
- elseif how_many < 0
- error('Argument must be a positive integer.')
- end
- end
-
- pointer = get(gcf,'pointer');
- set(gcf,'pointer','crosshair');
- fig_units = get(fig,'units');
- set(fig,'units','normalized');
- axu = get(ax,'units');
- set(ax,'units','normalized')
- xlin = strcmp('linear',get(ax,'xscale'));
- ylin = strcmp('linear',get(ax,'yscale'));
- if nargin > 1
- norm_rect = [0 0 1 1];
- handle = fig;
- else
- norm_rect = get(ax,'Position');
- handle = ax;
- ydir = get(ax,'ydir');
- ax_lim = axis;
- if ~xlin, ax_lim(1:2) = log(ax_lim(1:2)); end
- if ~ylin, ax_lim(3:4) = log(ax_lim(3:4)); end
- d_h = ax_lim(4) - ax_lim(3);
- if strcmp(ydir,'reverse'), ax_lim(3) = ax_lim(4); d_h = -d_h; end
- d_w = ax_lim(2) - ax_lim(1);
- end
- char = 0;
-
- while how_many ~= 0
- keydown = waitforbuttonpress;
- ptr_fig = get(0,'CurrentFigure');
- if(ptr_fig == fig)
- if keydown
- char = get(fig, 'CurrentCharacter');
- scrn_pt = get(0, 'PointerLocation');
- set(fig,'units','pixels')
- loc = get(fig, 'Position');
- set(fig,'units','normalized')
- pt = [scrn_pt(1) - loc(1), scrn_pt(2) - loc(2)];
- ax_rect = [fix(norm_rect(1)*loc(3)),fix(norm_rect(2)*loc(4)),...
- fix(norm_rect(3)*loc(3)),fix(norm_rect(4)*loc(4))];
- pt(1) = (pt(1) - ax_rect(1))/ax_rect(3);
- pt(2) = (pt(2) - ax_rect(2))/ax_rect(4);
- if nargin < 2
- pt(1) = ax_lim(1) + pt(1) * d_w;
- pt(2) = ax_lim(3) + pt(2) * d_h;
- if ~xlin, pt(1) = exp(pt(1)); end
- if ~ylin, pt(2) = exp(pt(2)); end
- end
- button = abs(char);
- else
- pt = get(handle, 'CurrentPoint');
- button = get(fig, 'SelectionType');
- if strcmp(button,'open')
- button = b(max(size(b)));
- elseif strcmp(button,'normal')
- button = 1;
- elseif strcmp(button,'alt')
- button = 2;
- elseif strcmp(button,'extend')
- button = 3;
- else
- error('Invalid mouse selection.')
- end
- end
-
- how_many = how_many - 1;
-
- if(char == 13 & how_many ~= 0)
- % if the return key was pressed, char will == 13,
- % and that's our signal to break out of here whether
- % or not we have collected all the requested data
- % points.
- % If this was an early breakout, don't include
- % the <Return> key info in the return arrays.
- % If this was the last expected event, then do
- % include the <Return> key info. This is
- % exactly how 3.5 does it, and therefore its
- % how 4.0 is going to do it...
- break;
- end
-
- out1 = [out1;pt(1,1)];
- y = [y;pt(1,2)];
- b = [b;button];
- end
- end
-
- if nargout > 1
- out2 = y;
- if nargout > 2
- out3 = b;
- end
- else
- out1 = [out1 y];
- end
- set(fig,'pointer',pointer,'units',fig_units);
- set(ax,'units',axu)
- end
-