/** {@inheritDoc} */ public double calculatePathDelay(final double elevation, final double height) { // limit the height to 5000 m final double h = Math.min(Math.max(0, height), 5000); // limit the elevation to 0 - 180 degree final double ele = Math.min(180d, Math.max(0d, elevation)); // mirror elevation at the right angle of 90 degree final double e = ele > 90d ? 180d - ele : ele; return delayFunction.value(h, e); }
/** * Perform a two-dimensional interpolation * * @param oldx an IDataset containing a 1D array of X-values, sorted in increasing order, * corresponding to the first dimension of <code>oldxy</code> * @param oldy an IDataset containing a 1D array of Y-values, sorted in increasing order, * corresponding to the second dimension of <code>oldxy</code> * @param oldxy an IDataset containing a 2D grid of interpolation points * @param newx an IDataset containing a 1D array of X-values that will be sent to the * interpolating function * @param newy an IDataset containing a 1D array of Y-values that will be sent to the * interpolating function * @param interpolator an instance of {@link * org.apache.commons.math3.analysis.interpolation.BivariateGridInterpolator} * @param output_type an {@link BicubicInterpolationOutput} that will determine how <code>newx * </code> and <code>newy</code> will be interpreted, and therefore whether a 1D or 2D Dataset * will be returned. * @return rank 1 or 2 Dataset, depending on <code>output_type}</code> * @throws NonMonotonicSequenceException * @throws NumberIsTooSmallException */ public static Dataset interpolate( IDataset oldx, IDataset oldy, IDataset oldxy, IDataset newx, IDataset newy, BivariateGridInterpolator interpolator, BicubicInterpolationOutput output_type) throws NonMonotonicSequenceException, NumberIsTooSmallException { // check shapes if (oldx.getRank() != 1) throw new IllegalArgumentException("oldx Shape must be 1D"); if (oldy.getRank() != 1) throw new IllegalArgumentException("oldy Shape must be 1D"); if (oldxy.getRank() != 2) throw new IllegalArgumentException("oldxy Shape must be 2D"); if (oldx.getShape()[0] != oldxy.getShape()[0]) throw new IllegalArgumentException("oldx Shape must match oldxy Shape[0]"); if (oldy.getShape()[0] != oldxy.getShape()[1]) throw new IllegalArgumentException("oldy Shape must match oldxy Shape[1]"); if (newx.getRank() != 1) throw new IllegalArgumentException("newx Shape must be 1D"); if (newy.getRank() != 1) throw new IllegalArgumentException("newx Shape must be 1D"); if (output_type == BicubicInterpolationOutput.ONED && newy.getSize() != newx.getSize()) throw new IllegalArgumentException( "newx and newy Size must be identical when expecting a rank 1 dataset result"); DoubleDataset oldx_dd = (DoubleDataset) DatasetUtils.cast(oldx, Dataset.FLOAT64); DoubleDataset oldy_dd = (DoubleDataset) DatasetUtils.cast(oldy, Dataset.FLOAT64); DoubleDataset oldxy_dd = (DoubleDataset) DatasetUtils.cast(oldxy, Dataset.FLOAT64); // unlike in Interpolation1D, we will not be sorting here, as it just too complicated // the user will be responsible for ensuring the arrays are properly sorted // oldxy_dd needs to be transformed into a double[][] array // this call may throw an exception that needs handling by the calling method BivariateFunction func = interpolator.interpolate( oldx_dd.getData(), oldy_dd.getData(), convertDoubleDataset2DtoPrimitive(oldxy_dd)); Dataset rv = null; if (output_type == BicubicInterpolationOutput.ONED) { rv = DatasetFactory.zeros(new int[] {newx.getSize()}, Dataset.FLOAT64); for (int i = 0; i < newx.getSize(); i++) { double val = 0.0; try { val = func.value(newx.getDouble(i), newy.getDouble(i)); rv.set(val, i); } catch (OutOfRangeException e) { rv.set(0.0, i); } } } else if (output_type == BicubicInterpolationOutput.TWOD) { rv = DatasetFactory.zeros(new int[] {newx.getSize(), newy.getSize()}, Dataset.FLOAT64); for (int i = 0; i < newx.getSize(); i++) { for (int j = 0; j < newy.getSize(); j++) { double val = 0.0; try { val = func.value(newx.getDouble(i), newy.getDouble(j)); rv.set(val, i, j); } catch (OutOfRangeException e) { rv.set(0.0, i, j); } } } } rv.setName(oldxy.getName() + "_interpolated"); return rv; }