arrow
arrow is a plot function for drawing arrows. Input is either in vector components or angular.
function arrow(varargin) % function arrow(x0, y0, r, angle, arrowheadsize, arrowheadangle, colorvec, linestyle, linewidth) % function arrow(x_comp, y_comp, arrowheadsize, arrowheadangle, colorvec, linestyle, linewidth) % % x_comp and y_comp must contain two values. % Trailing plotting parameters may be ommitted. Any plotting parameter can be specified as [] for defaults. axes0 = gca; if length(varargin{1}) == 1, x0 = varargin{1}; y0 = varargin{2}; r = varargin{3}; angle = varargin{4}; x_comp = [x0 x0 + r * cos(angle)]; y_comp = [x0 x0 + r * sin(angle)]; plotParIndex = 5; else, x_comp = varargin{1}; y_comp = varargin{2}; r = sqrt(diff(x_comp) .^ 2 + diff(y_comp) .^ 2); angle = atan2(diff(y_comp), diff(x_comp)); plotParIndex = 3; end; if length(varargin) >= plotParIndex, headSize = varargin{plotParIndex} * r; if isempty(headSize ), headSize = 0.1 * r; end; else, headSize = 0.1 * r; end; if length(varargin) >= plotParIndex + 1, headAngle = varargin{plotParIndex + 1}; if isempty(headAngle), headAngle = pi / 8; end; else, headAngle = pi / 8; end; if length(varargin) >= plotParIndex + 2, color = varargin{plotParIndex + 2}; if isempty(color), color = [0 0 0]; end; else, color = [0 0 0]; end; if length(varargin) >= plotParIndex + 3, linestyle = varargin{plotParIndex + 3}; if isempty(linestyle), linestyle = '-'; end; else, linestyle = '-'; end; if length(varargin) >= plotParIndex + 4, linewidth = varargin{plotParIndex + 4}; if isempty(linewidth), linewidth = 0.1; end; else, linewidth = 0.1; end; holding = get(axes0, 'NextPlot'); if strcmp(holding, 'replace') == 1, cla; end; %set(axes0, 'NextPlot', 'add'); % The main line drawLine(x_comp, y_comp, color, linestyle, linewidth); % The head: draw on origin on a lying arrow, then rotate and translate. headPoint = getHeadPoint(angle, headSize, headAngle, x_comp, y_comp); drawLine([x_comp(2) headPoint(1)], [y_comp(2) headPoint(2)], color, linestyle, linewidth); headPoint = getHeadPoint(angle, headSize, -headAngle, x_comp, y_comp); drawLine([x_comp(2) headPoint(1)], [y_comp(2) headPoint(2)], color, linestyle, linewidth); % whitespace if necessary xlim1 = [min(x_comp - headSize) max(x_comp + headSize)]; ylim1 = [min(y_comp - headSize) max(y_comp + headSize)]; xlim0 = get(gca, 'XLim'); ylim0 = get(gca, 'YLim'); xlim2 = [min([xlim0(1); xlim1(1)]) max([xlim0(2); xlim1(2)])]; ylim2 = [min([ylim0(1); ylim1(1)]) max([ylim0(2); ylim1(2)])]; set(gca, 'XLim', xlim2); set(gca, 'YLim', ylim2); %set(axes0, 'NextPlot', holding); function line0 = drawLine(x_comp, y_comp, color, linestyle, linewidth); line0 = line(x_comp, y_comp); set(line0, 'Color', color); set(line0, 'LineStyle', linestyle); set(line0, 'LineWidth', linewidth); function headPoint = getHeadPoint(angle, headSize, headAngle, x_comp, y_comp) headPoint = headSize * [-cos(headAngle); sin(headAngle)]; rotation_matrix = [cos(angle) -sin(angle); sin(angle) cos(angle)]; headPoint = rotation_matrix * headPoint + [x_comp(2); y_comp(2)];