#ifndef __HALTON_H #define __HALTON_H class Halton2 { float _invBases[2]; float _prev[2]; float halton(float baseRec, float prev) const { float r = 1 - prev - 1e-10; if (baseRec < r) return prev + baseRec; float h = baseRec; float hh; do { hh = h; h *= baseRec; } while (h >= r); return prev + hh + h - 1; } public: void Reset() { _prev[0] =_prev[1] = 0; } Halton2() { _invBases[0] = 1./2; _invBases[1] = 1./3; Reset(); } void GetNext(float &a, float &b) { a = halton(_invBases[0], _prev[0]); b = halton(_invBases[1], _prev[1]); _prev[0] = a; _prev[1] = b; } }; extern Halton2 halton2; #endif