⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crosshair.m

📁 天线设计方面的资料
💻 M
📖 第 1 页 / 共 2 页
字号:
    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 + -