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.

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;
                }
        }
}


  • 2003 messages navigation, sorted by:
    1. Thread
    2. Subject
    3. Author
    4. Date
    5. ↑ Table Of Contents
  • Search the visad archives: