Mercurial > hg > octave-lyh
comparison scripts/plot/compass.m @ 17453:2fee3022ac2f
compass.m: Overhaul function.
* scripts/plot/compass.m: Reduce arrowhead to 20% of body length.
Recode input validation to be simpler.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 19 Sep 2013 13:48:54 -0700 |
parents | 68bcac3c043a |
children | 997b700b6ad4 |
comparison
equal
deleted
inserted
replaced
17452:ffa7f1caab4e | 17453:2fee3022ac2f |
---|---|
44 ## a = toeplitz ([1;randn(9,1)], [1,randn(1,9)]); | 44 ## a = toeplitz ([1;randn(9,1)], [1,randn(1,9)]); |
45 ## compass (eig (a)); | 45 ## compass (eig (a)); |
46 ## @end group | 46 ## @end group |
47 ## @end example | 47 ## @end example |
48 ## | 48 ## |
49 ## @seealso{polar, quiver, feather, plot} | 49 ## @seealso{polar, feather, quiver, rose, plot} |
50 ## @end deftypefn | 50 ## @end deftypefn |
51 | 51 |
52 function h = compass (varargin) | 52 function h = compass (varargin) |
53 | 53 |
54 [hax, varargin, nargin] = __plt_get_axis_arg__ ("compass", varargin{:}); | 54 [hax, varargin, nargin] = __plt_get_axis_arg__ ("compass", varargin{:}); |
55 | 55 |
56 if (nargin == 0) | 56 if (nargin == 0 || nargin > 3) |
57 print_usage (); | 57 print_usage (); |
58 elseif (nargin == 1 || (nargin == 2 && ! isnumeric (varargin{2}))) | 58 endif |
59 ioff = 2; | 59 |
60 if (nargin == 1 || (nargin == 2 && ! isnumeric (varargin{2}))) | |
60 z = varargin{1}(:).'; | 61 z = varargin{1}(:).'; |
61 u = real (z); | 62 u = real (z); |
62 v = imag (z); | 63 v = imag (z); |
63 elseif (nargin > 1 && isnumeric (varargin{2})) | 64 have_line_spec = (nargin == 2); |
64 ioff = 3; | 65 elseif (nargin >= 2 && isnumeric (varargin{2})) |
65 u = varargin{1}(:).'; | 66 u = varargin{1}(:).'; |
66 v = varargin{2}(:).'; | 67 v = varargin{2}(:).'; |
68 have_line_spec = (nargin == 3); | |
69 else | |
70 print_usage (); | |
67 endif | 71 endif |
68 | 72 |
69 arrowsize = 0.25; | 73 arrowsize = 0.20; |
70 line_spec = "b-"; | 74 line_spec = "-b"; |
71 have_line_spec = false; | 75 |
72 while (ioff <= nargin) | 76 if (have_line_spec) |
73 arg = varargin{ioff++}; | 77 arg = varargin{end}; |
74 if ((ischar (arg) || iscell (arg)) && ! have_line_spec) | 78 if (ischar (arg) || iscellstr (arg)) |
75 [linespec, valid] = __pltopt__ ("compass", arg, false); | 79 [~, valid] = __pltopt__ ("compass", arg, false); |
76 if (valid) | 80 if (valid) |
77 line_spec = arg; | 81 line_spec = arg; |
78 have_line_spec = true; | |
79 break; | |
80 else | 82 else |
81 error ("compass: invalid linespec"); | 83 error ("compass: invalid linestyle STYLE"); |
82 endif | 84 endif |
83 else | 85 else |
84 error ("compass: unrecognized argument"); | 86 error ("compass: invalid linestyle STYLE"); |
85 endif | 87 endif |
86 endwhile | 88 endif |
87 | 89 |
88 ## Matlab draws compass plots, with the arrow head as one continous | 90 ## Matlab draws compass plots with the arrow head as one continous line, |
89 ## line, and each arrow separately. This is completely different than | 91 ## and each arrow separately. This is completely different than quiver |
90 ## quiver and quite ugly. | 92 ## and quite ugly. |
91 n = length (u); | 93 n = length (u); |
92 xend = u; | 94 xend = u; |
93 xtmp = u .* (1 - arrowsize); | 95 xtmp = u .* (1 - arrowsize); |
94 yend = v; | 96 yend = v; |
95 ytmp = v .* (1 - arrowsize); | 97 ytmp = v .* (1 - arrowsize); |
96 x = [zeros(1, n); xend; xtmp - v * arrowsize / 3; xend; ... | 98 x = [zeros(1, n); xend; xtmp - v * arrowsize / 3; xend; ... |
97 xtmp + v * arrowsize / 3]; | 99 xtmp + v * arrowsize / 3]; |
98 y = [zeros(1, n); yend; ytmp + u * arrowsize / 3; yend; ... | 100 y = [zeros(1, n); yend; ytmp + u * arrowsize / 3; yend; ... |
99 ytmp - u * arrowsize / 3]; | 101 ytmp - u * arrowsize / 3]; |
100 [r, p] = cart2pol (x, y); | 102 [r, p] = cart2pol (x, y); |
101 | 103 |
102 oldfig = []; | 104 oldfig = []; |
103 if (! isempty (hax)) | 105 if (! isempty (hax)) |