Mercurial > hg > octave-nkf
diff scripts/plot/quiver3.m @ 7189:e8d953d03f6a
[project @ 2007-11-26 20:42:09 by dbateman]
author | dbateman |
---|---|
date | Mon, 26 Nov 2007 20:42:11 +0000 |
parents | |
children | a730e47fda4d |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/scripts/plot/quiver3.m @@ -0,0 +1,97 @@ +## Copyright (C) 2007 David Bateman +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} quiver3 (@var{u}, @var{v}, @var{w}) +## @deftypefnx {Function File} {} quiver3 (@var{x}, @var{y}, @var{z}, @var{u}, @var{v}, @var{w}) +## @deftypefnx {Function File} {} quiver3 (@dots{}, @var{s}) +## @deftypefnx {Function File} {} quiver3 (@dots{}, @var{style}) +## @deftypefnx {Function File} {} quiver3 (@dots{}, 'filled') +## @deftypefnx {Function File} {} quiver3 (@var{h}, @dots{}) +## @deftypefnx {Function File} {@var{h} =} quiver3 (@dots{}) +## +## Plot the @code{(@var{u}, @var{v}, @var{w})} components of a vector field in +## an @code{(@var{x}, @var{y}), @var{z}} meshgrid. If the grid is uniform, you +## can specify @var{x}, @var{y} @var{z} as vectors. +## +## If @var{x}, @var{y} and @var{z} are undefined they are assumed to be +## @code{(1:@var{m}, 1:@var{n}, 1:@var{p})} where @code{[@var{m}, @var{n}] = +## size(@var{u})} and @code{@var{p} = max (size (@var{w}))}. +## +## The variable @var{s} is a scalar defining a scaling factor to use for +## the arrows of the field relative to the mesh spacing. A value of 0 +## disables all scaling. The default value is 1. +## +## The style to use for the plot can be defined with a line style @var{style} +## in a similar manner to the line styles used with the @code{plot} command. +## If a marker is specified then markers at the grid points of the vectors are +## printed rather than arrows. If the argument 'filled' is given then the +## markers as filled. +## +## The optional return value @var{h} provides a list of handles to the +## the parts of the vector field (body, arrow and marker). +## +## @example +## @group +## [x, y, z] = peaks (25); +## surf (x, y, z); +## hold on; +## [u, v, w] = surfnorm (x, y, z / 10); +## quiver3 (x, y, z, u, v, w); +## @end group +## @end example +## +## @seealso{plot} +## @end deftypefn + +function retval = quiver3 (varargin) + + if (nargin < 2) + print_usage (); + elseif (isscalar (varargin{1}) && ishandle (varargin{1})) + h = varargin {1}; + if (! strcmp (get (h, "type"), "axes")) + error ("quiver: expecting first argument to be an axes object"); + endif + oldh = gca (); + unwind_protect + axes (h); + newplot (); + tmp = __quiver__ (h, 1, varargin{2:end}); + unwind_protect_cleanup + axes (oldh); + end_unwind_protect + else + newplot (); + tmp = __quiver__ (gca (), 1, varargin{:}); + endif + + if (nargout > 0) + retval = tmp; + endif + +endfunction + +%!demo +%! [x,y]=meshgrid (-1:0.1:1); +%! z=sin(2*pi*sqrt(x.^2+y.^2)); +%! theta=2*pi*sqrt(x.^2+y.^2)+pi/2; +%! quiver3(x,y,z,sin(theta),cos(theta),ones(size(z))); +%! hold on; +%! mesh(x,y,z); +%! hold off;