/* Convert 1-dimensional random variable to N-dimensional */ void SDmultiSamp(double t[], int n, double randX) { unsigned nBits; double scale; bitmask_t ndx, coord[MS_MAXDIM]; if (n <= 0) /* check corner cases */ return; if (randX < 0) randX = 0; else if (randX >= 1.) randX = 0.999999999999999; if (n == 1) { t[0] = randX; return; } while (n > MS_MAXDIM) /* punt for higher dimensions */ t[--n] = rand()*(1./(RAND_MAX+.5)); nBits = (8*sizeof(bitmask_t) - 1) / n; ndx = randX * (double)((bitmask_t)1 << (nBits*n)); /* get coordinate on Hilbert curve */ hilbert_i2c(n, nBits, ndx, coord); /* convert back to [0,1) range */ scale = 1. / (double)((bitmask_t)1 << nBits); while (n--) t[n] = scale * ((double)coord[n] + rand()*(1./(RAND_MAX+.5))); }
void compute_PHK_to_Cartesian(int PHK_bit_size, PHK_t key, int *i_x, int *i_y, int *i_z) { hikey_t basecoord[3]; hilbert_i2c(3, (hikey_t)PHK_bit_size, (hikey_t)key, basecoord); (*i_x) = (int)basecoord[0]; (*i_y) = (int)basecoord[1]; (*i_z) = (int)basecoord[2]; }