/** * Compute polynomial coefficients for quadratic interpolation. For each tie point record, 3 coefficients * are computed. The 3 coefficients are saved in a row in _quadraticInterpCoeffs as {a0, a1, a2}. The * quadratic polynomial is given as f(x) = a0 + a1*x + a2*x^2. */ private synchronized void computeQuadraticInterpCoeffs() { if (quadraticInterpCoeffs != null) return; final int numCoeff = 3; final int width = tpg.getGridWidth(); final int height = tpg.getGridHeight(); final double[][] sampleIndexArray = new double[width][numCoeff]; for (int c = 0; c < width; c++) { final int x = (int) (tpg.getOffsetX() + c * tpg.getSubSamplingX()); sampleIndexArray[c][0] = 1.0; sampleIndexArray[c][1] = (double) (x); sampleIndexArray[c][2] = (double) (x * x); } final Matrix A = new Matrix(sampleIndexArray); quadraticInterpCoeffs = new double[height][numCoeff]; final double[] tiePointArray = new double[width]; for (int r = 0; r < height; r++) { final int rwidth = r * width; for (int c = 0; c < width; c++) { tiePointArray[c] = (double) (tiePoints[rwidth + c]); } final Matrix b = new Matrix(tiePointArray, width); final Matrix x = A.solve(b); quadraticInterpCoeffs[r] = x.getColumnPackedCopy(); } }
addEntry("Grid width:", String.valueOf(grid.getGridWidth()), "tie points"); addEntry("Grid height:", String.valueOf(grid.getGridHeight()), "tie points"); addEntry("Offset X:", String.valueOf(grid.getOffsetX()), "pixels"); addEntry("Offset Y:", String.valueOf(grid.getOffsetY()), "pixels"); addEntry("Sub-sampling X:", String.valueOf(grid.getSubSamplingX()), "pixels");