view scripts/plot/isosurface.m @ 14237:11949c9795a0

Revamp %!demos in m-files to use Octave coding conventions on spacing, etc. Add clf() to all demos using plot features to get reproducibility. Use 64 as input to all colormaps (jet (64)) to get reproducibility. * bicubic.m, cell2mat.m, celldisp.m, cplxpair.m, interp1.m, interp2.m, interpft.m, interpn.m, profile.m, profshow.m, convhull.m, delaunay.m, griddata.m, inpolygon.m, voronoi.m, autumn.m, bone.m, contrast.m, cool.m, copper.m, flag.m, gmap40.m, gray.m, hot.m, hsv.m, image.m, imshow.m, jet.m, ocean.m, pink.m, prism.m, rainbow.m, spring.m, summer.m, white.m, winter.m, condest.m, onenormest.m, axis.m, clabel.m, colorbar.m, comet.m, comet3.m, compass.m, contour.m, contour3.m, contourf.m, cylinder.m, daspect.m, ellipsoid.m, errorbar.m, ezcontour.m, ezcontourf.m, ezmesh.m, ezmeshc.m, ezplot.m, ezplot3.m, ezpolar.m, ezsurf.m, ezsurfc.m, feather.m, fill.m, fplot.m, grid.m, hold.m, isosurface.m, legend.m, loglog.m, loglogerr.m, pareto.m, patch.m, pbaspect.m, pcolor.m, pie.m, pie3.m, plot3.m, plotmatrix.m, plotyy.m, polar.m, quiver.m, quiver3.m, rectangle.m, refreshdata.m, ribbon.m, rose.m, scatter.m, scatter3.m, semilogx.m, semilogxerr.m, semilogy.m, semilogyerr.m, shading.m, slice.m, sombrero.m, stairs.m, stem.m, stem3.m, subplot.m, surf.m, surfc.m, surfl.m, surfnorm.m, text.m, title.m, trimesh.m, triplot.m, trisurf.m, uigetdir.m, uigetfile.m, uimenu.m, uiputfile.m, waitbar.m, xlim.m, ylim.m, zlim.m, mkpp.m, pchip.m, polyaffine.m, spline.m, bicgstab.m, cgs.m, gplot.m, pcg.m, pcr.m, treeplot.m, strtok.m, demo.m, example.m, rundemos.m, speed.m, test.m, calendar.m, datestr.m, datetick.m, weekday.m: Revamp %!demos to use Octave coding conventions on spacing, etc.
author Rik <octave@nomad.inbox5.com>
date Fri, 20 Jan 2012 12:59:53 -0800
parents 72c96de7a403
children 4506eade9f04
line wrap: on
line source

