# HG changeset patch # User jwe # Date 1195072608 0 # Node ID 5ff4da7bd2e736f3ea65cff681d8e1257de8bf3c # Parent ff4a4cc863a965e15845b4f0081b5a06a2d0aa3e [project @ 2007-11-14 20:36:48 by jwe] diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,18 @@ +2007-11-14 David Bateman + + * plot/__contour__.m: Treat unclosed contours by adding NaN to + flag to patch that it is not closed. Allow z to take string + arguments and use it to flag that the contours are placed at the + z level of the contour itself. + * plot/__go_draw_axes__.m: Treat hidden line removal in patch + objects as well. Let hidden removal take precedence in case of a + conflict. + * plot/surface.m: Allow surface to treat handles being passed or + returned. Any additional arguments arr used to set the surface + handle. + * plot/contour3.m: New function + * plot/Makefile.in (SOURCES): Add it to the sources. + 2007-11-14 John W. Eaton * specfun/bessel.m: Update doc string from diff --git a/scripts/plot/Makefile.in b/scripts/plot/Makefile.in --- a/scripts/plot/Makefile.in +++ b/scripts/plot/Makefile.in @@ -72,6 +72,7 @@ clf.m \ close.m \ closereq.m \ + contour3.m \ contour.m \ contourc.m \ contourf.m \ diff --git a/scripts/plot/__contour__.m b/scripts/plot/__contour__.m --- a/scripts/plot/__contour__.m +++ b/scripts/plot/__contour__.m @@ -23,6 +23,21 @@ ax = varargin {1}; z = varargin {2}; + if (ischar (z)) + if (strcmp (z, "none")) + z = NaN; + elseif (strcmp (z, "base")) + if (nargin == 1) + z = varargin {1}; + else + z = varargin {3}; + endif + z = 2 * (min(z(:)) - max(z(:))); + elseif (!strcmp (z, "level")) + error ("unrecognized z argument"); + endif + endif + clim = get (ax, "clim"); [c, lev] = contourc (varargin{3:end}); @@ -36,15 +51,23 @@ clev = c(1,i1); clen = c(2,i1); - ii = i1+1:i1+clen; + if (all (c(:,i1+1) == c(:,i1+clen))) + p = c(:, i1+1:i1+clen-1); + else + p = [c(:, i1+1:i1+clen), NaN(2, 1)]; + endif + lev = (clev - minlev) * (clim(2) - clim(1)) / (maxlev - minlev) + clim(1); if (isnan (z)) - h = [h; patch(ax, c(1,ii), c(2,ii), "facecolor", "none", + h = [h; patch(ax, p(1,:), p(2,:), "facecolor", "none", "edgecolor", "flat", "cdata", lev)]; + elseif (!ischar(z)) + h = [h; patch(ax, p(1,:), p(2,:), z * ones (1, columns (p)), "facecolor", + "none", "edgecolor", "flat", "cdata", lev)]; else - h = [h; patch(ax, c(1,ii), c(2,ii), z*ones(size(ii)), "facecolor", - "none", "edgecolor", "flat", "cdata", lev)]; + h = [h; patch(ax, p(1,:), p(2,:), clev * ones (1, columns (p)), + "facecolor", "none", "edgecolor", "flat", "cdata", lev)]; endif i1 += clen+1; endwhile diff --git a/scripts/plot/__go_draw_axes__.m b/scripts/plot/__go_draw_axes__.m --- a/scripts/plot/__go_draw_axes__.m +++ b/scripts/plot/__go_draw_axes__.m @@ -204,7 +204,7 @@ data_idx = 0; data = cell (); is_image_data = []; - hidden_removal = true; + hidden_removal = NaN; xminp = yminp = zminp = cminp = Inf; xmax = ymax = zmax = cmax = -Inf; @@ -461,7 +461,12 @@ if (! isnan (xcol) && ! isnan (ycol)) ## Is the patch closed or not - if (! strncmp (obj.facecolor, "none", 4)) + if (strncmp (obj.facecolor, "none", 4)) + if (isnan (hidden_removal)) + hidden_removal = false; + endif + else + hidden_removal = true; if (! isempty (zcol)) error ("gnuplot (as of v4.2) only supports 2D filled patches"); else @@ -747,7 +752,11 @@ palette_data = []; if (strncmp (obj.facecolor, "none", 4)) - hidden_removal = false; + if (isnan (hidden_removal)) + hidden_removal = false; + endif + else + hidden_removal = true; endif if (flat_interp_face @@ -895,7 +904,7 @@ endfor - if (hidden_removal) + if (isnan(hidden_removal) || hidden_removal) fputs (plot_stream, "set hidden3d;\n"); else fputs (plot_stream, "unset hidden3d;\n"); diff --git a/scripts/plot/contour3.m b/scripts/plot/contour3.m new file mode 100644 --- /dev/null +++ b/scripts/plot/contour3.m @@ -0,0 +1,77 @@ +## 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 +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{c} =} contour3 (@var{z}) +## @deftypefnx {Function File} {@var{c} =} contour3 (@var{z}, @var{vn}) +## @deftypefnx {Function File} {@var{c} =} contour3 (@var{x}, @var{y}, @var{z}) +## @deftypefnx {Function File} {@var{c} =} contour3 (@var{x}, @var{y}, @var{z}, @var{vn}) +## @deftypefnx {Function File} {@var{c} =} contour3 (@var{h}, @dots{}) +## @deftypefnx {Function File} {[@var{c}, @var{h}] =} contour3 (@dots{}) +## Plot level curves (contour lines) of the matrix @var{z}, using the +## contour matrix @var{c} computed by @code{contourc} from the same +## arguments; see the latter for their interpretation. The contours are +## ploted at the Z level corresponding to their contour. The set of +## contour levels, @var{c}, is only returned if requested. For example: +## +## @example +## @group +## contour3 (peaks (19)); +## hold on +## surface (peaks (19), 'FaceColor', 'none', 'EdgeColor', 'black') +## colormap hot +## @end group +## @end example +## +## The optional input and output argument @var{h} allows an axis handle to +## be passed to @code{contour} and the handles to the contour objects to be +## returned. +## @seealso{contourc, patch, plot} +## @end deftypefn + +function [c, h] = contour3 (varargin) + + if (isscalar (varargin{1}) && ishandle (varargin{1})) + ax = varargin{1}; + if (! strcmp (get (ax, "type"), "axes")) + error ("contour: expecting first argument to be an axes object"); + endif + oldh = gca (); + unwind_protect + axes (ax); + newplot (); + [ctmp, htmp] = __contour__ (ax, varargin{2:end}); + unwind_protect_cleanup + axes (oldh); + end_unwind_protect + else + newplot (); + ax = gca (); + [ctmp, htmp] = __contour__ (ax, "level", varargin{:}); + endif + + if (! ishold ()) + set (ax, "view", [-37.5, 30]); + endif + + if (nargout > 0) + c = ctmp; + h = htmp + endif + +endfunction diff --git a/scripts/plot/surface.m b/scripts/plot/surface.m --- a/scripts/plot/surface.m +++ b/scripts/plot/surface.m @@ -18,49 +18,48 @@ ## . ## -*- texinfo -*- -## @deftypefn {Function File} @var{h} = {} surface (@var{x}, @var{y}, @var{z}, @var{c}) -## @deftypefnx {Function File} @var{h} = {} surface (@var{x}, @var{y}, @var{z}) -## Plot a surface graphic object 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 surface. 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. +## @deftypefn {Function File} {} surface (@var{x}, @var{y}, @var{z}, @var{c}) +## @deftypefnx {Function File} {} surface (@var{x}, @var{y}, @var{z}) +## @deftypefnx {Function File} {} surface (@var{z}, @var{c}) +## @deftypefnx {Function File} {} surface (@var{z}) +## @deftypefnx {Function File} {} surface (@dots{}, @var{prop}, @var{val}) +## @deftypefnx {Function File} {} surface (@var{h}, @dots{}) +## @deftypefnx {Function File} {@var{h} = } surface (@dots{}) +## Plot a surface graphic object 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 surface. 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. If @var{x} and @var{y} +## are missing, they are constructed from size of the matrix @var{z}. +## +## Any additional properties passed are assigned the the surface.. ## @seealso{surf, mesh, patch, line} ## @end deftypefn ## Author: jwe -function h = surface (x, y, z, c) +function h = surface (varargin) ax = gca (); - if (nargin == 1) - c = z = x; - if (ismatrix (z)) - [nr, nc] = size (z); - x = 1:nc; - y = (1:nr)'; - else - error ("surface: argument must be a matrix"); + firststring = nargin + 1; + for i = 1 : nargin + if (ischar (varargin {i})) + firststring = i; + break; endif - elseif (nargin == 3) - c = z; - if (isvector (x) && isvector (y) && ismatrix (z)) - if (rows (z) == length (y) && columns (z) == length (x)) - x = x(:)'; - y = y(:); - else - error ("surface: rows (z) must be the same as length (y) and columns (z) must be the same as length (x)"); - endif - elseif (ismatrix (x) && ismatrix (y) && ismatrix (z)) - if (! (size_equal (x, y) && size_equal (x, z))) - error ("surface: x, y, and z must have same dimensions"); - endif - else - error ("surface: x and y must be vectors and z must be a matrix"); - endif - elseif (nargin == 4) + endfor + + + if (firststring > 5) + print_usage (); + elseif (firststring == 5) + x = varargin{1}; + y = varargin{2}; + z = varargin{3}; + c = varargin{4}; + if (! size_equal (z, c)) error ("surface: z and c must have same size"); endif @@ -78,6 +77,45 @@ else error ("surface: x and y must be vectors and z must be a matrix"); endif + elseif (firststring == 4) + x = varargin{1}; + y = varargin{2}; + z = varargin{3}; + c = z; + if (isvector (x) && isvector (y) && ismatrix (z)) + if (rows (z) == length (y) && columns (z) == length (x)) + x = x(:)'; + y = y(:); + else + error ("surface: rows (z) must be the same as length (y) and columns (z) must be the same as length (x)"); + endif + elseif (ismatrix (x) && ismatrix (y) && ismatrix (z)) + if (! (size_equal (x, y) && size_equal (x, z))) + error ("surface: x, y, and z must have same dimensions"); + endif + else + error ("surface: x and y must be vectors and z must be a matrix"); + endif + elseif (firststring == 3) + z = varargin {1}; + c = varargin {2}; + if (ismatrix (z)) + [nr, nc] = size (z); + x = 1:nc; + y = (1:nr)'; + else + error ("surface: argument must be a matrix"); + endif + elseif (firststring == 2) + z = varargin {1}; + c = z; + if (ismatrix (z)) + [nr, nc] = size (z); + x = 1:nc; + y = (1:nr)'; + else + error ("surface: argument must be a matrix"); + endif else print_usage (); endif @@ -85,6 +123,7 @@ ## Make a default surface object. tmp = __go_surface__ (ax, "xdata", x, "ydata", y, "zdata", z, "cdata", c); set (tmp, "facecolor","flat"); + set (tmp, varargin {firststring:end}); if (! ishold ()) set (ax, "view", [0, 90], "box", "off", "xgrid", "on", "ygrid", "on", "zgrid", "on");