Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.
"From: Bill Hibbard " wrote: > > Hi Doug, > > > I have a 3D display with terrain, satellite, lightning,... > > > > 1) My satellite data looks like (lon,lat) --> val, and I'd like it to > > sit near the "bottom" of the box (low on the Z axis). I tried various > > combinations of constant maps to Display.ZAxis and Display.ZAxisOffset > > as arguments to Display.addReference with no luck, it just sits in the > > middle of the box. I don't really want to complicate the data type. I > > would settle for (lon,lat,lev) --> val but I can't get that to render > > the data in any way other than points. Is (lon,lat) --> (val,z) my only > > option? > > ConstantMap(-1.0, Display.ZAxis) should work. Well, that works in point mode, but not in whatever "default" mode I am in. (See sample code below.) Is there some other GraphicsModeControl method I could take advantage of? I did find another kludgy solution: map val to Display.ZAxisOffset and set the range from 0 to some sufficiently large value (>> val). > > > 2) Speaking of points..., the terrain looks pretty cool in point mode, > > but I'd like the satellite as a surface. > > GraphicsModeControl.setPointMode() applies to the entire display. Is > > there a way to display one field in point mode and another not? > > The way to do this is to destroy the topology of the terrain > domain Set by changing its MathType from ((lon, lat) -> alt) > to (index -> (lon, lat, alt)). Something like: > > FlatField terrain = ... > float[][] vals = terrain.getDomainSet().getSamples(); > float[][] alts = terrain.getValues(); > float[][] new_vals = {vals[0], vals[1], alts[0]}; > FunctionType func = (functionType) > MathType.stringToType("(index -> (lon, lat, alt))"); > Integer1DSet set = new Integer1DSet(vals[0].length); > FlatField new_terrain = new FlatField(func, set); > new_terrain.setSamples(new_vals) > I'm actually hoping to be able to switch between point/surface/contour modes via the GUI. I suppose having the same data represented in different ways and swapping out references will do. Thanks, Doug -- *----------------------------------------------------------------------* | Doug Lindholm, Software Engineer | E-mail: lind@xxxxxxxx | | Research Applications Program | Phone: 303-497-8374 | | National Center for Atmospheric Research | | | P.O. Box 3000 | There's no place | | Boulder, Colorado 80307-3000 | like $HOME | *----------------------------------------------------------------------* ------ import visad.*; import visad.java3d.DisplayImplJ3D; import java.awt.*; import javax.swing.*; public class VerySimple { public static void main(String args[]) throws Exception { double[][] data = {{100.0,200.0,300.0,400.0}}; Set set = new Linear2DSet(RealTupleType.SpatialEarth2DTuple, -114.0, -112.0, 2, 39.0, 41.0, 2); RealType type = new RealType("sat",null,null); FunctionType ftype = new FunctionType(RealTupleType.SpatialEarth2DTuple ,type); FieldImpl field = new FlatField(ftype, set); field.setSamples(data); DataReference ref = new DataReferenceImpl("sat"); ref.setData(field); DisplayImpl display = new DisplayImplJ3D("display"); GraphicsModeControl mode = display.getGraphicsModeControl(); //mode.setPointMode(true); // ConstantMap works mode.setPointMode(false);// ConstantMap does not work display.addMap(new ScalarMap(RealType.Longitude, Display.XAxis)); display.addMap(new ScalarMap(RealType.Latitude, Display.YAxis)); display.addMap(new ScalarMap(type, Display.Cyan)); ConstantMap[] cm = new ConstantMap[1]; cm[0] = new ConstantMap(-1.0,Display.ZAxis); display.addMap(new ConstantMap(5.0,Display.PointSize)); display.addReference(ref, cm); JFrame frame = new JFrame("VerySimple VisAD Application"); frame.getContentPane().add(display.getComponent()); frame.setSize(400, 400); frame.setVisible(true); } }
visad
archives: