%
% function arrow6(start, stop, scale, linewid, beta, fillah)
%
% Draw a 2-d dashed line (vector) with an arrowhead at the tip.
% Seems to work in Matlab4 and Matlab5.
% Modified to do red lines.
%
% start is the x,y point where the arrow starts.
% stop is the x,y point where the arrow stops.
% scale sets the size of the arrowheads. Units are non-d (ie, 0 to 1)
% and a reasonable first guess is 0.03. Optional.
% linewid is the width of the shaft and arrowhead in pixels units.
% A reasonable first guess would be 1.6. Optional, but you must
% input scale if you want to use this.
% beta is the angle in radians setting the sharpness of the arrowhead.
% A reasonable choice is pi/6. Optional, but input scale and linewid
% if you want to use this.
% fillah is a flag to be set = 1 if you want to fill in the arrowheads
% and as before you have to put in the other optional things first.
% Optional.
%
% It is assumed that the axis limits are set before coming here.
%
%
% By Jim Price, June 1997. Started with and remains about 60% from
% the routine arrow4 of the contributed Matlab routines. This code
% provided most of the calculations. JP made several fixes and quite a
% few additions, and checked that this works in Matlab5. This is
% written in very simple code and should be easy to modify for
% other purposes.
%
%
function arrow6(start, stop, scale, linewid, beta, fillah)
% Get the axis ranges set before coming to this routine.
xl = get(gca, 'xlim');
yl = get(gca, 'ylim');
xd = xl(2) - xl(1);
yd = yl(2) - yl(1);
% Set the scale for the arrow size so that arrow will
% appear in correct proportion in the current axis.
xdif = stop(1) - start(1);
ydif = stop(2) - start(2);
if nargin==2
scale = .03; % Set the default arrowhead size.
end
axis(axis)
if( (xdif == 0) & (ydif < 0) ) % In case xdif is zero.
theta = -pi/2;
elseif( (xdif == 0) & (ydif > 0) )
theta = pi/2;
else
theta = atan((ydif/yd)/(xdif/xd));
end
if(xdif >= 0)
scale = -scale;
end
% xd and yd are x and y expansion factors, respectively.
% Multiply x-component of arrowhead by xd and y-component by yd so
% that the arrowhead appears undistorted.
% The sharpness of the arrowhead is set by the angle beta (radians).
% beta = pi/6 is OK, so is pi/4.
betar = pi/6;
if nargin == 5
betar = beta;
end
xcoeff = scale*xd;
ycoeff = scale*yd;
xs = [start(1), stop(1)]; % Coordinates of the arrow shaft.
ys = [start(2), stop(2)];
xah = [stop(1), (stop(1)+xcoeff*cos(theta+betar)), NaN, stop(1),...
(stop(1)+xcoeff*cos(theta-betar))]'; % coord of the arrowhead
yah = [stop(2), (stop(2)+ycoeff*sin(theta+betar)), NaN, stop(2),...
(stop(2)+ycoeff*sin(theta-betar))]';
hold on
% Plot the shaft and the arrowhead. You could easily change the
% kind of line used for the shaft, if you needed to.
if nargin >= 4
hp = plot(xs, ys, 'LineWidth', linewid); % plot the shaft
hah = plot(xah, yah, 'LineWidth', linewid) % plot the arrowhead
else
hp = plot(xs, ys, 'LineWidth', 1.6);
hah = plot(xah, yah, 'LineWidth', 1.6);
end % if on whether to redefine linewidth
set(hp,'Color','g'); set(hah, 'Color', 'g')
% To fill in the arrowhead, continue through here.
if nargin == 6
if fillah == 1
xf = [xah(1) xah(2) xah(5) xah(1)];
yf = [yah(1) yah(2) yah(5) yah(1)];
% The next section makes slightly meaner looking arrowheads.
xmid = (xah(2) + xah(5))/2; ymid = (yah(2) + yah(5))/2;
xxmid = 0.6*xmid + 0.4*xah(1); yymid = 0.6*ymid + 0.4*yah(1);
xf = [xah(1) xah(2) xxmid xah(5) xah(1)];
yf = [yah(1) yah(2) yymid yah(5) yah(1)];
% Define the color of the arrowhead; use the color of the arrow.
col = get(hp,'Color');
fill(xf, yf, col);
end; end % ifs on whether to make filled arrowheads.
% The end of arrow6.