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