comparison scripts/plot/compass.m @ 17445: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
17444:ffa7f1caab4e 17445: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))