- Timestamp:
- 09/04/08 15:00:42 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/SampleGenerator.cpp
r2902 r2903 1 #include "SampleGenerator.h" 1 2 #include "common.h" 2 #include "SampleGenerator.h"3 3 4 4 5 5 using namespace std; 6 using namespace CHCDemoEngine; 6 7 7 8 HaltonSequence SphericalSampleGenerator::sHalton; 8 9 HaltonSequence PoissonDiscSampleGenerator::sHalton; 9 HaltonSequence GaussianSampleGenerator::sHalton;10 10 HaltonSequence PseudoRandomGenerator::sHalton; 11 11 … … 32 32 const float f_reduction = 0.9f; 33 33 34 static HaltonSequence halton;34 //static HaltonSequence halton; 35 35 float r[2]; 36 36 37 37 // generates poisson distribution on disc 38 float minDist = 2.0f / sqrt((float)mNumSamples);38 float minDist = 2.0f * mRadius / sqrt((float)mNumSamples); 39 39 40 40 //cout << "minDist before= " << minDist << endl; … … 51 51 ++ totalTries; 52 52 53 halton.GetNext(2, r); 53 r[0] = RandomValue(0, mRadius); 54 r[1] = RandomValue(0, mRadius); 55 //halton.GetNext(2, r); 54 56 55 57 const float rx = r[0] * 2.0f - 1.0f; … … 57 59 58 60 // check if in disk, else exit early 59 if (rx * rx + ry * ry > 1)61 if (rx * rx + ry * ry > mRadius * mRadius) 60 62 continue; 61 63 … … 86 88 } 87 89 } 88 89 //cout << "sample: " << samples[i].x << " " << i << " " << samples[i].y << " r: " << sqrt(samples[i].x * samples[i].x + samples[i].y * samples[i].y) << " tries: " << totalTries << endl;90 }91 92 //cout << "minDist after= " << minDist << endl;93 }94 95 96 97 GaussianSampleGenerator::GaussianSampleGenerator(int numSamples, float radius):98 SampleGenerator(numSamples, radius)99 {}100 101 102 void GaussianSampleGenerator::Generate(float *samples) const103 {104 float r[2];105 106 const float sigma = mRadius;107 108 Sample2 *s = (Sample2 *)samples;109 110 const float p0 = 1.0f / (sigma * sqrt(2.0f * M_PI));111 const float p1 = 1.0f / (sigma * sqrt(2.0f * M_PI));112 113 for (int i = 0; i < mNumSamples; ++ i)114 {115 sHalton.GetNext(2, r);116 117 float exp_x = -(r[0] * r[0]) / (2.0f * sigma * sigma);118 float exp_y = -(r[1] * r[1]) / (2.0f * sigma * sigma);119 120 s[i].x = p0 * pow(M_E, exp_x);121 s[i].y = p1 * pow(M_E, exp_y);122 90 } 123 91 … … 133 101 void PseudoRandomGenerator::Generate(float *samples) const 134 102 { 135 sHalton.GetNext(2 * mNumSamples, samples); 103 Sample2 *s = (Sample2 *)samples; 104 105 int numSamples = 0; 106 107 while (numSamples < mNumSamples) 108 { 109 const float rx = RandomValue(-mRadius, +mRadius); 110 const float ry = RandomValue(-mRadius, +mRadius); 111 112 // check if in disk, else exit early 113 if (rx * rx + ry * ry > mRadius * mRadius) 114 continue; 115 116 s[numSamples].x = rx; 117 s[numSamples].y = ry; 118 119 ++ numSamples; 120 } 136 121 } 137 122 … … 146 131 float r[2]; 147 132 Sample3 *s = (Sample3 *)samples; 148 /*149 // idea: use poisson distribution to generate samples150 133 151 PoissonDiscSampleGenerator poisson(mNumSamples, 1.0f);152 Sample2 *pSamples = new Sample2[mNumSamples];153 poisson.Generate((float *)pSamples);154 */155 134 for (int i = 0; i < mNumSamples; ++ i) 156 135 { 157 sHalton.GetNext(2, r); 136 r[0] = RandomValue(0, 1); 137 r[1] = RandomValue(0, 1); 138 //sHalton.GetNext(2, r); 158 139 //r[0] = pSamples[i].x; r[1] = pSamples[i].y; 159 140
Note: See TracChangeset
for help on using the changeset viewer.