ScreenCoords

Hi Everyone,

        Thanks for your help, Bill - your suggestions helped enormously and the
program now works. I'm attaching the code snipped below for the archives. It
does what statisticians call brushing - I've seen a couple of other
references to this in the archives, so this code might be useful to someone
else who wants to use Visad to brush 3D scatterplots.

        Thanks again -

        Adele

DisplayRenderer dr = display.getDisplayRenderer();
MouseBehavior mb = dr.getMouseBehavior();
Vector v = display.getMapVector();
ScalarMap[] maps = new ScalarMap[v.size()];
for (int k=0; k<maps.length; k++) {
        maps[k] = (ScalarMap) v.elementAt(k);
}
ScalarMap Xmap, Ymap, Zmap;
Xmap = null;
Ymap = null;
Zmap = null;
for (int k=0; k<maps.length; k++) {
        if( maps[k].getDisplayScalar().equals(Display.XAxis)) {
                Xmap=maps[k];
        }
        if( maps[k].getDisplayScalar().equals(Display.YAxis)) {
                Ymap=maps[k];
        }
        if( maps[k].getDisplayScalar().equals(Display.ZAxis)) {
                Zmap=maps[k];
        }
}
// get the RealType values for the data points:
float[][] pos = new float[3][nrows];
pos[0] = Xmap.scaleValues(dataset[ixvar]);
pos[1] = Ymap.scaleValues(dataset[iyvar]);
pos[2] = Zmap.scaleValues(dataset[izvar]);

float[] x = new float[nrows];
float[] y = new float[nrows];
for(int i=0;i<nrows;i++){
        double[] position = new double[3];
        position[0] = (double)pos[0][i];
        position[1] = (double)pos[1][i];
        position[2] = (double)pos[2][i];
        // save the screen coordinates of this data point
        int[] screen = mb.getScreenCoords(position);
        x[i] = (float)screen[0];
        y[i] = (float)screen[1];
}

boolean[] selected = new boolean[nrows];
for(int i=0;i<nrows;i++) selected[i]=false;
SampledSet[] sets = set.getSets();
for(int j=1; j<sets.length; j++){
        //starts from 1 (invisible starter set)
        float[][] samples = sets[j].getSamples(true);// from the
CurveManipulationRenderer
        boolean yes = DelaunayCustom.checkAndFixSelfIntersection(samples);
        // get the RealType values for the curve:
        int nsamp = samples[0].length;
        float[][] xyz = new float[2][nsamp];
        xyz[0] = Xmap.scaleValues(samples[0]);
        xyz[1] = Ymap.scaleValues(samples[1]);
        // save their screen coordinates
        float[][]samp = new float[2][nsamp];
        for(int jj=0;jj<nsamp;jj++){
                double[] position = new double[3];
                int[] screen = mb.getScreenCoords(position);
                position[0] = (double)xyz[0][jj];
                position[1] = (double)xyz[1][jj];
                position[2] = (double)0;
                screen = mb.getScreenCoords(position);
                samp[0][jj] = (float)screen[0];
                samp[1][jj] = (float)screen[1];
        }
        for (int i=0; i<nrows; i++) {
                // check to see if the screen coordinates of this point
                // are inside the screen coordinates of the curve, and
                // if they are, set selected=true
                if(DelaunayCustom.inside(samp,x[i],y[i])) {
                        selected[i] = true;
                }
        }
}