📄 crosshair.m
字号:
else
H.data.yindex = get(AHandle.TraceSwitch,'Value');
end
CurrentPoint = get(H.axis,'Currentpoint');
H.data.xpoint = CurrentPoint(1,1);
H.data.ypoint = CurrentPoint(1,2);
H = interpY(H);
H = updateGUI(H);
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ H ] = updateGUI( H )
% Create the crosshair lines on the figure, crossing at the x,y point
% x_rng = get(H.axis,'Xlim');
% y_rng = get(H.axis,'Ylim');
x_rng = H.data.x_rng;
y_rng = H.data.y_rng;
set(H.data.xline,'Xdata',[H.data.xpoint H.data.xpoint],'Ydata',y_rng);
set(H.data.yline,'Ydata',[H.data.ypoint H.data.ypoint],'Xdata',x_rng);
set(gca,'userdata',H.data);
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ H ] = interpY( H )
% In this function, xdata & ydata are arrays, not matrices
xdata = H.data.xdata(:,H.data.yindex);
ydata = H.data.ydata(:,H.data.yindex);
if H.data.xpoint >= max(xdata)
H.data.xpoint = max(xdata);
H.data.xindex = find(xdata == max(xdata));
H.data.ypoint = ydata(H.data.xindex);
return;
elseif H.data.xpoint <= min(xdata)
H.data.xpoint = min(xdata);
H.data.xindex = find(xdata == min(xdata));
H.data.ypoint = ydata(H.data.xindex);
return;
end
% 'none|nearest|linear|spline|cubic'
AHandle = guidata(H.data.gui);
interp = get(AHandle.InterpSelect,'Value');
switch interp
case 1
% Given that xdata & ydata are the same length arrays,
% we can find the ypoint given the nearest xpoint.
[H.data.xindex, H.data.xpoint] = NearestXYArrayPoint( xdata, H.data.xpoint );
H.data.ypoint = ydata(H.data.xindex);
case 2
H.data.ypoint = interp1( xdata, ydata, H.data.xpoint, 'nearest' );
case 3
H.data.ypoint = interp1( xdata, ydata, H.data.xpoint, 'linear' );
case 4
H.data.ypoint = interp1( xdata, ydata, H.data.xpoint, 'spline' );
case 5
H.data.ypoint = interp1( xdata, ydata, H.data.xpoint, 'cubic' );
otherwise
%use default (linear in matlabR12)
H.data.ypoint = interp1( xdata, ydata, H.data.xpoint );
end
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ Yall ] = interpYall( H )
xdata = H.data.xdata(:,H.data.yindex);
Yall = H.data.ydata;
if H.data.xpoint >= max(xdata),
H.data.xpoint = max(xdata);
H.data.xindex = find(xdata == max(xdata));
Yall = ydata(:,H.data.xindex);
return;
elseif H.data.xpoint <= min(xdata),
H.data.xpoint = min(xdata);
H.data.xindex = find(xdata == min(xdata));
Yall = ydata(:,H.data.xindex);
return;
end
% 'none|nearest|linear|spline|cubic'
interp = get(H.interp,'Value');
switch interp,
case 1
% do nothing in this case
case 2
Yall = interp1( xdata, Yall, H.data.xpoint, 'nearest' );
case 3
Yall = interp1( xdata, Yall, H.data.xpoint, 'linear' );
case 4
Yall = interp1( xdata, Yall, H.data.xpoint, 'spline' );
case 5
Yall = interp1( xdata, Yall, H.data.xpoint, 'cubic' );
otherwise
%use default (linear in matlabR12)
Yall = interp1( xdata, Yall, H.data.xpoint );
end
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ index, point ] = NearestXYArrayPoint( data_array, point, type )
if ~exist('type','var') type = ''; end
% In this function, input data_array is an array, not a matrix.
% This function returns the data point in the array
% that has the closest value to the value given (point). In
% the context of 'crosshair' the point is a mouse position.
if point >= max(data_array)
point = max(data_array);
temp = find(data_array == point);
index = temp(1);
return;
elseif point <= min(data_array)
point = min(data_array);
temp = find(data_array == point);
index = temp(1);
return;
end
data_sorted = sort(data_array);
greater = find(data_sorted > point);
greater_index = greater(1);
lesser = find(data_sorted <= point);
lesser_index = lesser(length(lesser));
greater_dif = data_sorted(greater_index) - point;
lesser_dif = point - data_sorted(lesser_index);
if strcmp(type,'nextx'),
index = greater_index;
elseif strcmp(type,'prevx'),
index = lesser_index;
else
if (greater_dif < lesser_dif)
index = find(data_array == data_sorted(greater_index));
else
index = find(data_array == data_sorted(lesser_index));
end
end
point = data_array(index);
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ xpoint, xindex, ypoint, yindex ] = NearestXYMatrixPoint( Xdata, Ydata, xpoint, ypoint )
% In this function, Xdata & Ydata are matrices of the same dimensions.
% This function attempts to find the nearest values in Xdata & Ydata
% to the mouse position (xpoint, ypoint).
% It is assumed that Xdata has identical columns, so we only really
% need the first column to find the nearest value to xpoint.
% ^^^^^^^^^^^^^^^Might have to change this assumption^^^^^^^^^^^^^^^^^^%
% xi = zeros(size(Xdata,2),1);
% xp = zeros(size(Xdata,2),1);
%
% for i=1:size(Xdata,2)
% [ xi(i), xp(i) ] = NearestXYArrayPoint( Xdata(:,i), xpoint );
% end
% k = 1;
% i = 2;
% while i<=size(Xdata,2)
% if abs( xpoint - xp(i) ) < abs(xpoint - xp(k))
% k = i;
% end
% i = i+1;
% end
% xindex = xi(k);
% xpoint = xp(k);
%
% % Now, given the xpoint, we can select just that row of the
% % Ydata matrix corresponding to the xpoint.
% ydata = Ydata(xindex,:);
% if (sum(Xdata,2)./sum(Xdata(:,1))) == 1
%
% % The ydata array is searched in same manner as the xdata
% % array for the nearest value.
% [ yindex, ypoint ] = NearestXYArrayPoint( ydata, ypoint );
%
% else
% yindex = k;
% ypoint = ydata(k);
% end
yindex = find(min( (Ydata - ypoint).^2 + (Xdata - xpoint).^2)...
== min(min((Ydata - ypoint).^2 + (Xdata - xpoint).^2)));
yindex = yindex(1);
ydata = Ydata(:,yindex);
xdata = Xdata(:,yindex);
xindex = find(min(min( (ydata - ypoint).^2 + (xdata - xpoint).^2))...
== ((ydata - ypoint).^2 + (xdata - xpoint).^2));
xindex = xindex(1);
xpoint = xdata(xindex);
ypoint = ydata(yindex);
return
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ data ] = get_data,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Get Line Data from Current Axes
if gca,
% see if we have stored any data in userdata already
data = get(gca,'userdata');
if isfield(data,'lineobj'),
if data.lineobj,
return;
end
end
data.ylim = get(gca,'ylim');
% Get all the line objects from the current axis
data.lineobj = findobj(gca,'Type','line');
if data.lineobj,
data.lines = length(data.lineobj);
data.xdata = [];
data.ydata = [];
data.xpoint = [];
data.ypoint = [];
data.xindex = 1;
data.yindex = 1;
for i = data.lines:-1:1,
% put line data into a columns of data
data.xdata(:,i) = get(data.lineobj(i),'XData').';
data.ydata(:,i) = get(data.lineobj(i),'YData').';
end
% Set X,Y cross hair lines
% Do this after finding all the line axis children
% to avoid confusing these lines with those of the
% plot itself (counted above).
x_rng = get(gca,'Xlim');
y_rng = get(gca,'Ylim');
data.xline = line(x_rng,[y_rng(1) y_rng(1)]);
data.yline = line(x_rng,[y_rng(1) y_rng(1)]);
data.x_rng = x_rng;
data.y_rng = y_rng;
set(data.xline,'Color','r','EraseMode','xor','tag','XHR_XLINE');
set(data.yline,'Color','r','EraseMode','xor','tag','XHR_YLINE');
data.gui = gcf;
set(gca,'userdata',data);
else
fprintf('No lines in current axes\n');
end
end
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -