1 %% Copyright (c) 2011, INRA
2 %% 2004-2011, David Legland <david.legland@grignon.inra.fr>
3 %% 2011 Adapted to Octave by Juan Pablo Carbajal <carbajal@ifi.uzh.ch>
5 %% All rights reserved.
6 %% (simplified BSD License)
8 %% Redistribution and use in source and binary forms, with or without
9 %% modification, are permitted provided that the following conditions are met:
11 %% 1. Redistributions of source code must retain the above copyright notice, this
12 %% list of conditions and the following disclaimer.
14 %% 2. Redistributions in binary form must reproduce the above copyright notice,
15 %% this list of conditions and the following disclaimer in the documentation
16 %% and/or other materials provided with the distribution.
18 %% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 %% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 %% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 %% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 %% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 %% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 %% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 %% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 %% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 %% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 %% POSSIBILITY OF SUCH DAMAGE.
30 %% The views and conclusions contained in the software and documentation are
31 %% those of the authors and should not be interpreted as representing official
32 %% policies, either expressed or implied, of copyright holder.
35 %% @deftypefn {Function File} {@var{h} = } drawArrow (@var{x1}, @var{y1}, @var{x2}, @var{y2})
36 %% @deftypefnx {Function File} {@var{h} = } drawArrow ([@var{ @var{x1}} @var{ @var{y1}} @var{x2} @var{y2}])
37 %% @deftypefnx {Function File} {@var{h} = } drawArrow (@dots{}, @var{L}, @var{W})
38 %% @deftypefnx {Function File} {@var{h} = } drawArrow (@dots{}, @var{L}, @var{W},@var{TYPE})
39 %% Draw an arrow on the current axis.
41 %% draw an arrow between the points (@var{x1} @var{y1}) and (@var{x2} @var{y2}).
42 %% The points can be given as a single array. @var{L}, @var{W} specify length
43 %% and width of the arrow.
45 %% Also specify arrow type. @var{TYPE} can be one of the following :
46 %% 0: draw only two strokes
48 %% .5: draw a half arrow (try it to see ...)
50 %% Arguments can be single values or array of size [N*1]. In this case,
51 %% the function draws multiple arrows.
55 function varargout = drawArrow(varargin)
58 error('should specify at least one argument');
61 % parse arrow coordinate
68 varargin = varargin(2:end);
69 elseif length(varargin)>3
70 @var{x1} = varargin{1};
71 @var{y1} = varargin{2};
74 varargin = varargin(5:end);
76 error('wrong number of arguments, please read the doc');
79 l = 10*size(size( @var{x1}));
80 w = 5*ones(size( @var{x1}));
81 h = zeros(size( @var{x1}));
83 % exctract length of arrow
86 if length( @var{x1})>length(l)
87 l = l(1)*ones(size( @var{x1}));
91 % extract width of arrow
94 if length( @var{x1})>length(w)
95 w = w(1)*ones(size( @var{x1}));
99 % extract 'ratio' of arrow
100 if length(varargin)>2
102 if length( @var{x1})>length(h)
103 h = h(1)*ones(size( @var{x1}));
111 theta = atan2(y2- @var{y1}, x2- @var{x1});
113 % point on the 'left'
114 xa1 = x2 - l.*cos(theta) - w.*sin(theta)/2;
115 ya1 = y2 - l.*sin(theta) + w.*cos(theta)/2;
116 % point on the 'right'
117 xa2 = x2 - l.*cos(theta) + w.*sin(theta)/2;
118 ya2 = y2 - l.*sin(theta) - w.*cos(theta)/2;
119 % point on the middle of the arrow
120 xa3 = x2 - l.*cos(theta).*h;
121 ya3 = y2 - l.*sin(theta).*h;
124 line([ @var{x1}'; x2'], [ @var{y1}'; y2'], 'color', [0 0 1]);
128 line([xa1(ind)'; x2(ind)'], [ya1(ind)'; y2(ind)'], 'color', [0 0 1]);
129 line([xa2(ind)'; x2(ind)'], [ya2(ind)'; y2(ind)'], 'color', [0 0 1]);
133 patch([x2(ind) xa1(ind) xa3(ind) xa2(ind) x2(ind)]', ...
134 [y2(ind) ya1(ind) ya3(ind) ya2(ind) y2(ind)]', [0 0 1]);