package contouring;

import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @author Marc A. Suchard
 */
public class ContourWithSynder extends KernelDensityEstimator2D {

	public ContourWithSynder(final double[] x, final double[] y,
			final double[] h, final int n, final double[] lims) {
		super(x, y, h, n, lims);
	}

	public ContourWithSynder(final double[] x, final double[] y) {
		super(x, y);
	}

	public ContourWithSynder(final double[] x, final double[] y, int n) {
		super(x, y, n);
	}

	public ContourPath[] getContourPaths(double hpdValue) {

		if (contourPaths == null) {

			double thresholdDensity = findLevelCorrespondingToMass(hpdValue);

			SnyderContour contourPlot = new SnyderContour(getXGrid().length,
					getYGrid().length);
			contourPlot.setDeltas(getXGrid()[1] - getXGrid()[0], getYGrid()[1]
					- getYGrid()[0]);
			contourPlot.setOffsets(getXGrid()[0], getYGrid()[0]);

			List<LinkedList<Point2D>> allPaths = new ArrayList<LinkedList<Point2D>>();
			contourPlot.ContourKernel(getKDE(), allPaths, thresholdDensity);

			contourPaths = new ContourPath[allPaths.size()];
			for (int i = 0; i < allPaths.size(); i++) {
				LinkedList<Point2D> path = allPaths.get(i);
				int len = path.size();
				double[] x = new double[len];
				double[] y = new double[len];
				for (int j = 0; j < len; j++) {
					Point2D pt = path.get(j);
					x[j] = pt.getX();
					y[j] = pt.getY();
				}
				contourPaths[i] = new ContourPath(new ContourAttrib(
						thresholdDensity), 1, x, y);
			}
		}

		return contourPaths;
	}

	private ContourPath[] contourPaths = null;

}
