rt300@34: // rt300@34: // hilbert.cpp rt300@34: // sonicZoom rt300@34: // rt300@34: // Created by Robert Tubb on 04/04/2013. rt300@34: // rt300@34: // rt300@34: rt300@34: #include "hilbert.h" rt300@34: Hilbert hilbert; rt300@34: rt300@34: //-------------------------------------------------------------------- rt300@34: unsigned int rotl(unsigned int value, int shift, int digits) { rt300@34: unsigned int ones = (1 << digits) - 1; rt300@34: if(shift >= digits) rt300@34: shift -= digits; rt300@34: rt300@34: unsigned int out = (value << shift) | (value >> (digits - shift)); rt300@34: return out & ones; rt300@34: } rt300@34: //-------------------------------------------------------------------- rt300@34: unsigned int rotr(unsigned int value, int shift, int digits) { rt300@34: int ones = (1 << digits) - 1; rt300@34: // can only handle -digits to 2*digits-1 rt300@34: if(shift >= digits) shift = shift - digits; rt300@34: if(shift < 0) shift = digits + shift; rt300@34: unsigned int out = (value >> shift) | (value << (digits - shift)); rt300@34: return out & ones; rt300@34: } rt300@34: //-------------------------------------------------------------------- rt300@34: unsigned int bin2dec(vector binary){ rt300@34: // takes in a vector of booleans. we assume that the leftmost bool (highest index) is the MSB rt300@34: unsigned int dec = 0; rt300@34: int i,pwr; rt300@34: int N = binary.size(); rt300@34: rt300@34: for (i = 0; i dec2bin(unsigned int number, unsigned int size){ rt300@34: vector bin; rt300@34: int i, pwr; rt300@34: for(i=0;i= (1 << size)){ rt300@34: cout << " bad size for Hilbert::dec2bin" << "\n"; rt300@34: return bin; rt300@34: } rt300@34: for(i=0;i vcode){ rt300@34: vector::iterator bit; rt300@34: rt300@34: for(bit=vcode.begin(); bit!=vcode.end() ; bit++){ rt300@34: rt300@34: cout << *bit; rt300@34: } rt300@34: cout << "\n"; rt300@34: rt300@34: } rt300@34: //-------------------------------------------------------------------- rt300@34: void Hilbert::init(int aN, int aP){ rt300@34: N = aN; rt300@34: P = aP; rt300@34: codeLength = (int)pow(2.0,P); rt300@34: makeCode(); rt300@34: makeRotationRules(); rt300@34: rt300@34: rt300@34: // whole process unit test(?) rt300@34: rt300@34: unsigned long long inCoord = 888999777; rt300@34: vector checkParam; rt300@34: checkParam = calculateParamsFromIndex(inCoord); rt300@34: cout << "PARAMS: "; rt300@34: for(int i=0; i()); rt300@34: rt300@34: for(int j=0; j Hilbert::calculateParamsFromIndex(unsigned long long index){ rt300@34: // set %set start and direction of biggest cube rt300@34: unsigned int i; rt300@34: unsigned int mask = (1 << P) - 1; rt300@34: unsigned int entryPoint = 0; rt300@34: int direction = P - 1, directionInv = P-1; rt300@34: unsigned int vertex=0, subindex=0, newe=0, newd=0, entryPointInv = 0; rt300@34: rt300@34: unsigned int pbin[N]; rt300@34: rt300@34: vector params; rt300@34: for(i=0; i= 0; blev--){ rt300@34: // get next highest bits of index rt300@34: rt300@34: subindex = index >> blev*P; rt300@34: subindex = mask & subindex; rt300@34: rt300@34: cout << "subindex: " << subindex << "\n"; rt300@34: // which vertex corresponds to this index? rt300@34: if(subindex < theGrayCode.size()) vertex = theGrayCodeD[subindex]; rt300@34: rt300@34: cout << "rotated: " << vertex << "\n"; rt300@34: rt300@34: rt300@34: //% inverse rotate this T_e,d rt300@34: entryPointInv = rotr(entryPoint, direction+1,P); rt300@34: directionInv = (P - direction - 2); rt300@34: vertex = rotate(vertex,entryPointInv,directionInv); rt300@34: rt300@34: cout << "vertex: " << vertex << "\n"; rt300@34: rt300@34: //% build up bits of params rt300@34: rt300@34: for(int j=0;j> P-j-1) & 1)*(1< params){ rt300@34: // set %set start and direction of biggest cube rt300@34: rt300@34: long long h = 0; rt300@34: rt300@34: unsigned int i; rt300@34: unsigned int entryPoint = 0; rt300@34: int direction = P - 1; rt300@34: unsigned int vertex=0, subindex=0, newe=0, newd=0; rt300@34: rt300@34: vector subindices; rt300@34: rt300@34: rt300@34: // for loop thru bit levels rt300@34: i=0; rt300@34: for(int blev = N-1; blev >= 0; blev--){ rt300@34: //% get next highest bit of param rt300@34: rt300@34: vector vertexb; rt300@34: for(i=0;i