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 Stewart and hi all, I've got some code to draw a 2D display with "bars". I've used VisADLineArray rather than VisADQuadArray, because I've got a display showing some 365 bars, which are packed up together so closely that one don't want them thick. (Thickness is nevertheless controlled with constant maps; see code below). The idea here is to plot daily precipitation values as "bars" (i.e. thick lines). So here we go: day = new RealType( "day", null, null ); precip = new RealType( "Precipitation", null, null ); // the function precip = f( days ) FunctionType func_Prec = new FunctionType( day , precip ); // here the day values, as a set, we'll have 365 values daySet = (Set) new Linear1DSet( day , (float) firstDay, (float) lastDay, 365); // the flat field ff_Prec = new FlatField( func_Prec, daySet ); // the line array pBars = new VisADLineArray(); // scalar maps xMap = new ScalarMap( day, Display.XAxis ); yMap = new ScalarMap( precip, Display.YAxis); // more scalar maps: 1st for shaps, and 2nd for shape scale, i.e, responsible for sacling the shape according to RealType precip pBarMap = new ScalarMap(precip, Display.Shape); pBarScaleMap = new ScalarMap(precip, Display.ShapeScale); // create a dispay... display1 = new DisplayImplJ2D("display1"); // initalize pBars: 2 vertex (with (x,y,z), where z is ignored) pBars.vertexCount=2; // and coordinates: draw some "arbitrary" line; it's be scaled according to values of RealType precip pBars.coordinates = new float[] {0.0f, 0.0f, 0.0f, 0.0f, -0.10f, 0.0f}; // let samples_precip be you precipitatios values: float[][] samples_Precip = new float[ 1 ][ 365 ]; // fill array with values... // code to fill array... // set samples: ff_Prec.setSamples(samples_Precip); // adda maps to display: display1.addMap( xMap ); display1.addMap( yMap1); display1.addMap(pBarMap); display1.addMap(pBarScaleMap); // get shapes control: ShapeControl scontrol = (ShapeControl) pBarMap.getControl(); scontrol.setShapeSet(new Integer1DSet(1)); // only one value scontrol.setShapes(new VisADGeometryArray[] {pBars}); // constant map to set bar color and thickness ConstantMap[] PrecMaps = {new ConstantMap(0.20f, Display.Red), new ConstantMap(0.50f, Display.Green), new ConstantMap(1.0f, Display.Blue), new ConstantMap(01.50f, Display.LineWidth)}; // set reference's data refer_Pre = new ReferenceImpl("refer_Pre" ); refer_Pre.setData( ff_Prec ); // add reference to display, using the constant maps display1.addReference( refer_Pre, PrecMaps); // show display... I hope it works, because I cut and pasted the code above from a more complex application. You can see the resulting display at: http://www.geogr.uni-jena.de/~p6taug/demviewer/more/modv.jpg You could also use a Gridded2D (?) set (actually, and array of those), which is by far simpler (as Bill said, VisAD sahpes are rather complex: some of the credits for code above goes to Bill, anyway; especially the magic parts ;-) hope it has helped clear up a bit. Cheers, Ugo
visad
archives: