2017-03-29 42 views
0

我想將由兩個雙值(x,y)表示的座標對轉換爲希爾伯特值。我發現下面的實現(from this link):如何從雙座標計算希爾伯特指數?

/***************************************************************** 
* hilbert_c2i 
* 
* Convert coordinates of a point on a Hilbert curve to its index. 
* Inputs: 
* nDims:  Number of coordinates. 
* nBits:  Number of bits/coordinate. 
* coord:  Array of n nBits-bit coordinates. 
* Outputs: 
* index:  Output index value. nDims*nBits bits. 
* Assumptions: 
*  nDims*nBits <= (sizeof bitmask_t) * (bits_per_byte) 
*/ 
bitmask_t 
hilbert_c2i(unsigned nDims, unsigned nBits, bitmask_t const coord[]) 
{ 
    if (nDims > 1) 
    { 
     unsigned const nDimsBits = nDims*nBits; 
     bitmask_t index; 
     unsigned d; 
     bitmask_t coords = 0; 
     for (d = nDims; d--;) 
    { 
     coords <<= nBits; 
     coords |= coord[d]; 
    } 

     if (nBits > 1) 
    { 
     halfmask_t const ndOnes = ones(halfmask_t,nDims); 
     halfmask_t const nd1Ones= ndOnes >> 1; /* for adjust_rotation */ 
     unsigned b = nDimsBits; 
     unsigned rotation = 0; 
     halfmask_t flipBit = 0; 
     bitmask_t const nthbits = ones(bitmask_t,nDimsBits)/ndOnes; 
     coords = bitTranspose(nDims, nBits, coords); 
     coords ^= coords >> nDims; 
     index = 0; 
     do 
     { 
      halfmask_t bits = (coords >> (b-=nDims)) & ndOnes; 
      bits = rotateRight(flipBit^bits, rotation, nDims); 
      index <<= nDims; 
      index |= bits; 
      flipBit = (halfmask_t)1 << rotation; 
      adjust_rotation(rotation,nDims,bits); 
     } while (b); 
     index ^= nthbits >> 1; 
    } 
     else 
    index = coords; 
     for (d = 1; d < nDimsBits; d *= 2) 
    index ^= index >> d; 
     return index; 
    } 
    else 
    return coord[0]; 
} 

然而,這是一個整數值作爲輸入。如何適應我的雙重價值?

+2

如果體系結構使用'double'的[IEEE 754 Binary64](https://en.wikipedia.org/wiki/IEEE_floating_point#Basic_and_interchange_formats)類型,並且'double'的字節順序與' uint64_t'整型, - 例如,這種情況就是這種情況x86-64體系結構(64位Intel/AMD) - ,並且所有的double都有一個有限的值,那麼你可以將'double'的存儲複製到'uint64_t'中,然後減去2⁶3= 9,223,372,036,854,775,808,並將結果用作無符號的64位整數。該映射保留所有有限值的順序,並且是可逆的(返回到「double」)。 –

+0

@NominalAnimal謝謝你的建議。因此,我會做這個建議的轉換,並調用函數沒有任何改變?我的雙重價值觀也可能是負面的。另外,我也需要獲得雙倍的回報。 –

回答

0

對於任何人遊蕩,wikipedia page有一個非常快速的方法來計算希爾伯特1D座標。我在多個程序中使用了Hilbert(我在研究Delaunay Triangulation,我們需要它來加速這個過程),我可以向你保證它是最好的。