function output = ge_quiver(X,Y,DX,DY,varargin) % Reference page in help browser: % % link to html documentation % show license statement % AuthorizedOptions = authoptions( mfilename ); % id = 'quiver'; idTag = 'id'; name = 'ge_quiver'; description = ''; timeStamp = ' '; timeSpanStart = ' '; timeSpanStop = ' '; visibility = 1; extrude = 0; lineColor = 'ffffffff'; lineWidth = 0.0; snippet = ' '; altitude = 1.0; altitudeMode = 'relativeToGround'; msgToScreen = false; region = ' '; if( isempty( X ) || isempty( Y ) || isempty( DX ) || isempty( DY ) ) error('empty coordinates passed to ge_quiver(...).'); end magnitudeMax = det_smallest_interval(X,Y) if (max(size(X)) >= 2) && (max(size(Y)) >= 2) step_size_x = abs( X(1,1) - X(1,2) ); step_size_y = abs( Y(1,1) - Y(2,1) ); magnitudeMax = max( [ max(max(X)) max(max(Y)) ] ); magnitudeScale = min( [step_size_x step_size_y] ); elseif max(size( X )) >= 2 step_size_x = abs( X(1,1) - X(1,2) ); magnitudeMax = max( [ max(max(X)) max(Y) ] ); magnitudeScale = step_size_x; elseif max(size( Y )) >= 2 step_size_y = abs( Y(1,1) - Y(2,1) ); magnitudeMax = max( [ max(max(Y)) max(X) ] ); magnitudeScale = step_size_y; else magnitudeMax = max(max(X)); magnitudeScale = 1.0; end parsepairs %script that parses Parameter/Value pairs. if msgToScreen disp(['Running: ',mfilename,'...']) end if ~(isequal(altitudeMode,'clampToGround')||... isequal(altitudeMode,'relativeToGround')||... isequal(altitudeMode,'absolute')) error(['Variable ',39,'altitudeMode',39, ' should be one of ' ,39,'clampToGround',39,', ',10,39,'relativeToGround',39,', or ',39,'absolute',39,'.' ]) end if region == ' ' region_chars = ''; else region_chars = [ region, 10 ]; end % id_chars = [ idTag '="' id '"' ]; name_chars = [ '',10, name,10, '',10 ]; description_chars = [ '',10,'',10,'',10 ]; visibility_chars = [ '',10, int2str(visibility),10, '',10 ]; lineColor_chars = [ '',10, lineColor([1,2,7,8,5,6,3,4]) ,10,'',10 ]; lineWidth_chars= [ '',10, num2str(lineWidth, '%.2f'),10, '',10 ]; altitudeMode_chars = [ '',10, altitudeMode,10, '',10 ]; extrude_chars = [ '' int2str(extrude) '',10 ]; if snippet == ' ' snippet_chars = ''; else snippet_chars = [ '' snippet '',10 ]; end if timeStamp == ' ' timeStamp_chars = ''; else timeStamp_chars = [ '' timeStamp '',10 ]; end if timeSpanStart == ' ' timeSpan_chars = ''; else if timeSpanStop == ' ' timeSpan_chars = [ '' timeSpanStart '',10 ]; else timeSpan_chars = [ '' timeSpanStart '' timeSpanStop '',10 ]; end end [row_count, col_count] = size(X); %output = ''; output = cell((row_count * col_count), 1); ctr = 1; for row = 1:row_count for col = 1:col_count if (DX(row,col) == 0) && (DY(row,col) == 0) direction = 0; elseif DX(row,col) == 0 if DY(row,col) > 0 direction = 0; else direction = 180; end elseif DY(row,col) == 0 if DX(row,col) > 0 direction = 90; else direction = 270; end else direction = rad2deg( atan2( DX(row,col) , DY(row,col) ) ); end magnitude = sqrt( DX(row,col) .^ 2 + DY(row,col) .^ 2 ); part1 = [' ',... '',int2str(row),' ',int2str(col),'',... '',... name_chars,... timeStamp_chars,... timeSpan_chars,... snippet_chars,... description_chars,... region_chars,... '',... visibility_chars,... '',... extrude_chars,... altitudeMode_chars,... '1',... '']; %continued ugliness alpharad = deg2rad( [direction, (direction + 12), (direction - 12)] ); %[rad] scaleFactor = ( magnitude / magnitudeMax ) * magnitudeScale; divPer= [scaleFactor, (3*scaleFactor/4), (3*scaleFactor/4) ]'; %how to do this step once in parrallel? % x = sin( alpharad ) * divPer; % y = cos( alpharad ) * divPer; x(1) = sin( alpharad(1) ) * divPer(1); y(1) = cos( alpharad(1) ) * divPer(1); x(2) = sin( alpharad(2) ) * divPer(2); y(2) = cos( alpharad(2) ) * divPer(2); x(3) = sin( alpharad(3) ) * divPer(3); y(3) = cos( alpharad(3) ) * divPer(3); % bug fixes & addtions from Brett Grant % % % %added for aspect ratio x = x/(cos(Y(row, col)*(pi/180))); % % % modified output accuracy arrow_coords = [ num2str(X(row, col),'%11.7f'),',',num2str(Y(row, col),'%11.7f'),',',num2str(altitude),' ',... num2str(X(row, col)+x(1),'%11.7f'),',',num2str(Y(row, col)+y(1),'%11.7f'),',',num2str(altitude),' ',... num2str(X(row, col)+x(2),'%11.7f'),',',num2str(Y(row, col)+y(2),'%11.7f'),',',num2str(altitude),' ',... num2str(X(row, col)+x(3),'%11.7f'),',',num2str(Y(row, col)+y(3),'%11.7f'),',',num2str(altitude),' ',... num2str(X(row, col)+x(1),'%11.7f'),',',num2str(Y(row, col)+y(1),'%11.7f'),',',num2str(altitude),' ']; lolo = strfind(arrow_coords,'NaN'); if lolo arrow_coords = [ num2str(X(row, col),'%11.7f'),',',num2str(Y(row, col),'%11.7f'),',',num2str(altitude),' ',... num2str(X(row, col),'%11.7f'),',',num2str(Y(row, col),'%11.7f'),',',num2str(altitude),' ',... num2str(X(row, col),'%11.7f'),',',num2str(Y(row, col),'%11.7f'),',',num2str(altitude),' ',... num2str(X(row, col),'%11.7f'),',',num2str(Y(row, col),'%11.7f'),',',num2str(altitude),' ',... num2str(X(row, col),'%11.7f'),',',num2str(Y(row, col),'%11.7f'),',',num2str(altitude),' ']; end clear lolo % % % end added section part2 = [ '',... '',... '',... '']; chunk = strcat(part1, arrow_coords, part2); output{ctr} = chunk; ctr = ctr + 1; end end output = char(output); [sx, sy] = size(output); %foutput = char(zeros(1,sx*sy)); foutput = repmat(' ',[1,sx*sy]); offset = 1; for i = 1:sx trimmed = strtrim(output(i,:)); end_offset = length(trimmed) + (offset) - 1; foutput(offset:end_offset) = trimmed; offset = end_offset + 1; end output = foutput; if msgToScreen disp(['Running: ',mfilename,'...Done']) end function dOut = det_smallest_interval(X,Y) dLowest=Inf; for k=1:numel(X) for m=k+1:numel(X) dSquared = (X(k)-X(m))^2+(Y(k)-Y(m))^2 if dSquared