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.
Hello Arvind, sorry for taking so long to get back to you, but this week has been a bit busy... Please find attached "BarGraph.java" which shows you one way to achieve what you want. This approach uses volume rendering, which you can test with visad/examples/Test61.java in your visad release. Please note that you'll have to rotate the display in order to see the 3D bars. Rotate the display so that the utility-axis is pointing up, and you will see the volume-rendering. Hope this helps, Jim. --- Jim Koutsovasilis Bureau of Meteorology, Australia jimk@xxxxxxxxxx Arvind Lakshmikumar wrote:
Hi Jim, Thanks for the post..What you suggested would create the maps. But how would I draw 3D bars for values on the Z-axis. Say I have flow1=20, flow2=30, utility =0.6. I want to represent utility as a bar of height 0.6. Thanks a lot, Arvind //////////////////////////////////////////////////////////////////////////// Arvind Lakshmikumar Research Scientist Research Scholar Intelligent Automation, Inc Robotics Institute, CMU 7519 Standish Place 5000 Forbes Avenue Rockville MD Pittsburgh PA email : kla@xxxxxxxxxx Phone: 443-538-4555 (Cell) 301-540-4396 (Home) Linux is like a Teepee No Windows, No Gates, Only APACHE Inside! ////////////////////////////////////////////////////////////////////////////
// BarGraph.java // Java import java.rmi.RemoteException; import javax.swing.JFrame; // VisAD import visad.ConstantMap; import visad.DataReferenceImpl; import visad.DelaunayCustom; import visad.Display; import visad.Field; import visad.FlatField; import visad.FunctionType; import visad.GraphicsModeControl; import visad.Linear3DSet; import visad.Real; import visad.RealTupleType; import visad.RealType; import visad.ScalarMap; import visad.Set; import visad.UnionSet; import visad.VisADException; import visad.java3d.DisplayImplJ3D; /** * Demo program to show a 3D bar graph. * * MathType: (flow1, flow2)-->(utility) * * The height of the bars is controlled by "utility". * The colour of the the bars is also controlled by "utility". * * You'll need to rotate the display so that you can see * the volume rendering. */ public final class BarGraph { private final RealType flow1Type; private final RealType flow2Type; private final RealType utilityType; private final RealType dummyType; /** * Constructor. */ public BarGraph() throws VisADException, RemoteException { final DisplayImplJ3D display = new DisplayImplJ3D("display"); display.getDisplayRenderer().setBoxOn(false); final GraphicsModeControl gmc display.getGraphicsModeControl(); gmc.setScaleEnable(true); gmc.setProjectionPolicy(DisplayImplJ3D.PARALLEL_PROJECTION); flow1Type = RealType.getRealType("flow1"); flow2Type = RealType.getRealType("flow2"); utilityType = RealType.getRealType("utility"); dummyType = RealType.getRealType("dummy"); final ScalarMap xMap new ScalarMap(flow1Type, Display.XAxis); final ScalarMap yMap new ScalarMap(flow2Type, Display.YAxis); final ScalarMap zMap new ScalarMap(utilityType, Display.ZAxis); final ScalarMap colourMap new ScalarMap(dummyType, Display.RGB); display.addMap(xMap); display.addMap(yMap); display.addMap(zMap); display.addMap(colourMap); // flow1 values are in the range (5, 40) xMap.setRange(5, 40); // flow2 values are in the range (5, 40) yMap.setRange(5, 40); // intensity values are in the range (0, 1) zMap.setRange(0, 1); final int numSamples = 10; for (int i = 0; i < numSamples; ++i) { // Pick a flow1 value in the range (5, 35) final float flow1 = (float) ((Math.random() * 35) + 5); // Pick a flow2 value in the range (5, 35) final float flow2 = (float) ((Math.random() * 35) + 5); // Pick a utility value in the range (0, 1) final float utility = (float) Math.random(); final Field field = create3DBar(flow1, flow2, utility); final DataReferenceImpl dataRef = new DataReferenceImpl("data_ref"); dataRef.setData(field); display.addReference(dataRef); } // for (i<numSamples) final JFrame frame = new JFrame("Bar Graph"); frame.getContentPane().add(display.getComponent()); frame.setSize(640, 480); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } // BarGraph.BarGraph() /** * Creates a 3D bar at the given position ("flow1", "flow2") * with a height of "utility". Note that the depth and * width of the bar is 1. */ private Field create3DBar(final float flow1, final float flow2, final float utility) throws VisADException, RemoteException { final RealTupleType domainType = new RealTupleType( new RealType[] {flow1Type, flow2Type, utilityType}); final int numValues = 2; final float width = 1.0f; final float depth = width; final Set domainSet = new Linear3DSet(domainType, flow1, flow1 + width, numValues, flow2, flow2 + depth, numValues, 0, utility, numValues); final FunctionType functionType = new FunctionType( domainType, dummyType); final Field field = new FlatField(functionType, domainSet); final int numPoints = numValues * numValues * numValues; final int numRangeComponents = 1; final float[][] values new float[numRangeComponents][numPoints]; for (int i = 0; i < numPoints; ++i) { values[0][i] = utility; } field.setSamples(values); return field; } // BarGraph.create3DBar() /** * Runs the program. * * @param args no arguments are expected. */ public static final void main(String[] args) throws VisADException, RemoteException { new BarGraph(); } // BarGraph.main() } // class BarGraph
visad
archives: