octave-maintainers
[Top][All Lists]
Advanced

[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.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]