7322
|
1 ## Copyright (C) 2007 David Bateman |
|
2 ## |
|
3 ## This file is part of Octave. |
|
4 ## |
|
5 ## Octave is free software; you can redistribute it and/or modify it |
|
6 ## under the terms of the GNU General Public License as published by |
|
7 ## the Free Software Foundation; either version 3 of the License, or (at |
|
8 ## your option) any later version. |
|
9 ## |
|
10 ## Octave is distributed in the hope that it will be useful, but |
|
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
13 ## General Public License for more details. |
|
14 ## |
|
15 ## You should have received a copy of the GNU General Public License |
|
16 ## along with Octave; see the file COPYING. If not, see |
|
17 ## <http://www.gnu.org/licenses/>. |
|
18 |
|
19 ## -*- texinfo -*- |
|
20 ## @deftypefn {Function File} {} feather (@var{u}, @var{v}) |
|
21 ## @deftypefnx {Function File} {} feather (@var{z}) |
|
22 ## @deftypefnx {Function File} {} feather (@dots{}, @var{style}) |
|
23 ## @deftypefnx {Function File} {} feather (@var{h}, @dots{}) |
|
24 ## @deftypefnx {Function File} {@var{h} =} feather (@dots{}) |
|
25 ## |
|
26 ## Plot the @code{(@var{u}, @var{v})} components of a vector field emanating |
|
27 ## from equidistant points on the x-axis. If a single complex argument |
|
28 ## @var{z} is given, then @code{@var{u} = real (@var{z})} and |
|
29 ## @code{@var{v} = imag (@var{z})}. |
|
30 ## |
|
31 ## The style to use for the plot can be defined with a line style @var{style} |
|
32 ## in a similar manner to the line styles used with the @code{plot} command. |
|
33 ## |
|
34 ## The optional return value @var{h} provides a list of handles to the |
|
35 ## the parts of the vector field (body, arrow and marker). |
|
36 ## |
|
37 ## @example |
|
38 ## @group |
|
39 ## phi = [0 : 15 : 360] * pi / 180; |
|
40 ## feather (sin (phi), cos (phi)) |
|
41 ## @end group |
|
42 ## @end example |
|
43 ## |
|
44 ## @seealso{plot, quiver, compass} |
|
45 ## @end deftypefn |
|
46 |
|
47 function retval = feather (varargin) |
|
48 |
|
49 [h, varargin, nargin] = __plt_get_axis_arg__ ("feather", varargin{:}); |
|
50 |
|
51 arrowsize = 0.25; |
|
52 firstnonnumeric = Inf; |
|
53 for i = 1:nargin |
|
54 if (! isnumeric (varargin{i})) |
|
55 firstnonnumeric = i; |
|
56 break; |
|
57 endif |
|
58 endfor |
|
59 |
|
60 if (nargin < 2 || firstnonnumeric < 2) |
|
61 ioff = 2; |
|
62 z = varargin {1} (:) .'; |
|
63 u = real (z); |
|
64 v = imag (z); |
|
65 else |
|
66 ioff = 3; |
|
67 u = varargin {1} (:) .'; |
|
68 v = varargin {2} (:) .'; |
|
69 endif |
|
70 |
|
71 line_spec = "b-"; |
|
72 while (ioff <= nargin) |
|
73 arg = varargin{ioff++}; |
|
74 if ((isstr (arg) || iscell (arg)) && ! have_line_spec) |
|
75 [linespec, valid] = __pltopt__ ("feather", arg, false); |
|
76 if (valid) |
|
77 line_spec = arg; |
|
78 break; |
|
79 else |
|
80 error ("feather: invalid linespec"); |
|
81 endif |
|
82 else |
|
83 error ("feather: unrecognized argument"); |
|
84 endif |
|
85 endwhile |
|
86 |
|
87 ## Matlab draws feather plots, with the arrow head as one continous |
|
88 ## line, and each arrow separately. This is completely different than |
|
89 ## quiver and quite ugly. |
|
90 n = length (u); |
|
91 xend = [1 : n] + u; |
|
92 xtmp = [1 : n] + u .* (1 - arrowsize); |
|
93 yend = v; |
|
94 ytmp = v .* (1 - arrowsize); |
|
95 x = [[1 : n]; xend; xtmp - v * arrowsize; xend; ... |
|
96 xtmp + v * arrowsize]; |
|
97 y = [zeros(1, n); yend; ytmp + u * arrowsize / 3; yend; ... |
|
98 ytmp - u * arrowsize / 3]; |
|
99 |
|
100 oldh = gca (); |
|
101 unwind_protect |
|
102 axes (h); |
|
103 newplot (); |
|
104 hlist = plot (h, x, y, line_spec, [1, n], [0, 0], line_spec); |
|
105 unwind_protect_cleanup |
|
106 axes (oldh); |
|
107 end_unwind_protect |
|
108 |
|
109 if (nargout > 0) |
|
110 retval = hlist; |
|
111 endif |
|
112 |
|
113 endfunction |
|
114 |
|
115 %!demo |
|
116 %! phi = [0 : 15 : 360] * pi / 180; |
|
117 %! feather (sin (phi), cos (phi)) |