package org.dawnsci.surfacescatter; import java.util.ArrayList; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import uk.ac.diamond.scisoft.analysis.fitting.Fitter; import uk.ac.diamond.scisoft.analysis.fitting.functions.Polynomial; public class InterpolationTracker { public static ArrayList<double[][]> interpolatedTrackerLenPtArray (ArrayList<double[][]> boxes, Dataset xValues ){ int fitPower = 1; Dataset xpts = DatasetFactory.zeros(new int[] {boxes.size()}, Dataset.ARRAYFLOAT64); Dataset ypts = DatasetFactory.zeros(new int[] {boxes.size()}, Dataset.ARRAYFLOAT64); Dataset xlens = DatasetFactory.zeros(new int[] {boxes.size()}, Dataset.ARRAYFLOAT64); Dataset ylens = DatasetFactory.zeros(new int[] {boxes.size()}, Dataset.ARRAYFLOAT64); Dataset xVals = DatasetFactory.zeros(new int[] {boxes.size()}, Dataset.ARRAYFLOAT64); Dataset[] xValsArray = new Dataset[] {xVals}; for(int ty = 0; ty<boxes.size(); ty++){ double[][] consideredBox = boxes.get(ty); xpts.set(consideredBox[1][0], ty); ypts.set(consideredBox[1][1], ty); xlens.set(consideredBox[0][0], ty); ylens.set(consideredBox[0][1], ty); xVals.set(consideredBox[2][1], ty); } ArrayList<double[][]> output =new ArrayList<>(); Polynomial polyFitxpts = Fitter.polyFit(xValsArray, xpts, 1e-30,fitPower); Polynomial polyFitypts = Fitter.polyFit(xValsArray, ypts, 1e-30,fitPower); Polynomial polyFitxlens = Fitter.polyFit(xValsArray, xlens, 1e-30,fitPower); Polynomial polyFitylens = Fitter.polyFit(xValsArray, ylens, 1e-30,fitPower); Dataset calculatedXptsDat = polyFitxpts.calculateValues(xValues); Dataset calculatedYptsDat = polyFitypts.calculateValues(xValues); Dataset calculatedXlenDat = polyFitxlens.calculateValues(xValues); Dataset calculatedYlenDat = polyFitylens.calculateValues(xValues); for(int lj = 0; lj<xValues.getSize(); lj++){ double[][] localOutput = new double[2][]; localOutput[0] = new double[2]; localOutput[1] = new double[2]; localOutput[0][0] = calculatedXlenDat.getDouble(lj); localOutput[0][1] = calculatedYlenDat.getDouble(lj); localOutput[1][0] = calculatedXptsDat.getDouble(lj); localOutput[1][1] = calculatedYptsDat.getDouble(lj); output.add(localOutput); } return output; } }