Hi Ugo, Steve and others,
okay, it is surely better to use double, so I changed all values in my
example programm to double, see attached file.
There is just one line I am confused about:
// Get the Set samples to facilitate the calculations
//float[][] set_samples = domain_set.getSamples( true );
It is not possible to change that to double, but I am not using
set_samples somewhere else anyway, what is this method doing? I can't
remember, why I put it there in the first place.
The results still exists: I am loosing points. I changed to the current
visad.jar, which did not change anything at all.
I put 4*5 = 20 points in and the result is 3*3 = 9 in the display.
You can see a screenhsot of this at my homepage:
http://www-ipf.bau-verm.uni-karlsruhe.de/Personen/hilbring/welcome.html
Thanks for your help in advance.
oooooooooooooooooooooooooooooooooooooooooooooooo
Desiree Hilbring
Institut fuer Photogrammetrie und Fernerkundung
Universitaet Karlsruhe, Germany
email: hilbring@xxxxxxxxxxxxxxxxxxxx
# 0721 6083676
oooooooooooooooooooooooooooooooooooooooooooooooo
On Sat, 7 Jul 2001, Ugo Taddei wrote:
>
> Hi all,
>
> Steve Emmerson wrote:
> >
> > Desiree,
> >
> > I think you might be having problems with the resolution of floating-point
> > values in Java. Differences in the coordinate values are very close to the
> > resolution of the Java "float" primitive type.
>
> Sorry about my answer. Just got Steve's mail this morning, after I had
> sent my answer (that is, my "guess").
>
> (...)
>
> >
> > Because the float values are being transferred to a double array,
> > there's no reason that I can see not to specify the float values as
> > double to begin with.
>
> Adding to that: Either use a Gridded2DSet with floats, or
> Gridded2DDoubleSet with doubles, but not Gridded2DDoubleSet with floats.
> >
> > Regards,
> > Steve Emmerson <http://www.unidata.ucar.edu>
>
> Cheers,
>
> Ugo
>
import visad.*;
import visad.java2d.DisplayImplJ2D;
import java.rmi.RemoteException;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import visad.java3d.DisplayImplJ3D;
/*
Note:
- alternative use of a Linear2DSet
- common heightNaN values "interpolates" domain set -> weird!
- call GraphicsModeControl.setPolygonMode(1); to draw mesh
*/
public class DGMKleinDouble{
// Declare variables
// The domain quantities longitude and latitude
// and the dependent quantities altitude, temperature
private RealType eastValues,northValues;
private RealType heightValues;
// Two Tuples: one to pack longitude and latitude together, as the domain
// and the other for the range (altitude, temperature)
private RealTupleType domain_tuple;
// The function (domain_tuple -> range_tuple )
private FunctionType func_en_h;
// Our Data values for the domain are represented by the Set
private Set domain_set;
// The Data class FlatField
private FlatField vals_ff;
// The DataReference from data to display
private DataReferenceImpl data_ref;
// The 2D display, and its the maps
private DisplayImpl display;
private ScalarMap eastMap, northMap, heightMap;
public DGMKleinDouble(String []args)
throws RemoteException, VisADException {
double[] eastNaN =
{3479991.5 ,3479991.5 ,3479991.5 ,3479991.5 ,3479991.5 ,
3479992.5 ,3479992.5 ,3479992.5 ,3479992.5 ,3479992.5 ,
3479993.5 ,3479993.5 ,3479993.5 ,3479993.5 ,3479993.5 ,
3479994.5 ,3479994.5 ,3479994.5 ,3479994.5 ,3479994.5 };
double[] northNaN =
{5417829.5 ,5417830.5 ,5417831.5 ,5417832.5 ,5417833.5 ,
5417829.5 ,5417830.5 ,5417831.5 ,5417832.5 ,5417833.5 ,
5417829.5 ,5417830.5 ,5417831.5 ,5417832.5 ,5417833.5 ,
5417829.5 ,5417830.5 ,5417831.5 ,5417832.5 ,5417833.5 };
double[] heightNaN = {245.00,200.0,245.0,200.0,245.0,
245.00,200.0,245.0,200.0,245.0,
245.00 ,200.0 ,245.00 ,200.0 ,245.0 ,
245.00 ,200.0 ,245.0 ,200.0 ,245.0 };
/*
double[] heightNaN = {245.65f,200.0f,200.0f,200.0f,200.0f,
245.65f,200.0f,200.0f,200.0f,200.0f,
245.68f,245.66f,200.0f,200.0f,200.0f,
245.64f,245.64f,200.0f,200.0f,200.0f};
*/
int nCols = 4;
int nRows = 5;
double[][] coords = new double[2][nCols*nRows];
for (int i=0;i<(nCols*nRows);i++) {
coords[0][i]=eastNaN[i];
coords[1][i]=northNaN[i];
}
// Create the quantities
// Use RealType(String name);
eastValues = new RealType("eastValues");
northValues = new RealType("northValues");
domain_tuple = new RealTupleType(eastValues,northValues);
heightValues = new RealType("heightValues");
// Create a FunctionType (domain_tuple -> range_tuple )
// Use FunctionType(MathType domain, MathType range)
func_en_h = new FunctionType(domain_tuple, heightValues);
// UT
//domain_set = new Gridded2DDoubleSet(domain_tuple,coords,nRows,nCols);
domain_set = new Linear2DSet(domain_tuple,1,5,5,1,4,4);
// Get the Set samples to facilitate the calculations
//double[][] set_samples = domain_set.getSamples( true );
//float[][] set_samples = domain_set.getSamples( true );
// We create another array, with the same number of elements of
// altitude and temperature, but organized as
double[][] flat_samples = new double[1][nCols*nRows];
// ...and then we fill our 'flat' array with the generated values
// by looping over NCOLS and NROWS
// specifiy height
int i=0;
for(int c = 0; c < nCols; c++){
for(int r = 0; r < nRows; r++){
// UT
flat_samples[0][c*nRows+r] = c*nRows+r;
//flat_samples[0][c*nRows+r] = i++;
//flat_samples[0][c*nRows+r] = heightNaN[c*nRows+r];
}
}
/*
for(int c = 0; c < NCOLS; c++)
for(int r = 0; r < NROWS; r++){
flat_samples[0][c*NROWS+r] = heightNaN[c*NROWS+r];
//System.out.println("height "+height[c*NROWS+r]);
}
*/
// Create a FlatField
// Use FlatField(FunctionType type, Set domain_set)
vals_ff = new FlatField( func_en_h, domain_set);
// ...and put the values above into it
// Note the argument false, meaning that the array won't be copied
vals_ff.setSamples( flat_samples , false );
// Create Display and its maps
// A 2D display
display = new DisplayImplJ3D("display1");
// Create the ScalarMaps: latitude to XAxis, longitude to YAxis and
// altitude to RGB and temperature to IsoContour
// Use ScalarMap(ScalarType scalar, DisplayRealType display_scalar)
eastMap = new ScalarMap( eastValues, Display.YAxis );
northMap = new ScalarMap( northValues, Display.XAxis );
heightMap = new ScalarMap(heightValues,Display.ZAxis);
// Add maps to display
display.addMap( eastMap );
display.addMap( northMap );
// UT
display.addMap( heightMap );
// UT
display.addMap( new ScalarMap(heightValues,Display.RGB) );
/*
eastMap.setRange(-1.0, 1.0);
northMap.setRange(-1.0, 1.0);
heightMap.setRange(-1.0, 1.0);
*/
//eastMap.setRange(3532000,3533000);
//northMap.setRange(5379000,5380000);
//heightMap.setRange(600,700);
//heightMap.setRange(200,300);
//heightMap.setRange(-1.0,1.0);
// Create a data reference and set the FlatField as our data
data_ref = new DataReferenceImpl("data_ref");
data_ref.setData( vals_ff );
// Add reference to display
display.addReference( data_ref );
// UT
GraphicsModeControl dispGMC = (GraphicsModeControl)
display.getGraphicsModeControl();
//dispGMC.setScaleEnable(true);
dispGMC.setPolygonMode(1);
// Create application window and add display to window
JFrame jframe = new JFrame("VisAD Tutorial example DGMKleinDouble");
jframe.getContentPane().add(display.getComponent());
// Set window size and make it visible
jframe.setSize(300, 300);
jframe.setVisible(true);
}
public static void main(String[] args)
throws RemoteException, VisADException
{
new DGMKleinDouble(args);
}
} //end of Visad Tutorial Program 3_09