]> Creatis software - CreaPhase.git/blob - octave_packages/geometry-1.5.0/geom2d/drawArrow.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / geometry-1.5.0 / geom2d / drawArrow.m
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>
4 %%
5 %% All rights reserved.
6 %% (simplified BSD License)
7 %%
8 %% Redistribution and use in source and binary forms, with or without
9 %% modification, are permitted provided that the following conditions are met:
10 %%
11 %% 1. Redistributions of source code must retain the above copyright notice, this
12 %%    list of conditions and the following disclaimer.
13 %%     
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.
17 %%
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.
29 %%
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.
33
34 %% -*- texinfo -*-
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.
40 %%   
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.
44 %%
45 %%   Also specify arrow type. @var{TYPE} can be one of the following :
46 %%   0: draw only two strokes
47 %%   1: fill a triangle
48 %%   .5: draw a half arrow (try it to see ...)
49 %%   
50 %%   Arguments can be single values or array of size [N*1]. In this case,
51 %%   the function draws multiple arrows.
52 %%
53 %% @end deftypefn
54
55 function varargout = drawArrow(varargin)
56
57   if isempty(varargin)
58       error('should specify at least one argument');
59   end
60
61   % parse arrow coordinate
62   var = varargin{1};
63   if size(var, 2)==4
64        @var{x1} = var(:,1);
65        @var{y1} = var(:,2);
66       x2 = var(:,3);
67       y2 = var(:,4);
68       varargin = varargin(2:end);
69   elseif length(varargin)>3
70        @var{x1} = varargin{1};
71        @var{y1} = varargin{2};
72       x2 = varargin{3};
73       y2 = varargin{4};
74       varargin = varargin(5:end);
75   else
76       error('wrong number of arguments, please read the doc');
77   end
78
79   l = 10*size(size( @var{x1}));
80   w = 5*ones(size( @var{x1}));
81   h = zeros(size( @var{x1}));
82
83   % exctract length of arrow
84   if ~isempty(varargin)
85       l = varargin{1};
86       if length( @var{x1})>length(l)
87           l = l(1)*ones(size( @var{x1}));
88       end
89   end
90
91   % extract width of arrow
92   if length(varargin)>1
93       w = varargin{2};
94       if length( @var{x1})>length(w)
95           w = w(1)*ones(size( @var{x1}));
96       end
97   end
98
99   % extract 'ratio' of arrow
100   if length(varargin)>2
101       h = varargin{3};
102       if length( @var{x1})>length(h)
103           h = h(1)*ones(size( @var{x1}));
104       end
105   end
106
107   hold on;
108   axis equal;
109
110   % angle of the edge
111   theta = atan2(y2- @var{y1}, x2- @var{x1});
112
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;
122
123   % draw main edge
124   line([ @var{x1}'; x2'], [ @var{y1}'; y2'], 'color', [0 0 1]);
125
126   % draw only 2 wings
127   ind = find(h==0);
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]);
130
131   % draw a full arrow
132   ind = find(h~=0);
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]);
135      
136
137   if nargout>0
138       varargout{1}=h;
139   end
140
141 endfunction
142