public static void getListInEvenlySpacedGrid(
      final int sceneRasterWidth,
      final int sceneRasterHeight,
      final int sourceGridWidth,
      final int sourceGridHeight,
      final int[] x,
      final int[] y,
      final double[] sourcePointList,
      final int targetGridWidth,
      final int targetGridHeight,
      final double subSamplingX,
      final double subSamplingY,
      final float[] targetPointList) {

    if (sourcePointList.length != sourceGridWidth * sourceGridHeight) {
      throw new IllegalArgumentException(
          "Original tie point array size does not match 'sourceGridWidth' x 'sourceGridHeight'");
    }

    if (targetPointList.length != targetGridWidth * targetGridHeight) {
      throw new IllegalArgumentException(
          "Target tie point array size does not match 'targetGridWidth' x 'targetGridHeight'");
    }

    int k = 0;
    for (int r = 0; r < targetGridHeight; r++) {

      double newY = r * subSamplingY;
      if (newY > sceneRasterHeight - 1) {
        newY = sceneRasterHeight - 1;
      }
      double oldY0 = 0, oldY1 = 0;
      int j0 = 0, j1 = 0;
      for (int rr = 1; rr < sourceGridHeight; rr++) {
        j0 = rr - 1;
        j1 = rr;
        oldY0 = y[j0 * sourceGridWidth];
        oldY1 = y[j1 * sourceGridWidth];
        if (oldY1 > newY) {
          break;
        }
      }

      final double wj = (newY - oldY0) / (oldY1 - oldY0);

      for (int c = 0; c < targetGridWidth; c++) {

        double newX = c * subSamplingX;
        if (newX > sceneRasterWidth - 1) {
          newX = sceneRasterWidth - 1;
        }
        double oldX0 = 0, oldX1 = 0;
        int i0 = 0, i1 = 0;
        for (int cc = 1; cc < sourceGridWidth; cc++) {
          i0 = cc - 1;
          i1 = cc;
          oldX0 = x[i0];
          oldX1 = x[i1];
          if (oldX1 > newX) {
            break;
          }
        }
        final double wi = (newX - oldX0) / (oldX1 - oldX0);

        targetPointList[k++] =
            (float)
                (MathUtils.interpolate2D(
                    wi,
                    wj,
                    sourcePointList[i0 + j0 * sourceGridWidth],
                    sourcePointList[i1 + j0 * sourceGridWidth],
                    sourcePointList[i0 + j1 * sourceGridWidth],
                    sourcePointList[i1 + j1 * sourceGridWidth]));
      }
    }
  }