[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
meshz, and leading axis handles to mesh, meshc and surface
From: |
David Bateman |
Subject: |
meshz, and leading axis handles to mesh, meshc and surface |
Date: |
Wed, 28 Nov 2007 00:58:23 +0100 |
User-agent: |
Thunderbird 1.5.0.7 (X11/20060921) |
This patch adds the meshz function and allows an axis handle to be the
leading argument for the mesh, meshc and surface functions. It only
needed to be implemented in surface for mesh and meshc, though meshz
needed to implement the handle code as well as meshz modifies the x, y,
and z values before handing them to mesh and so needs to know if the
leading arg is a handle.
There are quite a few other functions that don't allow an axis handle as
the first argument and should. These include errorbar, loglogerr,
loglog, polar, semilogx, semilogyerr, semilogy where the code to do it
is in __plt_get_axis_arg__ but is disabled, and stem where no code
exists to do it.
Maybe all of the functions that can accept an axis handle as the first
argument should be adapted to use __plt_get_axis_arg__, which perhaps
the code in __plt_get_axis_arg__ allowing the unwind_protect code block
to restore the axis. Given that I've been adding similar code in all of
the individual routines this seems to be a non trivial task though
simple task. So should it be done before 3.0?
D.
Index: scripts/plot/Makefile.in
===================================================================
RCS file: /usr/local/cvsroot/octave/scripts/plot/Makefile.in,v
retrieving revision 1.56
diff -c -r1.56 Makefile.in
*** scripts/plot/Makefile.in 26 Nov 2007 23:13:40 -0000 1.56
--- scripts/plot/Makefile.in 27 Nov 2007 23:37:57 -0000
***************
*** 103,108 ****
--- 103,109 ----
mesh.m \
meshc.m \
meshgrid.m \
+ meshz.m \
ndgrid.m \
newplot.m \
orient.m \
Index: scripts/plot/meshc.m
===================================================================
RCS file: /usr/local/cvsroot/octave/scripts/plot/meshc.m,v
retrieving revision 1.7
diff -c -r1.7 meshc.m
*** scripts/plot/meshc.m 13 Nov 2007 17:34:33 -0000 1.7
--- scripts/plot/meshc.m 27 Nov 2007 23:37:57 -0000
***************
*** 42,52 ****
set (ax, "view", [-37.5, 30]);
endif
! if (nargin == 1)
! z = varargin {1};
! else
! z = varargin {3};
! endif
zmin = 2 * (min(z(:)) - max(z(:)));
[c, tmp2] = __contour__ (ax, zmin, varargin{:});
--- 42,48 ----
set (ax, "view", [-37.5, 30]);
endif
! z = get (tmp, "zdata");
zmin = 2 * (min(z(:)) - max(z(:)));
[c, tmp2] = __contour__ (ax, zmin, varargin{:});
Index: scripts/plot/surface.m
===================================================================
RCS file: /usr/local/cvsroot/octave/scripts/plot/surface.m,v
retrieving revision 1.7
diff -c -r1.7 surface.m
*** scripts/plot/surface.m 26 Nov 2007 21:24:33 -0000 1.7
--- scripts/plot/surface.m 27 Nov 2007 23:37:57 -0000
***************
*** 41,59 ****
function h = surface (varargin)
! ax = gca ();
! firststring = nargin + 1;
! for i = 1 : nargin
! if (ischar (varargin {i}))
! firststring = i;
break;
endif
endfor
-
if (firststring > 5)
! print_usage ();
elseif (firststring == 5)
x = varargin{1};
y = varargin{2};
--- 41,85 ----
function h = surface (varargin)
! if (isscalar (varargin{1}) && ishandle (varargin{1}))
! h = varargin {1};
! if (! strcmp (get (h, "type"), "axes"))
! error ("surface: expecting first argument to be an axes object");
! endif
! oldh = gca ();
! unwind_protect
! axes (h);
! [tmp, bad_usage] = __surface__ (h, varargin{2:end});
! unwind_protect_cleanup
! axes (oldh);
! end_unwind_protect
! else
! [tmp, bad_usage] = __surface__ (gca (), varargin{:});
! endif
!
! if (bad_usage)
! print_usage ();
! endif
!
! if (nargout > 0)
! h = tmp;
! endif
! endfunction
!
! function [h, bad_usage] = __surface__ (ax, varargin)
! bad_usage = false;
! h = 0;
! firststring = nargin;
! for i = 2 : nargin
! if (ischar (varargin {i - 1}))
! firststring = i - 1;
break;
endif
endfor
if (firststring > 5)
! bad_usage = true;
elseif (firststring == 5)
x = varargin{1};
y = varargin{2};
***************
*** 117,139 ****
error ("surface: argument must be a matrix");
endif
else
! print_usage ();
! endif
!
! ## Make a default surface object.
! tmp = __go_surface__ (ax, "xdata", x, "ydata", y, "zdata", z, "cdata", c);
! set (tmp, "facecolor","flat");
! if (firststring <= nargin)
! set (tmp, varargin {firststring:end});
endif
! if (! ishold ())
! set (ax, "view", [0, 90], "box", "off", "xgrid", "on",
! "ygrid", "on", "zgrid", "on");
! endif
!
! if (nargout > 0)
! h = tmp;
! endif
endfunction
--- 143,163 ----
error ("surface: argument must be a matrix");
endif
else
! bad_usage = true;
endif
! if (! bad_usage)
! ## Make a default surface object.
! h = __go_surface__ (ax, "xdata", x, "ydata", y, "zdata", z, "cdata", c);
! set (h, "facecolor","flat");
! if (firststring < nargin)
! set (h, varargin {firststring:end});
! endif
!
! if (! ishold ())
! set (ax, "view", [0, 90], "box", "off", "xgrid", "on",
! "ygrid", "on", "zgrid", "on");
! endif
! endif
endfunction
*** /dev/null 2007-11-27 21:46:17.852003336 +0100
--- scripts/plot/meshz.m 2007-11-28 00:28:09.493312624 +0100
***************
*** 0 ****
--- 1,100 ----
+ ## 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} {} meshz (@var{x}, @var{y}, @var{z})
+ ## Plot a curtain mesh given matrices @var{x}, and @var{y} from
+ ## @code{meshgrid} and a matrix @var{z} corresponding to the @var{x} and
+ ## @var{y} coordinates of the mesh. If @var{x} and @var{y} are vectors,
+ ## then a typical vertex is (@var{x}(j), @var{y}(i), @var{z}(i,j)). Thus,
+ ## columns of @var{z} correspond to different @var{x} values and rows of
+ ## @var{z} correspond to different @var{y} values.
+ ## @seealso{meshgrid, mesh, contour}
+ ## @end deftypefn
+
+ function retval = meshz (varargin)
+
+ if (isscalar (varargin{1}) && ishandle (varargin{1}))
+ h = varargin {1};
+ if (! strcmp (get (h, "type"), "axes"))
+ error ("meshz: expecting first argument to be an axes object");
+ endif
+ oldh = gca ();
+ unwind_protect
+ axes (h);
+ tmp = __meshz__ (varargin{2:end});
+ unwind_protect_cleanup
+ axes (oldh);
+ end_unwind_protect
+ else
+ tmp = __meshz__ (varargin{:});
+ endif
+
+ if (nargout > 0)
+ retval = tmp;
+ endif
+
+ endfunction
+
+ function h = __meshz__ (varargin)
+
+ ioff = nargin + 1;
+ for i = 1 : nargin
+ if (ischar (varargin {i}))
+ ioff = i;
+ break;
+ endif
+ endfor
+
+ ## Bundle C matrix back into varargin
+ if (ioff == 3 || ioff == 5)
+ ioff --;
+ endif
+
+ if (ioff == 2)
+ z = varargin {1};
+ [m, n] = size (z);
+ x = 1 : n;
+ y = (1 : m).';
+ else
+ x = varargin {1};
+ y = varargin {2};
+ z = varargin {3};
+ endif
+
+
+ if (isvector (x) && isvector (y))
+ x = [x(1), x(:).', x(end)];
+ y = [y(1); y(:); y(end)];
+ else
+ x = [x(1, 1), x(1, :), x(1, end);
+ x(:, 1), x, x(:, end);
+ x(end, 1), x(end, :), x(end, end)];
+ y = [y(1, 1), y(1, :), y(1, end);
+ y(:, 1), y, y(:, end);
+ y(end, 1), y(end, :), y(end, end)];
+ endif
+
+ zref = min(z(isfinite(z)));
+ z = [zref .* ones(1, size(z, 2) + 2);
+ zref .* ones(size(z, 1), 1), z, zref .* ones(size(z, 1), 1);
+ zref.* ones(1, size(z, 2) + 2)];
+
+ h = mesh (x, y, z, varargin{ioff:end});
+
+ endfunction
2007-11-27 David Bateman <address@hidden>
* plot/meshz.m: New function.
* plot/Makefile.in (SOURCES): Add it to teh sources.
* plot/surface.m: Allow surface to accept an axis handle as the
first argument.
* plot/meshc.m: Extract z from the the surface object rather than
varargin so that we can rely on code in surface to treat leading
axis handles.
- meshz, and leading axis handles to mesh, meshc and surface,
David Bateman <=
- Re: meshz, and leading axis handles to mesh, meshc and surface, David Bateman, 2007/11/27
- Re: meshz, and leading axis handles to mesh, meshc and surface, John W. Eaton, 2007/11/27
- Re: meshz, and leading axis handles to mesh, meshc and surface, David Bateman, 2007/11/28
- Re: meshz, and leading axis handles to mesh, meshc and surface, John W. Eaton, 2007/11/28
- Re: meshz, and leading axis handles to mesh, meshc and surface, David Bateman, 2007/11/28
- Re: meshz, and leading axis handles to mesh, meshc and surface, John W. Eaton, 2007/11/28
- Re: meshz, and leading axis handles to mesh, meshc and surface, Michael Goffioul, 2007/11/29
- Re: meshz, and leading axis handles to mesh, meshc and surface, David Bateman, 2007/11/29
- Re: meshz, and leading axis handles to mesh, meshc and surface, John W. Eaton, 2007/11/29
- Re: meshz, and leading axis handles to mesh, meshc and surface, David Bateman, 2007/11/29