#ifndef __SAMPLEGENERATOR_H #define __SAMPLEGENERATOR_H #include "Halton.h" /** Class that generates samples on a circle */ struct Sample2 { Sample2() {} Sample2(float _x, float _y): x(_x), y(_y) {} float x; float y; }; struct Sample3 { Sample3() {} Sample3(float _x, float _y, float _z): x(_x), y(_y), z(_z) {} float x; float y; float z; }; /** Class generating random samples on a disc or in a sphere, respectively. */ class SampleGenerator { public: SampleGenerator(int numSamples, float radius); virtual void Generate(float *samples) const = 0; protected: SampleGenerator() {}; int mNumSamples; float mRadius; }; class RandomSampleGenerator2D: public SampleGenerator { public: RandomSampleGenerator2D(int numSamples, float radius); virtual void Generate(float *samples) const; protected: HaltonSequence &sHalton; }; /** This class generates random samples on a disc respecting the poisson disc condition (all samples at least distance d apart) according to some d related to the number of samples. */ class PoissonDiscSampleGenerator2D: public SampleGenerator { public: PoissonDiscSampleGenerator2D(int numSamples, float radius); virtual void Generate(float *samples) const; protected: HaltonSequence &sHalton; }; /** This class generates random samples on a disc that have the property that their density decreases quadratically with the distance */ class QuadraticDiscSampleGenerator2D: public PoissonDiscSampleGenerator2D { public: QuadraticDiscSampleGenerator2D(int numSamples, float radius); virtual void Generate(float *samples) const; protected: //PoissonDiscSampleGenerator2D &mPoisson; //HaltonSequence &sHalton; }; /** This class generates random spherical samples. */ class SphericalSampleGenerator3D: public SampleGenerator { public: SphericalSampleGenerator3D(int numSamples, float radius); virtual void Generate(float *samples) const; }; #endif