package edu.stanford.rsl.conrad.utils;
/**
* Class to perform linear interpolation along an arbitrary mesh given the function values at each mesh point.
*
* @author akmaier
*
*/
public class LinearInterpolatingDoubleArray {
private double [] mesh;
private double [] values;
private double min;
private double max;
public LinearInterpolatingDoubleArray(){
}
/**
* Constructs the interpolating Array. Requires two double arrays.
* @param mesh the mesh with the gridding of the values
* @param values the values at each mesh point.
*/
public LinearInterpolatingDoubleArray(double [] mesh, double [] values){
setMesh(mesh);
setValues(values);
}
protected void setValues(double[] values) {
this.values = values;
}
public double [] getValues() {
return values;
}
protected void setMesh(double [] mesh){
this.mesh = mesh;
// Compute the minimum and the maximum of mesh.
double [] minmax = DoubleArrayUtil.minAndMaxOfArray(mesh);
min = minmax[0];
max = minmax[1];
}
public double [] getMesh(){
return mesh;
}
/**
* Interpolated the value at meshPoint from the given array.
* @param meshPoint the value to interpolate at
* @return the interpolated value
*/
public double getValue(double meshPoint){
if ((meshPoint < min)||(meshPoint > max)){
throw new RuntimeException("Cannot extrapolate outside mesh: " + meshPoint + " Range: [ " + min + ", " + max + " ]");
}
int lowerIndex = 0;
for (int i = 1; i < mesh.length; i++){
if (mesh[i] > meshPoint){
lowerIndex = i - 1;
break;
}
}
// distance between mesh points
double gridDist = mesh[lowerIndex+1] - mesh[lowerIndex];
// distance between values
double valueDist = values[lowerIndex+1] - values[lowerIndex];
// distance to left grid point
double distLeft = meshPoint - mesh[lowerIndex];
// interpolated value;
double revan = values[lowerIndex] + ((distLeft) * (valueDist/gridDist));
return revan;
}
public int size() {
return mesh.length;
}
public void setMap(double [] mesh, double [] values) {
setMesh(mesh);
setValues(values);
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/