package jas.hist.util;
import jas.hist.HasScatterPlotData;
import jas.hist.Rebinnable2DHistogramData;
import jas.hist.ScatterEnumeration;
import jas.hist.ScatterPlotSource;
/**
* An adaptor that converts a ScatterPlotSource to a DataSource that implements both
* Rebinnable2DHistogramData and HasScatterPlotData
*/
public class ScatterTwoDAdapter extends ScatterSourceAdapter implements Rebinnable2DHistogramData, HasScatterPlotData
{
public ScatterTwoDAdapter(ScatterPlotSource source)
{
super(source);
}
public double[][][] rebin(int Xbins, double Xmin, double Xmax, int Ybins, double Ymin, double Ymax, boolean wantErrors, boolean hurry, boolean overflow)
{
double[][] hist = new double[Xbins + (overflow?2:0)][Ybins + (overflow?2:0)];
double XbinWidth = (Xmax - Xmin)/Xbins;
double YbinWidth = (Ymax - Ymin)/Ybins;
ScatterEnumeration e = overflow ? source.startEnumeration() : source.startEnumeration(Xmin,Xmax,Ymin,Ymax);
double[] point = new double[2];
while (e.getNextPoint(point))
{
// Note Math.floor returns the largest integer value <= the argument
int Xbin = (int) Math.floor((point[0] - Xmin)/XbinWidth);
int Ybin = (int) Math.floor((point[1] - Ymin)/YbinWidth);
if (Xbin>=0 && Xbin<Xbins && Ybin>=0 && Ybin<Ybins) hist[Xbin][Ybin] += 1;
else if (overflow)
{
if (Xbin < 0 ) Xbin = Xbins;
if (Xbin >Xbins) Xbin = Xbins+1;
if (Ybin < 0 ) Ybin = Ybins;
if (Ybin >Ybins) Ybin = Ybins+1;
hist[Xbin][Ybin] += 1;
}
}
double[][][] result = new double[1][][];
result[0] = hist;
return result;
}
public int getXBins()
{
return 40;
}
public int getYBins()
{
return 40;
}
public boolean isRebinnable()
{
return true;
}
public String[] getXAxisLabels()
{
return null;
}
public String[] getYAxisLabels()
{
return null;
}
public boolean hasScatterPlotData()
{
return true;
}
}