00001
00002
00003
00004
00005
00006
00007
00008
00009
#ifndef _ZFXMATH_INCLUDE_NROOK_H_
00010
#define _ZFXMATH_INCLUDE_NROOK_H_
00011
00012
namespace ZFXMath
00013 {
00014
00015 namespace SphericalHarmonics
00016 {
00017
00027
template<
class PrecisionType>
00028 SphericalHarmonics::TSample<PrecisionType>*
GenerateSamples(
const int nb_samples )
00029 {
00030
00031
int* cells =
new int[nb_samples];
00032
for (
int i = 0; i < nb_samples; i++)
00033 cells[i] = i;
00034 MultiStageNRooks<PrecisionType>(nb_samples, cells);
00035
00036
00037
SphericalHarmonics::TSample<PrecisionType>* samples =
new SphericalHarmonics::TSample<PrecisionType>[nb_samples];
00038
00039
for (
int i = 0; i < nb_samples; i++)
00040 {
00041
00042 PrecisionType x = (i + drand48<PrecisionType>()) / nb_samples;
00043 PrecisionType y = (cells[i] + drand48<PrecisionType>()) / nb_samples;
00044
00045
00046 samples[i] = SphericalHarmonics::TSample<PrecisionType>( PrecisionType( 2 * acos(sqrt(1 - x)) ), PrecisionType( 2 *
PI * y ) );
00047 }
00048
00049
delete [] cells;
00050
00051
return samples;
00052 }
00053
00054
template<
class PrecisionType>
00055 PrecisionType drand48()
00056 {
00057
return ((PrecisionType)rand() / RAND_MAX);
00058 }
00059
00060
int lrand48()
00061 {
00062
return (rand());
00063 }
00064
00065
template<
class PrecisionType>
00066
void MultiStageNRooks(
const int size,
int* cells)
00067 {
00068
if (size == 1)
00069
return;
00070
00071
int size1 = size >> 1;
00072
int size2 = size >> 1;
00073
00074
if (size & 1)
00075 {
00076
if (drand48<PrecisionType>() > 0.5)
00077 size1++;
00078
else
00079 size2++;
00080 }
00081
00082
int* upper_cells =
new int[size1];
00083
int* lower_cells =
new int[size2];
00084
00085
for (
int i = 0, j = 0; i < size - 1; i += 2, j++)
00086 {
00087
if (lrand48() & 1)
00088 {
00089 upper_cells[j] = cells[i];
00090 lower_cells[j] = cells[i + 1];
00091 }
00092
else
00093 {
00094 upper_cells[j] = cells[i + 1];
00095 lower_cells[j] = cells[i];
00096 }
00097 }
00098
00099
if (size1 != size2)
00100 {
00101
if (size1 > size2)
00102 upper_cells[j] = cells[i];
00103
else
00104 lower_cells[j] = cells[i];
00105 }
00106
00107 MultiStageNRooks<PrecisionType>(size1, upper_cells);
00108 memcpy(cells, upper_cells, size1 *
sizeof(
int));
00109
delete [] upper_cells;
00110
00111 MultiStageNRooks<PrecisionType>(size2, lower_cells);
00112 memcpy(cells + size1, lower_cells, size2 *
sizeof(
int));
00113
delete [] lower_cells;
00114 }
00115
00116 };
00117
00118 };
00119
00120
#endif //_ZFXMATH_INCLUDE_NROOK_H__