Class NLinearInterpolator<T extends NumericType<T>>

    • Field Detail

      • code

        protected int code
        Index into weights array.

        To visit the pixels that contribute to an interpolated value, we move in a (binary-reflected) Gray code pattern, such that only one dimension of the target position is modified per move.

        This index is the corresponding gray code bit pattern which will select the correct corresponding weight.

        See http://en.wikipedia.org/ wiki/Gray_code

      • weights

        protected final double[] weights
        Weights for each pixel of the 2x2x...x2 hypercube of pixels participating in the interpolation.

        Indices into this array are arranged in the standard iteration order (as provided by IntervalIndexer.positionToIndex(int[], int[])). Element 0 refers to position (0,0,...,0), element 1 refers to position (1,0,...,0), element 2 refers to position (0,1,...,0), etc.

      • accumulator

        protected final T extends NumericType<T> accumulator
    • Constructor Detail

      • NLinearInterpolator

        protected NLinearInterpolator​(RandomAccessible<T> randomAccessible,
                                      T type)
      • NLinearInterpolator

        protected NLinearInterpolator​(RandomAccessible<T> randomAccessible)
    • Method Detail

      • fillWeights

        protected void fillWeights()
        Fill the weights array.

        Let w_d denote the fraction of a pixel at which the sample position p_d lies from the floored position pf_d in dimension d. That is, the value at pf_d contributes with (1 - w_d) to the sampled value; the value at ( pf_d + 1 ) contributes with w_d.

        At every pixel, the total weight results from multiplying the weights of all dimensions for that pixel. That is, the "top-left" contributing pixel (position floored in all dimensions) gets assigned weight (1-w_0)(1-w_1)...(1-w_n).

        We work through the weights array starting from the highest dimension. For the highest dimension, the first half of the weights contain the factor (1 - w_n) because this first half corresponds to floored pixel positions in the highest dimension. The second half contain the factor w_n. In this first step, the first weight of the first half gets assigned (1 - w_n). The first element of the second half gets assigned w_n

        From their, we work recursively down to dimension 0. That is, each half of weights is again split recursively into two partitions. The first element of the second partitions is the first element of the half multiplied with (w_d). The first element of the first partitions is multiplied with (1 - w_d).

        When we have reached dimension 0, all weights will have a value assigned.

      • get

        public T get()
        Get the interpolated value at the current position.

        To visit the pixels that contribute to an interpolated value, we move in a (binary-reflected) Gray code pattern, such that only one dimension of the target position is modified per move.

        See http://en.wikipedia.org/ wiki/Gray_code

        Specified by:
        get in interface Sampler<T extends NumericType<T>>
      • getType

        public T getType()
        Description copied from interface: Typed
        Get an instance of T.

        It should not be assumed that the returned T instance is an independent copy. In particular, repeated calls to getType() may return the same instance.

        Specified by:
        getType in interface Sampler<T extends NumericType<T>>
        Specified by:
        getType in interface Typed<T extends NumericType<T>>
        Returns:
        an instance of T
      • graycodeFwdRecursive

        private void graycodeFwdRecursive​(int dimension)
      • graycodeBckRecursive

        private void graycodeBckRecursive​(int dimension)
      • accumulate

        private void accumulate()
        multiply current target value with current weight and add to accumulator.
      • printWeights

        private void printWeights()
      • printCode

        private void printCode()