Esempio n. 1
0
        /// <summary>
        /// Given a normalized coordinate in multiple dimensions, calculate its derived key for given level
        /// </summary>
        private long?DerivedValueFor(long[] normalizedValues, int level)
        {
            AssertValidLevel(level);
            long derivedValue = 0;
            long mask         = 1L << (_maxLevel - 1);

            // The starting curve depends on the dimensions
            CurveRule currentCurve = RootCurve();

            for (int i = 1; i <= _maxLevel; i++)
            {
                int bitIndex = _maxLevel - i;
                int npoint   = 0;

                foreach (long val in normalizedValues)
                {
                    npoint = npoint << 1 | ( int )((val & mask) >> bitIndex);
                }

                int derivedIndex = currentCurve.IndexForNPoint(npoint);
                derivedValue = (derivedValue << _nbrDim) | derivedIndex;
                mask         = mask >> 1;
                currentCurve = currentCurve.ChildAt(derivedIndex);
            }

            if (level < _maxLevel)
            {
                derivedValue = derivedValue << (_nbrDim * _maxLevel - level);
            }
            return(derivedValue);
        }