20000925: slicer available?

>From: Mathias =?iso-8859-1?Q?St=FCmpert?= <AtzeS@xxxxxx>
>Keywords: 200009251222.e8PCMTb01493

Hi Mathias-

>I need a possibility to extract slices out of my 3D-Dataset. I think of
>a layer whose edges can be dragged along the axes. Is there an easy way
>to do this with VisAD?

We do this with some special classes that we created, but it can be
done with straight VisAD as well.  Basically, you need to grab the
Altitude value that you want to resample your 3D FlatField on and
create a new sample domain that is all the lat/lon points and that
altitude.  Then call FlatField.resample().

>My MathType looks like this:
>((latitude, longitude, altitude) -> (pressure, temperature, ...))

What you need is a data reference with a DirectManipulationRenderer
attached to it.  You'd probably want your point along the Altitude
axis.  If you look at Test00, you can see how to do this.   Essentially,
create a Real whose value is some initial starting point along
the Z (Altitude axis):

     double initialValue = 8000.0    // set to 8000 m
     Real slider = new Real(RealType.Altitude, initialValue);
     DataReference sliderRef = new DataReferenceImpl("slider");
     ConstantMap[] constants = new ConstantMap[5];
     constants[0] map = new ConstantMap(0.0, Display.Red);   // make a blue
     constants[1] map = new ConstantMap(0.0, Display.Green); // point
     constants[2] map = new ConstantMap(1.0, Display.Blue);  //
     constants[3] map = new ConstantMap(5.0, Display.PointSize); // make big
     constants[4] map = new ConstantMap(-1.0, Display.XAxis);// sets point
     constants[5] map = new ConstantMap(-1.0, Display.YAxis);// along left axis
     display.addReferences(new DirectManipulationRendererJ3D(),
                           slider, constants);

This will give you a point on the Z Axis (you'll need to have
ScalarMaps that map RealType.(X,Y,Z)Axis to Display.(X,Y,Z)Axis
respectively and set the ranges to (-1.0,1.0) for each so the
constant maps will work.

Then add a CellImpl to listen for changes in the data:

    CellImpl cell = new CellImpl() {
        public void doAction() 
            throws VisADException, RemoteException
            Real value = (Real) sliderRef.getData();
            // Create a set that you want to evaluate on
            Gridded3DSet sampleSet = 
                new Gridded3DSet(RealTupleType.LatitudeLongitudeAltitude,
                         new float[][] { lats, lons, new float[] {value}},
                         numlats, numlons, 1);
            FlatField slice = 3Dfield.resample(sampleSet);

where lats is the lat points of your domain, lons is the longitude
points of your domain. The slice should be a new FlatField of values
on that sample set (i.e., at that altitude). As you manipulate the
point with MB3, the point will move up and down the Z axis and you will
sample. You could change the resampling to something other than nearest
neighbor if you want. You also might want to check to see how much
different the new altitude value is from the old so you don't sample

I haven't tried this code, but the basic idea is there.

You can search the VisAD-list archives using "slice" or "resample" 
as a keyword to find other messages on this topic at:


Don Murray                               UCAR Unidata Program
dmurray@xxxxxxxxxxxxxxxx                        P.O. Box 3000
(303) 497-8628                              Boulder, CO 80307
Unidata WWW Server               http://www.unidata.ucar.edu/
McIDAS Demonstration Machine  http://mcdemo.unidata.ucar.edu/