//
// Spline2D.java
//
package visad.paoloa.spline;
// import needed classes
import visad.*;
import visad.java3d.DisplayImplJ3D;
import visad.java3d.DirectManipulationRendererJ3D;
import visad.util.VisADSlider;
import java.rmi.RemoteException;
import java.io.IOException;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class Spline2D {
boolean toggle = true;
Real nothing = new Real(-1000.0);
DataReference lambda_ref;
DataReference noise_ref;
DataReference noise_button_ref;
DataReference spline_ref;
DataReference spline_fieldRef;
DataReference true_fieldRef;
DataReference gcv_fieldRef;
int n_samples;
float[] domain_valuesx;
float[] domain_valuesy;
double[] range_values;
double[] return_values;
double[] true_values;
double[] range_values_pass;
double[] true_values_pass;
double[] s_values;
double[] x_values;
double[] y_values;
double[] noise;
double[][] f_range = new double[1][];
double[] spline_range;
double[] values = new double[3];
double val;
double noise_fac;
double last_noise_fac;
int mode;
int dim1 = 11;
int dim2 = 11;
FlatField spline_field;
FlatField gcv_field;
FlatField true_field;
Set domainSet;
FunctionType f_type;
DataReference[] range_refs;
RealTuple[] tuples;
Real[] reals;
ConstantMap[][] cmaps;
public static void main(String args[])
throws VisADException, RemoteException, IOException
{
System.loadLibrary("Spline2D");
Spline2D spline = new Spline2D("file");
}
public Spline2D(String filename)
throws VisADException, RemoteException, IOException
{
lambda_ref = new DataReferenceImpl("lambda_ref");
noise_ref = new DataReferenceImpl("noise_ref");
noise_button_ref = new DataReferenceImpl("noise_button_ref");
spline_ref = new DataReferenceImpl("spline_ref");
//- get data
// Paolo
dim1 = 11;
dim2 = 11;
int pp = 0;
n_samples = dim1*dim2;
true_values = new double[ n_samples ];
range_values = new double[ n_samples ];
return_values = new double[ n_samples ];
s_values = new double[ n_samples ];
x_values = new double[ n_samples ];
y_values = new double[ n_samples ];
noise = new double[ n_samples ];
domain_valuesx = new float[ n_samples ];
domain_valuesy = new float[ n_samples ];
spline_range = new double[ n_samples ];
range_refs = new DataReferenceImpl[ n_samples ];
tuples = new RealTuple[ n_samples ];
reals = new Real[ n_samples ];
cmaps = new ConstantMap[ n_samples ][];
double x_c = 0.0;
double y_c = 0.0;
noise_fac = 0.1;
last_noise_fac = noise_fac;
// Paolo
pp = 0;
for ( int ii = 0; ii < dim1; ii++ ) {
y_c=0.0;
for ( int jj = 0; jj < dim2; jj++ ) {
noise[pp]=(2*Math.random()-1);
true_values[pp]=x_c*x_c-y_c*y_c;
s_values[pp]=y_c*y_c;
range_values[pp]=true_values[pp]+noise_fac*noise[pp];
y_values[pp]=y_c;
x_values[pp]=x_c;
y_c += .1;
pp += 1;
}
x_c += .1;
}
for ( int ii = 0; ii < n_samples; ii++ ) {
domain_valuesx[ii] = (float) (ii % dim1);
domain_valuesy[ii] = (float) (ii / dim1);
values[0] = (double) domain_valuesx[ii];
values[1] = (double) domain_valuesy[ii];
values[2] = (double) range_values[ii];
tuples[ii] = new RealTuple( RealTupleType.SpatialCartesian3DTuple, values );
reals[ii] = new Real( RealType.ZAxis, values[2] );
range_refs[ii] = new DataReferenceImpl("rangeRef_"+ii);
//range_refs[ii].setData( tuples[ii] );
range_refs[ii].setData( reals[ii] );
}
float[][] samples = new float[2][n_samples];
samples[0] = domain_valuesx;
samples[1] = domain_valuesy;
RealTupleType domain_tuple =
new RealTupleType(RealType.XAxis, RealType.YAxis);
domainSet = new Gridded2DSet( domain_tuple, samples, dim1, dim2 );
f_type = new FunctionType( domain_tuple, RealType.ZAxis );
spline_field = new FlatField( f_type, domainSet );
gcv_field = new FlatField( f_type, domainSet );
true_field = new FlatField( f_type, domainSet );
double[][] d_array = new double[1][];
d_array[0] = true_values;
true_field.setSamples(d_array);
JFrame frame = new JFrame("Spline2D VisAD Application");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.setAlignmentY(JPanel.TOP_ALIGNMENT);
panel.setAlignmentX(JPanel.LEFT_ALIGNMENT);
SplinePanel spline_panel = new SplinePanel();
// add image-spectrum interfaces to the JFrame
panel.add(spline_panel);
frame.getContentPane().add(spline_panel);
frame.setSize(500, 500);
frame.setVisible(true);
}
class SplinePanel extends JPanel
implements ActionListener
{
JPanel panel_a, panel_b, panel_c, panel_d;
Border etchedBorder5 =
new CompoundBorder(new EtchedBorder(),
new EmptyBorder(5, 5, 5, 5));
SplinePanel() throws VisADException, RemoteException
{
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setAlignmentY(JPanel.TOP_ALIGNMENT);
setAlignmentX(JPanel.LEFT_ALIGNMENT);
panel_a = new JPanel();
panel_a.setLayout(new BoxLayout(panel_a, BoxLayout.X_AXIS));
panel_a.setAlignmentY(JPanel.TOP_ALIGNMENT);
panel_a.setAlignmentX(JPanel.LEFT_ALIGNMENT);
DisplayImpl display1 = null;
display1 = new DisplayImplJ3D("image display");
GraphicsModeControl mode1 = display1.getGraphicsModeControl();
mode1.setScaleEnable(true);
panel_a.add( display1.getComponent() );
panel_a.setBorder(etchedBorder5);
add( panel_a );
panel_b = new JPanel();
panel_b.setLayout(new BoxLayout(panel_b, BoxLayout.X_AXIS));
panel_b.setAlignmentY(JPanel.TOP_ALIGNMENT);
panel_b.setAlignmentX(JPanel.LEFT_ALIGNMENT);
panel_c = new JPanel();
panel_c.setLayout(new BoxLayout(panel_c, BoxLayout.Y_AXIS));
panel_c.setAlignmentY(JPanel.TOP_ALIGNMENT);
panel_c.setAlignmentX(JPanel.LEFT_ALIGNMENT);
VisADSlider noise_slider =
new VisADSlider(noise_ref, 0f, 1f, .1f, RealType.Generic, "noise");
panel_c.add(noise_slider);
VisADSlider lambda_slider =
new VisADSlider(lambda_ref, -10f, 0f, .5f, RealType.Generic, "lambda");
panel_c.add(lambda_slider);
panel_b.add( panel_c );
panel_d = new JPanel();
panel_d.setLayout(new BoxLayout(panel_d, BoxLayout.Y_AXIS));
panel_d.setAlignmentY(JPanel.TOP_ALIGNMENT);
panel_d.setAlignmentX(JPanel.LEFT_ALIGNMENT);
JButton noise_button = new JButton("noise");
noise_button.addActionListener(this);
noise_button.setActionCommand("noise");
panel_d.add(noise_button);
JButton GCV_button = new JButton("GCV");
GCV_button.addActionListener(this);
GCV_button.setActionCommand("GCV");
panel_d.add(GCV_button);
JButton toggle_button = new JButton("toggle");
toggle_button.addActionListener(this);
toggle_button.setActionCommand("toggle");
panel_d.add(toggle_button);
panel_b.add(panel_d);
panel_b.setBorder(etchedBorder5);
add( panel_b );
ConstantMap[] blue =
{
new ConstantMap(0.0, Display.Red),
new ConstantMap(0.0, Display.Green),
new ConstantMap(1.0, Display.Blue),
};
ConstantMap[] green =
{
new ConstantMap(0.0, Display.Red),
new ConstantMap(1.0, Display.Green),
new ConstantMap(0.0, Display.Blue),
};
ConstantMap[] cmaps = new ConstantMap[6];
cmaps[0] = new ConstantMap(1.0, Display.Red);
cmaps[1] = new ConstantMap(0.0, Display.Green);
cmaps[2] = new ConstantMap(0.0, Display.Blue);
cmaps[3] = new ConstantMap(3.0, Display.PointSize);
ScalarMap map_x = new ScalarMap( RealType.XAxis, Display.XAxis);
map_x.setRange( 0., (double) (dim1 - 1));
ScalarMap map_y = new ScalarMap( RealType.YAxis, Display.YAxis);
map_y.setRange( 0., (double) (dim2 - 1));
ScalarMap map_z = new ScalarMap( RealType.ZAxis, Display.ZAxis);
display1.addMap( map_x );
display1.addMap( map_y );
display1.addMap( map_z );
double display_valuex;
double display_valuey;
double[] scale_offsetx = new double[2];
double[] scale_offsety = new double[2];
double[] data_range = new double[2];
double[] display = new double[2];
map_x.getScale( scale_offsetx, data_range, display );
map_y.getScale( scale_offsety, data_range, display );
for ( int ii = 0; ii < n_samples; ii++ ) {
display_valuex =
((double)domain_valuesx[ii])*scale_offsetx[0] + scale_offsetx[1];
display_valuey =
((double)domain_valuesy[ii])*scale_offsety[0] + scale_offsety[1];
cmaps[4] = new ConstantMap( display_valuex,
Display.XAxis );
cmaps[5] = new ConstantMap( display_valuey,
Display.YAxis );
display1.addReferences(new DirectManipulationRendererJ3D(),
range_refs[ii], cmaps );
}
spline_fieldRef = new DataReferenceImpl("spline_fieldRef");
gcv_fieldRef = new DataReferenceImpl("gcv_fieldRef");
true_fieldRef = new DataReferenceImpl("true_fieldRef");
spline_fieldRef.setData( spline_field );
gcv_fieldRef.setData( gcv_field );
true_fieldRef.setData( true_field );
// display1.addReference(spline_fieldRef);
display1.addReference(gcv_fieldRef, green);
display1.addReference(true_fieldRef, blue);
/*
CellImpl lambda_cell = new CellImpl() {
public void doAction() throws VisADException, RemoteException {
for ( int ii = 0; ii < n_samples; ii++ ) {
range_values[ii] = ((Real)range_refs[ii].getData()).getValue();
}
val = ((Real)lambda_ref.getData()).getValue();
val = Math.pow(10.0, val);
mode = 1;
getspline_c( range_values, spline_range, val, mode);
f_range[0] = spline_range;
spline_field.setSamples( f_range );
}
};
lambda_cell.addReference( lambda_ref );
*/
CellImpl noise_cell = new CellImpl() {
double[] noise_a = new double[ n_samples ];
public void doAction() throws VisADException, RemoteException {
double noise_fac = ((Real)noise_ref.getData()).getValue();
for ( int ii = 0; ii < n_samples; ii++ ) {
range_values[ii] = ((Real)range_refs[ii].getData()).getValue();
if ( last_noise_fac == 0 ) {
noise_a[ii] = noise[ii];
}
else {
noise_a[ii] = (range_values[ii] - true_values[ii])/last_noise_fac;
}
range_values[ii] = true_values[ii] + noise_fac*noise_a[ii];
range_refs[ii].setData( new Real(RealType.ZAxis, range_values[ii]));
}
int[] dimen = {dim1, dim2};
System.arraycopy(range_values, 0, return_values, 0, n_samples);
tpspline_c(x_values, y_values, s_values, true_values,
return_values, dimen);
f_range[0] = return_values;
gcv_field.setSamples( f_range );
last_noise_fac = noise_fac;
}
};
noise_cell.addReference( noise_button_ref );
}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("noise")) {
try {
noise_button_ref.setData(new Real(0.0));
}
catch (VisADException exc) { }
catch (RemoteException exc) { }
}
if (cmd.equals("GCV")) {
try {
for ( int ii = 0; ii < n_samples; ii++ ) {
range_values[ii] = ((Real)range_refs[ii].getData()).getValue();
}
val = ((Real)lambda_ref.getData()).getValue();
val = Math.pow(10.0, val);
mode = 2;
// getspline_c( range_values, spline_range, val, mode);
int[] dimen = {dim1, dim2};
System.arraycopy(range_values, 0, return_values, 0, n_samples);
tpspline_c(x_values, y_values, s_values, true_values,
return_values, dimen);
f_range[0] = return_values;
gcv_field.setSamples( f_range );
}
catch (VisADException exc) { }
catch (RemoteException exc) { }
}
if (cmd.equals("toggle")) {
try {
if (toggle) {
toggle = false;
true_fieldRef.setData( nothing );
}
else {
toggle = true;
true_fieldRef.setData( true_field );
}
}
catch (VisADException exc) { }
catch (RemoteException exc) { }
}
}
} // end class SplinePanel
// public native void getspline_c( double[] y, double[] y_s0, double val, int mode );
public native void tpspline_c( double[] x_array, double[] y_array,
double[] s_array, double[] ytrue,
double[] y, int[] dimen );
}