Skip to content
Snippets Groups Projects
quiver.m 3.04 KiB
Newer Older
function target = quiver(this,long,lat,u,v,varargin)
%KML.QUIVER(long,lat,u,v) Create a quiver plot, similar to built-in
%   function quiver3, using line arrows. 
%  
%   Copyright 2012 Rafael Fernandes de Oliveira (rafael@rafael.aero)
%   $Revision: 2.3 $  $Date: 2012/09/05 08:00:00 $

    target = struct('type','','id','','coordinates_type','','coordinates_id','');
    
    [longDEG,latDEG] = this.checkUnit(long,lat);
    
    p = inputParser;
    
    nlat = numel(lat);

    p.addRequired('lat',  @(a)isnumeric(a) && ~isempty(a));
    p.addRequired('long', @(a)isnumeric(a) && ~isempty(a) && numel(a)==nlat);
    p.addRequired('u',    @(a)isnumeric(a) && ~isempty(a) && numel(a)==nlat);
    p.addRequired('v',    @(a)isnumeric(a) && ~isempty(a) && numel(a)==nlat);

    p.addParamValue('altitude',1000,@(a)isnumeric(a) && numel(a)==1);
    p.addParamValue('scale',1,@(a)isnumeric(a) && numel(a)==1);
    p.addParamValue('arrowBaseSize',0.3,@(a)isnumeric(a) && numel(a)==1);
    p.addParamValue('plotArrows',true,@islogical);
    p.addParamValue('arrowHeadSize',0.3,@(a)isnumeric(a) && numel(a)==1);
    
    p.addParamValue('color','FFFFFFFF',@(a)ischar(a) && numel(a)==8);
    p.addParamValue('name','kml_quiver',@ischar);
    p.addParamValue('id',kml.getTempID('kml_quiver'),@ischar);
    p.addParamValue('description','',@ischar);
    p.addParamValue('visibility',true,@islogical);
    p.addParamValue('altitudeMode','relativeToGround',@(a)ismember(a,{'clampToGround','relativeToGround','absolute'}));

    p.addParamValue('timeStamp','',@ischar);
    p.addParamValue('timeSpanBegin','',@ischar);
    p.addParamValue('timeSpanEnd','',@ischar);    
    
    p.parse(lat,long,u,v,varargin{:});
    
    arg = p.Results;

    f = this.createFolder(arg.name);

    uv = sqrt((u+v).^2);
        
    edgelen = @(a)(max(a(:))-min(a(:))).^2;
    dS = edgelen(latDEG) + edgelen(longDEG);
    
    scale = sqrt((u.^2 + v.^2)./dS);
    scale = arg.scale .* scale;
    alpha = arg.arrowHeadSize;
    beta  = arg.arrowBaseSize;
    for i = 1:numel(lat)
        if arg.plotArrows
            long2 = scale(i).*[0 u(i) u(i)-alpha*(u(i)+beta*(v(i)+eps)) u(i) u(i)-alpha*(u(i)-beta*(v(i)+eps))] + long(i);
            lat2  = scale(i).*[0 v(i) v(i)-alpha*(v(i)-beta*(u(i)+eps)) v(i) v(i)-alpha*(v(i)+beta*(u(i)+eps))] + lat(i);
        else
            long2 = scale(i).*[0 u(i)] + long(i);
            lat2  = scale(i).*[0 v(i)] + lat(i);
        end
        target(i) = f.plot(long2,lat2, 'altitude',arg.altitude,...
                           'altitudeMode',arg.altitudeMode, ...
                           'visibility',arg.visibility, ...
                           'name',sprintf('Arrow %i',i), ...
                           'lineColor',arg.color, ...
                           'timeStamp', arg.timeStamp , ...
                           'timeSpanBegin', arg.timeSpanBegin , ...
                           'timeSpanEnd', arg.timeSpanEnd, ...                                                                  
                           'id', [arg.id '_' num2str(i)] ...
                           );
    end
end