## Copyright (C) 2009-2012 Martin Helm
##
## 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} {[@var{fv}] =} isosurface (@var{val}, @var{iso})
## @deftypefnx {Function File} {[@var{fv}] =} isosurface (@var{x}, @var{y}, @var{z}, @var{val}, @var{iso})
## @deftypefnx {Function File} {[@var{fv}] =} isosurface (@dots{}, "noshare", "verbose")
## @deftypefnx {Function File} {[@var{fvc}] =} isosurface (@dots{}, @var{col})
## @deftypefnx {Function File} {[@var{f}, @var{v}] =} isosurface (@var{x}, @var{y}, @var{z}, @var{val}, @var{iso})
## @deftypefnx {Function File} {[@var{f}, @var{v}, @var{c}] =} isosurface (@var{x}, @var{y}, @var{z}, @var{val}, @var{iso}, @var{col})
## @deftypefnx {Function File} {} isosurface (@var{x}, @var{y}, @var{z}, @var{val}, @var{iso}, @var{col}, @var{opt})
##
## If called with one output argument and the first input argument
## @var{val} is a three-dimensional array that contains the data of an
## isosurface geometry and the second input argument @var{iso} keeps the
## isovalue as a scalar value then return a structure array @var{fv}
## that contains the fields @var{Faces} and @var{Vertices} at computed
## points @command{[x, y, z] = meshgrid (1:l, 1:m, 1:n)}.  The output
## argument @var{fv} can directly be taken as an input argument for the
## @command{patch} function.
##
## If called with further input arguments @var{x}, @var{y} and @var{z}
## which are three--dimensional arrays with the same size than @var{val}
## then the volume data is taken at those given points.
##
## The string input argument "noshare" is only for compatibility and
## has no effect.  If given the string input argument
## "verbose" then print messages to the command line interface about the
## current progress.
##
## If called with the input argument @var{col} which is a
## three-dimensional array of the same size than @var{val} then take
## those values for the interpolation of coloring the isosurface
## geometry.  Add the field @var{FaceVertexCData} to the structure
## array @var{fv}.
##
## If called with two or three output arguments then return the
## information about the faces @var{f}, vertices @var{v} and color data
## @var{c} as seperate arrays instead of a single structure array.
##
## If called with no output argument then directly process the
## isosurface geometry with the @command{patch} command.
##
## For example,
##
## @example
## @group
## [x, y, z] = meshgrid (1:5, 1:5, 1:5);
## val = rand (5, 5, 5);
## isosurface (x, y, z, val, .5);
## @end group
## @end example
##
## @noindent
## will directly draw a random isosurface geometry in a graphics window.
## Another example for an isosurface geometry with different additional
## coloring
## @c Set example in small font to prevent overfull line
##
## @smallexample
## N = 15;    # Increase number of vertices in each direction
## iso = .4;  # Change isovalue to .1 to display a sphere
## lin = linspace (0, 2, N);
## [x, y, z] = meshgrid (lin, lin, lin);
## c = abs ((x-.5).^2 + (y-.5).^2 + (z-.5).^2);
## figure (); # Open another figure window
##
## subplot (2, 2, 1); view (-38, 20);
## [f, v] = isosurface (x, y, z, c, iso);
## p = patch ("Faces", f, "Vertices", v, "EdgeColor", "none");
## set (gca, "PlotBoxAspectRatioMode","manual", ...
##           "PlotBoxAspectRatio", [1 1 1]);
## # set (p, "FaceColor", "green", "FaceLighting", "phong");
## # light ("Position", [1 1 5]); # Available with the JHandles package
##
## subplot (2, 2, 2); view (-38, 20);
## p = patch ("Faces", f, "Vertices", v, "EdgeColor", "blue");
## set (gca, "PlotBoxAspectRatioMode","manual", ...
##           "PlotBoxAspectRatio", [1 1 1]);
## # set (p, "FaceColor", "none", "FaceLighting", "phong");
## # light ("Position", [1 1 5]);
##
## subplot (2, 2, 3); view (-38, 20);
## [f, v, c] = isosurface (x, y, z, c, iso, y);
## p = patch ("Faces", f, "Vertices", v, "FaceVertexCData", c, \
##            "FaceColor", "interp", "EdgeColor", "none");
## set (gca, "PlotBoxAspectRatioMode","manual", ...
##           "PlotBoxAspectRatio", [1 1 1]);
## # set (p, "FaceLighting", "phong");
## # light ("Position", [1 1 5]);
##
## subplot (2, 2, 4); view (-38, 20);
## p = patch ("Faces", f, "Vertices", v, "FaceVertexCData", c, \
##            "FaceColor", "interp", "EdgeColor", "blue");
## set (gca, "PlotBoxAspectRatioMode","manual", ...
##           "PlotBoxAspectRatio", [1 1 1]);
## # set (p, "FaceLighting", "phong");
## # light ("Position", [1 1 5]);
## @end smallexample
##
## @seealso{isonormals, isocolors}
## @end deftypefn

## Author: Martin Helm <martin@mhelm.de>

