NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hi Mohamad, > The plane-layer intersection lines could be useful too. But since > what we have is a stack of flatfields of (x, y) --> z then "clipping" > the layers by some plane(s) could be a useful operation and > visualization. So the result of clipping a layer by one or more planes > would be a new layer which is like the original layer but minus some > part of it. You may want to merge your stack of FlatFields of ((x, y) -> z) into a single 3-D FlatField with MathType ((x, y, z) -> layer) and then take plane slices through it. Given an array "FlatField[] layers" in ascending or descending order and with domain Gridded2DSets all of the same size, they can be merged by: int lengthZ = layers.length; Gridded2DSet domain2d = (Gridded2DSet) layers[0].getDomainSet(); int lengthX = domain2d.getlength(0); int lengthY = domain2d.getlength(1); // construct array for new Gridded3DSet locations float[][] samples = new float[3][lengthX * lengthY * lengthZ]; // construct array for new FlatField values float[][] range = new float[1][lengthX * lengthY * lengthZ]; int offset = 0; for (int i=0; i<lengthZ; i++) { domain2d = (GriddedSet) layers[i].getDomainSet(); float[][] dvalues = domain2d.getSamples(false); // don't copy float[][] rvalues = layers[i].getFloats(false); // don't copy // copy (x, y) locations into new Gridded3DSet locations System.arraycopy(dvalues[0], 0, samples[0], offset, lengthX * lengthY); System.arraycopy(dvalues[1], 0, samples[1], offset, lengthX * lengthY); // copy z locations into new Gridded3DSet locations System.arraycopy(rvalues[0], 0, samples[2], offset, lengthX * lengthY); // set layer values for new FlatField for (int j=0; j<lengthX * lengthY; j++) { range[0][offset + j] = (float) i; } offset += lengthX * lengthY; } RealTupleType xyz = new RealTupleType(x, y, z); RealType layer = new RealType("layer"); FunctionType ftype = new FunctionType(xyz, layer); Gridded3DSet dset new Gridded3DSet(xyz, samples, lengthX, lengthY, lengthZ); FlatField layers3d = new FlatField(ftype, dset); layers3d.setSamples(range); Now layers3d is a Field that maps (x, y, z) locations to layer numbers. You can construct a 2-D plane (constant z values, a vertical plane, or whatever) as "Gridded3DSet plane" with manifold dimension = 2, and then FlatField slice layers3d.resample(plane, Data.WEIGHTED_AVERAGE, Data.NO_ERRORS); will create a slice whose display will show layer numbers (interpolated and hence fractional). You could add this ScalarMap to the display: new ScalarMap(layer, Display.IsoContour) and set it's ContourControl base = 0.0, interval = 1.0, lowlimit = -0.1 and hilimit = lengthZ - 0.9 to see the locations of layers on "slice". Cheers, Bill
visad
archives: