octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: basic implementation for isosurface, isocolors, isonormals


From: Thomas Treichl
Subject: Re: basic implementation for isosurface, isocolors, isonormals
Date: Tue, 14 Apr 2009 22:06:35 +0200
User-agent: Thunderbird 2.0.0.21 (Macintosh/20090302)

David Bateman schrieb:
Martin Helm wrote:
First of all,

thank you for your effort David. I can confirm the errors reported by Thomas. To be precise they happen with the first two examples in the "subplot" example group which use the syntax
patch ("Faces", f, "Vertices", v, "EdgeColor", whatever)

The other two examples which use "FaceVertexCData" and facecoloring work well.

If I simply add the "FaceColor" attribute with some value to the failing patch command, the problem disappears, so the bug seems to be trivial (a misssing default value for "FaceColor")

e.g.

patch ("Faces", f, "Vertices", v, "FaceColor", "blue","EdgeColor", "none")

works well. I'll look through the code.

- mh
The old 3.0.x behavior was that the default facecolor was [0,1,0]. I presume that is the compatible behavior and so re-established that as the default with the attached patch. The demo in the help string then works correctly for the gnuplot CVS. But there appear to be some issue with colormap with gnuplot 4.2.4 and the x11 terminal in a multiplot environment.. I suppose I should try 4.2.5 and see if that works

D.

Hi David, Martin,

thanks again for this work. I'd say that this is really a very cool new feature that then comes with 3.2...

Some time ago I also was working on the help text of isonormals.m and __marching_cubes__.m (Martin already knows because I wrote him an email some time ago offside the lists to preserve double-work ;) David, can you please apply the attached changeset?

Thanks and best regards,

  Thomas
# HG changeset patch
# User Thomas Treichl <address@hidden>
# Date 1239739325 -7200
# Node ID 3b810beddfa64d947c1fe399b17f325d70e0eac1
# Parent  308311b642b2be2c4e171e15b9e8f35ea4615975
Added help texts and tests.

diff --git a/scripts/ChangeLog b/scripts/ChangeLog
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -1,4 +1,9 @@
-2009-04-11  David Bateman  <address@hidden>
+2009-04-14  Thomas Treichl  <address@hidden>
+
+       * plot/__marching_cube__.m: Add help text.
+       * plot/isonormals.m: Add help text and tests.
+
+2009-04-14  David Bateman  <address@hidden>
 
        * plot/__patch__.m: Set default facecolor to [0,1,0].
        
diff --git a/scripts/plot/__marching_cube__.m b/scripts/plot/__marching_cube__.m
--- a/scripts/plot/__marching_cube__.m
+++ b/scripts/plot/__marching_cube__.m
@@ -12,52 +12,63 @@
 ##
 ## You should have received a copy of the GNU General Public License
 ## along with this program; if not, see http://www.gnu.org/licenses/gpl.html.
+
+## -*- texinfo -*-
+## @deftypefn  {Function File} address@hidden, @var{p}] =} __marching_cube__ 
(@var{x}, @var{y}, @var{z}, @var{val}, @var{iso})
+## @deftypefn  {Function File} address@hidden, @var{p}, @var{c}] =} 
__marching_cube__ (@var{x}, @var{y}, @var{z}, @var{val}, @var{iso}, @var{col})
 ##
+## Return the triangulation information @var{t} at points @var{p} for
+## the isosurface values resp. the volume data @var{val} and the iso
+## level @var{iso}.  It is considered that the volume data @var{val} is
+## given at the points @var{x}, @var{y} and @var{z} which are of type
+## three--dimensional numeric arrays.  The orientation of the triangles
+## is choosen such that the normals point from the higher values to the
+## lower values.
+##
+## Optionally the color data @var{col} can be passed to this function
+## whereas computed vertices color data @var{c} is returned as third
+## argument.
+##
+## The marching cube algorithm is well known and described eg. at
+## Wikipedia. The triangulation lookup table and the edge table used
+## here are based on Cory Gene Bloyd's implementation and can be found
+## beyond other surface and geometry stuff at Paul Bourke's website
+## @uref{http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise}.
+##
+## For example,
+## @example
+## N = 20;
+## lin = linspace(0, 2, N);
+## [x, y, z] = meshgrid (lin, lin, lin);
+##
+## c = (x-.5).^2 + (y-.5).^2 + (z-.5).^2;
+## [t, p] = __marching_cube__ (x, y, z, c, .5);
+##
+## figure ();
+## trimesh (t, p(:,1), p(:,2), p(:,3));
+## @end example
+##
+## Instead of the @command{trimesh} function the @command{patch}
+## function can be used to visualize the geometry. For example,
+##
+## @example
+## figure (); view (-38, 20);
+## pa = patch ("Faces", t, "Vertices", p, "FaceVertexCData", p, \
+##             "FaceColor", "interp", "EdgeColor", "none");
+##
+## ## Revert normals
+## set (pa, "VertexNormals", -get(pa, "VertexNormals"));
+##
+## ## Set lightning (available with the JHandles package)
+## # set (pa, "FaceLighting", "gouraud");
+## # light( "Position", [1 1 5]);
+## @end example
+##
+## @end deftypefn
+
 ## Author: Martin Helm <address@hidden>
 
