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 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; } } }
visad
archives: