public GeneralizedDistanceTransform2D(
            Range rangeX, Range rangeY, Size gridSize)
        {
            if (rangeX.Outside || rangeY.Outside)
            {
                throw new ArgumentException("Outside ranges are not allowed.");
            }

            this.RangeX   = rangeX;
            this.RangeY   = rangeY;
            this.GridSize = gridSize;

            this.values      = new double[this.GridSize.Width, this.GridSize.Height];
            this.bestIndices = new Tuple <int, int> [this.GridSize.Width, this.GridSize.Height];
            this.timeStamps  = new int[this.GridSize.Width, this.GridSize.Height];

            this.transformsForFixedGridX = new GeneralizedDistanceTransform1D[this.GridSize.Width];
            for (int x = 0; x < this.GridSize.Width; ++x)
            {
                this.transformsForFixedGridX[x] = new GeneralizedDistanceTransform1D(rangeY, this.GridSize.Height);
            }

            this.transformsForFixedGridY     = new GeneralizedDistanceTransform1D[this.GridSize.Height];
            this.usedTransformsForFixedGridY = new GeneralizedDistanceTransform1D[this.GridSize.Height];
            for (int y = 0; y < this.GridSize.Height; ++y)
            {
                transformsForFixedGridY[y] = new GeneralizedDistanceTransform1D(rangeX, this.GridSize.Width);
            }

            this.infiniteTransformX = new GeneralizedDistanceTransform1D(rangeX, this.GridSize.Width);
            this.infiniteTransformX.Compute(1, x => 1e+20);
        }
        public GeneralizedDistanceTransform2D(
            Range rangeX, Range rangeY, Size gridSize)
        {
            if (rangeX.Outside || rangeY.Outside)
                throw new ArgumentException("Outside ranges are not allowed.");

            this.RangeX = rangeX;
            this.RangeY = rangeY;
            this.GridSize = gridSize;

            this.values = new double[this.GridSize.Width, this.GridSize.Height];
            this.bestIndices = new Tuple<int, int>[this.GridSize.Width, this.GridSize.Height];
            this.timeStamps = new int[this.GridSize.Width, this.GridSize.Height];

            this.transformsForFixedGridX = new GeneralizedDistanceTransform1D[this.GridSize.Width];
            for (int x = 0; x < this.GridSize.Width; ++x)
                this.transformsForFixedGridX[x] = new GeneralizedDistanceTransform1D(rangeY, this.GridSize.Height);
            
            this.transformsForFixedGridY = new GeneralizedDistanceTransform1D[this.GridSize.Height];
            this.usedTransformsForFixedGridY = new GeneralizedDistanceTransform1D[this.GridSize.Height];
            for (int y = 0; y < this.GridSize.Height; ++y)
                transformsForFixedGridY[y] = new GeneralizedDistanceTransform1D(rangeX, this.GridSize.Width);

            this.infiniteTransformX = new GeneralizedDistanceTransform1D(rangeX, this.GridSize.Width);
            this.infiniteTransformX.Compute(1, x => 1e+20);
        }