/// <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); }