The spica renderer
halton.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef _SPICA_HALTON_H_
6 #define _SPICA_HALTON_H_
7 
8 #include <memory>
9 #include "core/cobject.h"
10 #include "core/sampler.h"
11 #include "core/random.h"
12 
13 namespace spica {
14 
18 class SPICA_EXPORTS Halton : public Sampler {
19 public:
25  explicit Halton(int ns = 200, bool isPermute = true,
26  uint32_t seed = 0u);
27  explicit Halton(RenderParams &params);
28 
29  ~Halton();
30 
31  double get1D() override;
32 
33  bool startNextSample() override;
34 
35  std::unique_ptr<Sampler> clone(unsigned int seed = 0) const override;
36 
37 private:
38  double radicalInverse(int n, int base, const int* p) const;
39 
40  static const int nPrimes_ = 1000;
41  int nSamples_;
42  int sampleIndex_;
43  int nUsedSamples_;
44  bool isPermute_;
45  Random rng_;
46  const std::unique_ptr<int[]> bases_;
47  const std::unique_ptr<int[]> permute_;
48  const std::unique_ptr<double[]> samples_;
49 
50 };
51 
52 SPICA_EXPORT_PLUGIN(Halton, "Halton sampler");
53 
54 } // namespace spica
55 
56 #endif // _SPICA_HALTON_H_
Random number generator with Mersenne twister.
Definition: random.h:17
Random sampler class.
Definition: sampler.h:24
Definition: renderparams.h:27
Randomized Halton sampler for quasi Monte Carlo.
Definition: halton.h:18