-## -*- texinfo -*-
-## @deftypefn {Function File} address@hidden, @var{p}, @var{col}] =} 
__marching_cube__ (@var{x}, @var{y}, @var{z}, @var{c}, @var{iso}, @var{color})
-## Undocumented internal function.
-## @end deftypefn
-
-## usage: [T, P] = marching_cube( XX, YY, ZZ, C, ISO)
-## usage: [T, P, COL] = marching_cube( XX, YY, ZZ, C, ISO, COLOR)
-##
-## Calculates the triangulation T with points P for the isosurface
-## with level ISO. XX, YY, ZZ are meshgrid like values for the
-## cube and C holds the scalar values of the field,
-## COLOR holds additinal scalar values for coloring the surface.
-## The orientation of the triangles is choosen such that the
-## normals point from the lower values to the higher values.
-##
-## edgeTable and triTable are taken from Paul Bourke
-## (http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/)
-## Based on tables by Cory Gene Bloyd
-##
-## Example:
-##
-## x = linspace(0, 2, 20);
-## y = linspace(0, 2, 20);
-## z = linspace(0, 2, 20);
-##
-## [ xx, yy, zz ] = meshgrid(x, y, z);
-##
-## c = (xx-.5).^2 + (yy-.5).^2 + (zz-.5).^2;
-## [T, p] = marching_cube(xx, yy, zz, c, 0.5);
-## trimesh(T, p(:, 1), p(:, 2), p(:, 3));
-##
-## with jhandles you can also use the patch function to visualize
-## 
-## clf
-## pa = patch('Faces',T,'Vertices',p,'FaceVertexCData',p, ...
-## 'FaceColor','interp', 'EdgeColor', 'none');
-## set(pa, "VertexNormals", -get(pa, "VertexNormals")) # revert normals
-## view(-30, 30)
-## set(pa, "FaceLighting", "gouraud")
-## light( "Position", [1 1 5])
-##
-
-function [T, p, col] = __marching_cube__( xx, yy, zz, c, iso, colors)
+function [T, p, col] = __marching_cube__ (xx, yy, zz, c, iso, colors)
   
   persistent edge_table=[];
   persistent tri_table=[];
@@ -502,4 +513,4 @@
   0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1;
   0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1;
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ] + 1;
-endfunction
\ No newline at end of file
+endfunction
diff --git a/scripts/plot/isonormals.m b/scripts/plot/isonormals.m
--- a/scripts/plot/isonormals.m
+++ b/scripts/plot/isonormals.m
@@ -12,17 +12,83 @@
 ##
 ## You should have received a copy of the GNU General Public License
 ## along with this program; if not, see http://www.gnu.org/licenses/gpl.html.
+
+## -*- texinfo -*-
+## @deftypefn  {Function File} address@hidden =} isonormals (@var{val}, 
@var{v})
+## @deftypefnx {Function File} address@hidden =} isonormals (@var{val}, 
@var{p})
+## @deftypefnx {Function File} address@hidden =} isonormals (@var{x}, @var{y}, 
@var{z}, @var{val}, @var{v})
+## @deftypefnx {Function File} address@hidden =} isonormals (@var{x}, @var{y}, 
@var{z}, @var{val}, @var{p})
+## @deftypefnx {Function File} address@hidden =} isonormals (@dots{}, "negate")
+## @deftypefnx {Function File} isonormals (@dots{}, @var{p})
 ##
+## If called with one output argument and the first input argument
+## @var{val} is a three--dimensional array that contains the data for an
+## isosurface geometry and the second input argument @var{v} keeps the
+## vertices of an isosurface then return the normals @var{n} in form of
+## a matrix with the same size than @var{v} at computed points
+## @command{[x, y, z] = meshgrid (1:l, 1:m, 1:n)}.  The output argument
+## @var{n} can be taken to manually set @var{VertexNormals} of a patch.
+##
+## 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.  Instead of the
+## vertices data @var{v} a patch handle @var{p} can be passed to this
+## function.
+##
+## If given the string input argument "negate" as last input argument
+## then compute the reverse vector normals of an isosurface geometry.
+##
+## If no output argument is given then directly redraw the patch that is
+## given by the patch handle @var{p}.
+##
+## For example,
+## @example
+## function [] = isofinish (p)
+##   set (gca, "DataAspectRatioMode","manual","DataAspectRatio",[1 1 1]);
+##   set (p, "VertexNormals", -get(p,"VertexNormals")); ## Revert normals
+##   set (p, "FaceColor", "interp");
+##   ## set (p, "FaceLighting", "phong");
+##   ## light ("Position", [1 1 5]); ## Available with JHandles
+## endfunction
+##
+## 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, cdat] = isosurface (x, y, z, c, iso, y);
+## p = patch ("Faces", f, "Vertices", v, "FaceVertexCData", cdat, \
+##        "FaceColor", "interp", "EdgeColor", "none");
+## isofinish (p); ## Call user function isofinish
+##
+## subplot (2, 2, 2); view (-38, 20);
+## p = patch ("Faces", f, "Vertices", v, "FaceVertexCData", cdat, \
+##        "FaceColor", "interp", "EdgeColor", "none");
+## isonormals (x, y, z, c, p); ## Directly modify patch
+## isofinish (p);
+##
+## subplot (2, 2, 3); view (-38, 20);
+## p = patch ("Faces", f, "Vertices", v, "FaceVertexCData", cdat, \
+##        "FaceColor", "interp", "EdgeColor", "none");
+## n = isonormals (x, y, z, c, v); ## Compute normals of isosurface
+## set (p, "VertexNormals", n);    ## Manually set vertex normals
+## isofinish (p);
+##
+## subplot (2, 2, 4); view (-38, 20);
+## p = patch ("Faces", f, "Vertices", v, "FaceVertexCData", cdat, \
+##        "FaceColor", "interp", "EdgeColor", "none");
+## isonormals (x, y, z, c, v, "negate"); ## Use reverse directly
+## isofinish (p);
+## @end example
+##
+## @seealso {isosurface, isocolors, isocaps, marching_cube}
+##
+## @end deftypefn
+
 ## Author: Martin Helm <address@hidden>
-
-## usage: NORMALS = isonormals(X,Y,Z,V,VERT)
-## usage: NORMALS = isonormals(V,VERT)
-## usage: NORMALS = isonormals(V,P)
-## usage: NORMALS = isonormals(X,Y,Z,V,P)
-## usage: NORMALS = isonormals(...,'negate')
-## usage: isonormals(V,P)
-## usage: isonormals(X,Y,Z,V,P)
-##
 
 function varargout = isonormals(varargin)
   na = nargin;
@@ -75,4 +141,18 @@
     otherwise
       print_usage ();
   endswitch
-endfunction
\ No newline at end of file
+endfunction
+
+%!test
+%!  [x, y, z] = meshgrid (0:.5:2, 0:.5:2, 0:.5:2);
+%!  c = abs ((x-.5).^2 + (y-.5).^2 + (z-.5).^2); 
+%!  [f, v, cdat] = isosurface (x, y, z, c, .4, y);
+%!  n = isonormals (x, y, z, c, v);
+%!  assert (size (v), size (n));
+%!test
+%!  [x, y, z] = meshgrid (0:.5:2, 0:.5:2, 0:.5:2);
+%!  c = abs ((x-.5).^2 + (y-.5).^2 + (z-.5).^2); 
+%!  [f, v, cdat] = isosurface (x, y, z, c, .4, y);
+%!  np = isonormals (x, y, z, c, v);
+%!  nn = isonormals (x, y, z, c, v, "negate");
+%!  assert (all (np == -nn));

reply via email to

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