Re: collaboration graph for isosurface generation

Hi Bill,

> 2. There is a question about how the topology of the octree
> or multi-resolution Set works.  Are only the high-resolution
> samples passed in 'float[][] samples', with lower resolutions
> derived?  In this case, dependent variable values in Field
> ranges also must have their low-resolution values implicit
> from high-resolution values.  An alternative is to include
> both low and high-resolution samples in the 'float[][] samples'
> array, and to make appropriate implementations of topology in
> various Set methods.  One easy way to handle indexToValue(),
> valueToIndex(), valueToInterp(), etc would be to include an
> instance variable of a Gridded3DSet that corresponds only to
> the high-resolution samples, and to adapt the methods to this
> instance Gridded3DSet.  In a multi-resolution grid where the
> various resolutions apply to non-overlapping regions, you
> could interpret the low and high resolution samples as defining
> a slightly irregular topology corase in some regions and fine
> in others.  In the case where they do overlap, it all depends
> on how you want makeIsoSurface() and other methods to behave.
> You could even compute several different versions of the iso-
> surface, and choose the one to display based on how "close"
> the viewer is using a ControlListerner on ProjectionControl -
> doing this would require digging into the display classes and
> I can help more when I return from travel.

These are very good questions you brought up.  We are trying to figure out
how to extend your (great) application with our multi-resolution piece.
Our current multi-resolution (MR) implementation is comprised of the
following:

1.  A C program that reads the raw data (density) values, i.e. the output
    from the CAT scan (http://www.cs.unh.edu/~rlaramee/pictures/head2.jpg)
    a outputs an MR representation of the data in the form of cubes.
    So, if the raw data set is
        128 x 128 x 128 data values, this programs outputs:

        128 x 128 x 128 cubes with each cube vertex taking on a data value
        64  x 64  x 64  cubes -a coarser resolution representation
        32  x 32  x 32  cubes
        16  x 16  x 16  cubes
        ...
        1   x 1   x 1   one cube that represents the entire volume

   The output is written to a file -a bunch of cubes.

2.  Another C program that reads in the output from program (1) and
    generates an adaptive resolution (AR) representation of the MR
    representation from program (1).  This part I haven't mentioned yet.
    Essentially, what it does is a search of the MR representation
    stored as an octree, and looks for branches of the octree to chop
    away.  Each cube of the octree stores the minimum and maximum
    scalar values of its 8 children (for internal, non-leaf nodes) or 8
    vertices (for leaf nodes).  If the difference between these
    values is less than some arbitrary threshold that we set, the
    branch is chopped off.  In this way, we can generate an AR
    representation of the MR representation in (1).

    Again, the output is written to a file -a bunch of cubes.  These first
    2 programs were written a few years ago by a colleague of mine.
    Program 3 is mostly where my job came in.

3.  A Java program that reads the output from either program (1) or (2),
    a whole bunch of cubes, recreates the octree (MR or AR) and renderers
    the tree (just the leaf nodes).  It just does a depth-first-search
    of the octree and renders each cube using the marching cubes
    algorithm.

And now we're scratching our heads on how we're going to add our stuff to
yours.  You pointed out a key point in that the
Gridded3DSet.makeIsoSurface() method takes a set of floats.  This is
something we're going to have to think about.  At this stage, we're still
trying to figure out how your application works.  I'm trying to update the
collaboration graph
(http://www.cs.unh.edu/~rlaramee/pictures/collaborationGraph.jpg) but it's
still fuzzy.  One area that is still fuzzy is the call to
ShadowFunctionOrSetType3D.doTransform().  Where is this method called
from?  Also the link between the ContourWidget and the Cell computation is
still unclear to me.  Does anyone know which class relates those?  Thank
you for you time.

-cheers, bob

Robert S Laramee        tel:    (603) 868-1361 (new as of 19 Jan '00)
9 Woodman Ave, #316     office: (603) 862-0350
Durham, NH 03828        URL:   http://www.cs.unh.edu/~rlaramee