function varargout = isosurface(varargin)

  if (nargin < 2 || nargin > 8 || nargout > 3)
    print_usage ();
  endif

  calc_colors = false;
  f = v = c = [];
  verbose = false;
  noshare = false;
  if (nargin >= 5)
    x = varargin{1};
    y = varargin{2};
    z = varargin{3};
    val = varargin{4};
    iso = varargin{5};
    if (nargin >= 6 && ismatrix (varargin{6}))
      colors = varargin{6};
      calc_colors = true;
    endif
  else
    val = varargin{1};
    [n2, n1, n3] = size (val);
    [x, y, z] = meshgrid (1:n1, 1:n2, 1:n3);
    iso = varargin{2};
    if (nargin >= 3 && ismatrix (varargin{3}))
        colors = varargin{3};
        calc_colors = true;
    endif
  endif
  if (calc_colors)
    if (nargout == 2)
      warning ( "Colors will be calculated, but you did not specify an output argument for it!" );
    endif
    [fvc.faces, fvc.vertices, fvc.facevertexcdata] = __marching_cube__ (x, y, z, val, iso, colors);
  else
    [fvc.faces, fvc.vertices] = __marching_cube__ (x, y, z, val, iso);
  endif

  if (isempty (fvc.vertices) || isempty (fvc.faces))
    warning ( "The resulting triangulation is empty" );
  endif

  switch (nargout)
    case 0
      ## plot the calculated surface
      newplot ();
      if (calc_colors)
        pa = patch ("Faces", fvc.faces, "Vertices", fvc.vertices,
                    "FaceVertexCData", fvc.facevertexcdata,
                    "FaceColor", "flat", "EdgeColor", "none");
      else
        pa = patch ("Faces", fvc.faces, "Vertices", fvc.vertices,
                    "FaceColor", "g", "EdgeColor", "k");
      endif
      if (! ishold ())
        set (gca(), "view", [-37.5, 30],
             "xgrid", "on", "ygrid", "on", "zgrid", "on");
      endif
    case 1
      varargout = {fvc};
    case 2
      varargout = {fvc.faces, fvc.vertices};
    case 3
      varargout = {fvc.faces, fvc.vertices, fvc.facevertexcdata};
    otherwise
      print_usage ();
  endswitch

endfunction


%!demo
%! clf;
%! [x,y,z] = meshgrid (-2:0.5:2, -2:0.5:2, -2:0.5:2);
%! v = x.^2 + y.^2 + z.^2;
%! isosurface (x, y, z, v, 1);

%!shared x, y, z, val
%!  [x, y, z]  = meshgrid (0:1, 0:1, 0:1); ## Points for single
%!  val        = [0, 0; 0, 0];             ## cube and a 3-D
%!  val(:,:,2) = [0, 0; 1, 0];             ## array of values
%!test
%!  fv = isosurface (x, y, z, val, 0.3);
%!  assert (isfield (fv, "vertices"), true);
%!  assert (isfield (fv, "faces"), true);
%!  assert (size (fv.vertices), [3 3]);
%!  assert (size (fv.faces), [1 3]);
%!test
%!  fvc = isosurface (x, y, z, val, .3, y);
%!  assert (isfield (fvc, "vertices"), true);
%!  assert (isfield (fvc, "faces"), true);
%!  assert (isfield (fvc, "facevertexcdata"), true);
%!  assert (size (fvc.vertices), [3 3]);
%!  assert (size (fvc.faces), [1 3]);
%!  assert (size (fvc.facevertexcdata), [3 1]);
%!test
%!  [f, v] = isosurface (x, y, z, val, .3);
%!  assert (size (f), [1 3]);
%!  assert (size (v), [3 3]);
%!test
%!  [f, v, c] = isosurface (x, y, z, val, .3, y);
%!  assert (size (f), [1 3]);
%!  assert (size (v), [3 3]);
%!  assert (size (c), [3 1]);