Hi Mathias,
> I have a dataset with MathType (index) -> (longitude, latitude, altitude,
> temperature, ...) and I want to add a plane in my DisplayImplJ3D
> such that the plane is a rectangle with its vertices lets say in the outer
> borders of the x-y-plane. Therefore I initialize the plane like
>
> RealTupleType domainTupleType = new RealTupleType(RealType.Longitude,
> RealType.Latitude);
> RealType valueRealType = realTypes[2];
> FunctionType functionType = new FunctionType(domainTupleType, valueRealType);
> visad.Set set = new Linear2DSet(domainTupleType, ranges[0][0], ranges[0][1],
> 2, ranges[1][0], ranges[1][1], 2);
> layerField = new FlatField(functionType, set);
> layerField.setSamples(new double[][] { {ranges[2][0], ranges[2][0],
> ranges[2][0], ranges[2][0]} });
> DataReference layerReference = new DataReferenceImpl("layer");
> layerReference.setData(layerField);
>
> where RealType.Longitude is mapped to Display.XAxis and RealType.Latitude is
> mapped to Display.YAxis and double[][] ranges holds the outer
> borders of the x-y-plane. This works very well if the Longitude borders are
> within ]-180, 180[. But if I load a dataset with a point that has
> a Longitude value of -180 then the plane is invisible because the Longitude
> value of -180 mapped to the XAxis is drawn at Longitude = 180
> instead of Longitude = -180. How can I prevent this? Is there a possibility
> to avoid the wrapping of the Longitude-values?
I tried my own test of this with the attached Junk.java program
and did not get the problem you describe.
> I also add three points to handle the plane as a slicer that can make even
> non x-y-plane-parallel slices. I add the points with
> ConstantMap(-/+1, Display.X/YAxis) and they always appear in the outer edges
> of the x-y-plane. This seems not to be influenced by my dataset.
> Is the interpretation of a ConstantMap another than the interpretation of a
> ScalarMap?
This is confusing. You would add points to the display
using DisplayImpl.addReference(), not with the ConstantMap
constructor.
Cheers,
Bill
----------------------------------------------------------
Bill Hibbard, SSEC, 1225 W. Dayton St., Madison, WI 53706
hibbard@xxxxxxxxxxxxxxxxx 608-263-4427 fax: 608-263-6738
http://www.ssec.wisc.edu/~billh/vis.html
// import needed classes
import visad.*;
import visad.java3d.DisplayImplJ3D;
import visad.java2d.DisplayImplJ2D;
import visad.util.VisADSlider;
import visad.data.netcdf.Plain;
import java.rmi.RemoteException;
import java.io.IOException;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Junk {
// type 'java Junk' to run this application
public static void main(String args[])
throws VisADException, RemoteException, IOException {
RealTupleType earth
new RealTupleType(RealType.Longitude, RealType.Latitude);
Linear2DSet region = new Linear2DSet(earth, -180.0, 180.0, 2, -90.0, 90.0,
2);
RealType range = new RealType("range");
FunctionType ftype = new FunctionType(earth, range);
FlatField field = new FlatField(ftype, region);
field.setSamples(new float[][] {{0.0f, 0.5f, 0.5f, 1.0f}});
// create a DataReference for region
final DataReference region_ref = new DataReferenceImpl("region");
// region_ref.setData(region);
region_ref.setData(field);
// create a Display using Java3D
// DisplayImpl display = new DisplayImplJ3D("image display");
// create a Display using Java2D
DisplayImpl display = new DisplayImplJ2D("image display");
// map earth coordinates to display coordinates
display.addMap(new ScalarMap(RealType.Longitude, Display.XAxis));
display.addMap(new ScalarMap(RealType.Latitude, Display.YAxis));
display.addMap(new ScalarMap(range, Display.Green));
GraphicsModeControl mode = display.getGraphicsModeControl();
mode.setScaleEnable(true);
// link the Display to region_ref
display.addReference(region_ref);
// create JFrame (i.e., a window) for display and slider
JFrame frame = new JFrame("Junk VisAD Application");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
// create JPanel in JFrame
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setAlignmentY(JPanel.TOP_ALIGNMENT);
panel.setAlignmentX(JPanel.LEFT_ALIGNMENT);
frame.getContentPane().add(panel);
// add display to JPanel
panel.add(display.getComponent());
// set size of JFrame and make it visible
frame.setSize(500, 500);
frame.setVisible(true);
}
}