package org.matthiaszimmermann.location.egm96; /** * @see <a href="http://mrl.nyu.edu/~perlin/cubic/Cubic_java.html">Java Cubic</a> * @author Ken Perlin * */ class Cubic { private static final double[][] BEZIER = { // Bezier basis matrix {-1 , 3 , -3 , 1 }, { 3 , -6 , 3 , 0 }, {-3 , 3 , 0 , 0 }, { 1 , 0 , 0 , 0 } }; private final double[][] C = new double[4][4]; // bicubic coefficients matrix Cubic(double[][] G) { double[][] t = new double[4][4]; for (int i = 0; i < 4 ; i++) // T = G MT for (int j = 0 ; j < 4 ; j++) for (int k = 0 ; k < 4 ; k++) t[i][j] += G[i][k] * Cubic.BEZIER[j][k]; for (int i = 0 ; i < 4 ; i++) // C = M T for (int j = 0 ; j < 4 ; j++) for (int k = 0 ; k < 4 ; k++) C[i][j] += Cubic.BEZIER[i][k] * t[k][j]; } private final double[] C3 = C[0]; private final double[] C2 = C[1]; private final double[] C1 = C[2]; private final double[] C0 = C[3]; double eval(double u, double v) { return u * (u * (u * (v * (v * (v * C3[0] + C3[1]) + C3[2]) + C3[3]) + (v * (v * (v * C2[0] + C2[1]) + C2[2]) + C2[3])) + (v * (v * (v * C1[0] + C1[1]) + C1[2]) + C1[3])) + (v * (v * (v * C0[0] + C0[1]) + C0[2]) + C0[3]); } }