## Copyright (C) 2011 rolf.becker ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with Octave; see the file COPYING. If not, see ## . ## arrow ## Author: rolf.becker ## Created: 2011-04-04 function [ ret ] = arrow (p1,p2,scal,sty,lw) % usage: arrow (p1,p2,s, style) % plots 2D vector arrow from p1 to p2 (arrow head) % s: scale factor for arrow tipp hands in units, e.g. s=1 % style: 0: open arrow head, 1: closed arrow head, 2: filled if size(p1)(1)==1; p1=p1'; endif; if size(p2)(1)==1; p2=p2'; endif; phi = pi/4; % angle of arrow %s=0.1; % scale factor dp=p2-p1; l=norm(dp); if l!=0 L=[ cos(phi/2) -sin(phi/2) ; sin(phi/2) cos(phi/2)]; % turn left R=[ cos(-phi/2) -sin(-phi/2) ; sin(-phi/2) cos(-phi/2)]; % turn right dr=R*dp/l*scal; % turn unit vector of dp left and scale with s dl=L*dp/l*scal; % turn unit vector of dp left and scale with s myhold = ishold; plot([p1(1) p2(1)],[p1(2) p2(2)],"linewidth",lw); % plot line between p1 and p2 hold on; if ((sty == 0) | (sty == 1)) plot([p2(1)-dl(1) p2(1)],[p2(2)-dl(2) p2(2)],"linewidth",lw); % plot arrow line between p2 and p2 - dl plot([p2(1)-dr(1) p2(1)],[p2(2)-dr(2) p2(2)],"linewidth",lw); % plot arrow line between p2 and p2 - dr endif if (sty == 1) % close arrow head plot([p2(1)-dr(1) p2(1)-dl(1)],[p2(2)-dr(2) p2(2)-dl(2)],"linewidth",lw); elseif (sty == 2) % fill arrow head A=[p2 p2-dl p2-dr]; patch(A(1,:),A(2,:),'b',"linewidth",lw); endif if myhold == 0; hold off; endif endif endfunction