import java.awt.Color;
import java.awt.Component;

import javax.swing.JFrame;

import visad.DataReferenceImpl;
import visad.Display;
import visad.FlatField;
import visad.FunctionType;
import visad.GraphicsModeControl;
import visad.Linear2DSet;
import visad.RealTupleType;
import visad.RealType;
import visad.ScalarMap;
import visad.java3d.DisplayImplJ3D;
import visad.java3d.DisplayRendererJ3D;

public class VisadTest {

	public static void main(String[] args) {

		try {
			double xMin, xMax, yMin, yMax;
			int xRes, yRes;

			/*
			xMin = 507.99438; xMax = 508.01105; yMin = 10.9;  yMax = 19.9; xRes = 1000; yRes = 1000; // Clean
			xMin = 15; xMax = 15.001; yMin = 0;  yMax = 100; xRes = 1000; yRes = 10; // Clean
			xMin = 20; xMax = 20.0019; yMin = 0;  yMax = 100; xRes = 1000; yRes = 10; // Shows a few lines
			xMin = 16; xMax = 16.0018; yMin = 0;  yMax = 100; xRes = 1000; yRes = 10; // Shows lines
			xMin = 15.9995; xMax = 16; yMin = 0;  yMax = 100; xRes = 1000; yRes = 10; // Lines
			xMin = 150.00001; xMax = 150.00003; yMin = 0;  yMax = 100; xRes = 1000; yRes = 10; // Completely black
			*/
			
			xMin = 10000; xMax = 10007; yMin = 0;  yMax = 100; xRes = 10000; yRes = 10;  // Funny pattern  
			
			
			RealType xType = RealType.getRealType("x");
			RealType yType = RealType.getRealType("y");
			RealType zType = RealType.getRealType("z");
			RealTupleType domainTuple = new RealTupleType(xType, yType);
			FunctionType func = new FunctionType(domainTuple, zType);

			ScalarMap xMap = new ScalarMap(xType, Display.XAxis);
			ScalarMap yMap = new ScalarMap(yType, Display.YAxis);
			ScalarMap zMap = new ScalarMap(zType, Display.ZAxis);
			ScalarMap colorMap = new ScalarMap(zType, Display.RGB);

			DisplayImplJ3D display = new DisplayImplJ3D("display");

			display.addMap(xMap);
			display.addMap(yMap);
			display.addMap(zMap);
			display.addMap(colorMap);

			xMap.setRange(xMin, xMax);
			
			Linear2DSet domainSet = new Linear2DSet(domainTuple, xMin, xMax,
					xRes, yMin, yMax, yRes);

			double[][] zValues = new double[1][xRes * yRes];

			FlatField flatField = new FlatField(func, domainSet);
			flatField.setSamples(zValues, false);
			DataReferenceImpl dataReference = new DataReferenceImpl("data");
			dataReference.setData(flatField);
			display.addReference(dataReference);

			DisplayRendererJ3D dRenderer = (DisplayRendererJ3D) display
					.getDisplayRenderer();
			dRenderer.setForegroundColor(Color.black);
			dRenderer.setBackgroundColor(Color.white);
			dRenderer.setBoxOn(true);

			GraphicsModeControl graphicsModeControl = display
					.getGraphicsModeControl();
			graphicsModeControl.setScaleEnable(true);
			graphicsModeControl.setTextureEnable(false);

			JFrame newFrame = new JFrame();
			Component component = display.getComponent();
			newFrame.getContentPane().add(component);
			newFrame.pack();
			newFrame.setVisible(true);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
