2022-07-06 21:11:32 +02:00
|
|
|
|
//========= Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
|
|
|
//
|
|
|
|
|
// Purpose:
|
|
|
|
|
//
|
|
|
|
|
//=====================================================================================//
|
|
|
|
|
|
|
|
|
|
#include "core/stdafx.h"
|
|
|
|
|
#include "mathlib/halton.h"
|
|
|
|
|
|
|
|
|
|
// NOTE: This has to be the last file included!
|
|
|
|
|
//#include "tier0/memdbgon.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HaltonSequenceGenerator_t::HaltonSequenceGenerator_t(int b)
|
|
|
|
|
{
|
|
|
|
|
base = b;
|
|
|
|
|
fbase = (float)b;
|
|
|
|
|
seed = 1;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-02 17:02:04 +02:00
|
|
|
|
float HaltonSequenceGenerator_t::GetElement(int /*elem*/)
|
2022-07-06 21:11:32 +02:00
|
|
|
|
{
|
|
|
|
|
int tmpseed = seed;
|
2022-08-14 18:35:01 +02:00
|
|
|
|
float ret = 0.0f;
|
|
|
|
|
float base_inv = 1.0f / fbase;
|
2022-07-06 21:11:32 +02:00
|
|
|
|
while (tmpseed)
|
|
|
|
|
{
|
|
|
|
|
int dig = tmpseed % base;
|
|
|
|
|
ret += ((float)dig) * base_inv;
|
|
|
|
|
base_inv /= fbase;
|
|
|
|
|
tmpseed /= base;
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int InsideOut(int nTotal, int nCounter)
|
|
|
|
|
{
|
|
|
|
|
int b = 0;
|
|
|
|
|
for (int m = nTotal, k = 1; k < nTotal; k <<= 1)
|
|
|
|
|
{
|
|
|
|
|
if (nCounter << 1 >= m)
|
|
|
|
|
{
|
|
|
|
|
b += k;
|
|
|
|
|
nCounter -= (m + 1) >> 1;
|
|
|
|
|
m >>= 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m = (m + 1) >> 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Assert((b >= 0) && (b < nTotal));
|
|
|
|
|
return b;
|
|
|
|
|
}
|