Hauptseite | Liste aller Namensbereiche | Klassenhierarchie | Auflistung der Klassen | Auflistung der Dateien | Elemente eines Namensbereiches | Klassen-Elemente | Datei-Elemente

NRook.h

gehe zur Dokumentation dieser Datei
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 // Generate nrook cells 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 // Allocate the samples list 00037 SphericalHarmonics::TSample<PrecisionType>* samples = new SphericalHarmonics::TSample<PrecisionType>[nb_samples]; 00038 00039 for (int i = 0; i < nb_samples; i++) 00040 { 00041 // Generate uniform random sample 00042 PrecisionType x = (i + drand48<PrecisionType>()) / nb_samples; 00043 PrecisionType y = (cells[i] + drand48<PrecisionType>()) / nb_samples; 00044 00045 // Generate spherical/cartesian co-ordinates 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 }; // namespace SphericalHarmonics 00117 00118 }; // namespace ZFXMath 00119 00120 #endif //_ZFXMATH_INCLUDE_NROOK_H__

Erzeugt am Thu Nov 25 04:02:55 2004 für ZFX-Math Library von doxygen 1.3.8