18 #ifndef PIC_POINT_SAMPLERS_SAMPLER_RANDOM_HPP 19 #define PIC_POINT_SAMPLERS_SAMPLER_RANDOM_HPP 28 #include "../base.hpp" 29 #include "../image.hpp" 30 #include "../util/math.hpp" 31 #include "../util/point_samplers.hpp" 33 #include "../point_samplers/sampler_monte_carlo.hpp" 34 #include "../point_samplers/sampler_dart_throwing.hpp" 35 #include "../point_samplers/sampler_bridson.hpp" 42 template <
unsigned int N>
97 void wrap(
float alpha);
119 void getSampleAt(
int level,
int i,
int &x,
int &y);
126 void Write(std::string name,
int level);
142 for(
int i = 0; i < p2Ds->levelsR.size(); i++) {
143 std::string str = nameOut;
144 std::stringstream sstr;
146 str = str + sstr.str() +
".pfm";
160 for(
int i = 1; i <= 5; i++) {
163 printf(
"Samples expected: %d \t Real Samples: %d\n", (
window * 2)*c,
165 std::string str =
"test_poisson_sampler_";
166 std::stringstream sstr;
168 str = str + sstr.str() +
".pfm";
178 m =
new std::mt19937(seed);
179 update(type, window, nSamples, nLevels);
187 printf(
"cutRescale: not cuts.\n");
192 float cutValue = float(window[cutDim]) / float(window[0]);
195 printf(
"CutSize: %f\n", cutValue);
198 std::vector<float> tmpCutSamples;
199 std::vector<int> tmpCutLevels;
201 int prevCutSamples = 0;
203 for(
unsigned int i = 0; i < levels.size(); i++) {
209 start = levels[i - 1];
214 for(
int j = start; j < end; j += N) {
216 if(fabsf(samples[j + cutDim]) <= cutValue) {
218 samples[j + cutDim] /= cutValue;
220 for(
unsigned int k = 0; k < N; k++) {
221 tmpCutSamples.push_back(samples[j + k]);
226 int tmpCutSamples_size = int(tmpCutSamples.size());
227 if(prevCutSamples != tmpCutSamples_size) {
228 tmpCutLevels.push_back(
int(tmpCutSamples.size()));
229 prevCutSamples = int(tmpCutSamples.size());
236 samples.insert(samples.begin(), tmpCutSamples.begin(), tmpCutSamples.end());
237 levels.insert(levels.begin(), tmpCutLevels.begin(), tmpCutLevels.end());
242 float x, y, ang, r, r2;
244 for(
int i = 0; i < samples.size(); i += 2) {
248 r = sqrtf(x * x + y * y);
250 samples[i] = (r2 * cosf(ang));
251 samples[i + 1] = (r2 * sinf(ang));
264 nSamples =
MAX(nSamples, 1);
267 this->window = window;
268 this->nSamples = nSamples;
272 for(
int i = 0; i < nLevels; i++) {
273 float factor = powf(2.0f,
float(i));
274 float tmpRadius = radius * factor;
278 getBridsonSamples< N >(m, tmpRadius, samples);
282 getDartThrowingSamples< N >(m, tmpRadius * tmpRadius, nSamples, samples);
286 getMonteCarloSamples< N >(m, nSamples, samples);
290 getMonteCarloStratifiedSamples< N >(m, nSamples, samples);
294 getPatternMethodSamples< N >(nSamples, samples);
298 levels.push_back(
int(samples.size()));
308 if(samplesR.size() > 0 || samples.size() > 0) {
316 for(
unsigned int i = 0; i < N; i++) {
317 window_f[i] = float(window[i]);
323 for(
uint i = 0; i < levels.size(); i++) {
329 start = levels[i - 1];
334 for(
int j = start; j < end; j += N) {
337 for(
unsigned int k = 0; k < N; k++) {
338 x = int(
lround(samples[j + k] * window_f[k]));
339 coord += x *
powint(window[k], k);
343 if(track.find(coord) == track.end()) {
346 for(
unsigned int k = 0; k < N; k++) {
347 x = int(
lround(samples[j + k] * window_f[k]));
348 samplesR.push_back(x);
353 levelsR.push_back(
int(samplesR.size()));
357 printf(
"render2Int: Original: %d \t Rendered: %d\n",
int(samples.size() / N),
363 std::string name,
int level)
365 Image img(1, window[0] * 2 + 1, window[1] * 2 + 1, 1);
373 start = levelsR[level - 1];
376 end = levelsR[level];
380 for(
int i = start; i < end; i += N) {
381 x = samplesR[i ] + window[0];
382 y = samplesR[i + 1] + window[1];
396 return (levelsR[level] / N);
398 return ( levelsR[level] - levelsR[level - 1]) / N;
409 start = levelsR[level - 1];
412 end = levelsR[level];
415 i =
CLAMPi(i + start, start, end-1);
417 x = samplesR[i ] + window[0];
418 y = samplesR[i + 1] + window[1];
421 template <
unsigned int N>
426 int halfSize = rsVec.size() / 2;
428 for(
int i = -halfSize; i <= halfSize; i++) {
429 for(
int k = 0; k < rsVec[i].samplesR.size(); k += N) {
430 for(
int l = 0; l < N; l++) {
431 rsOut.
samplesR.push_back(rsVec[i].samplesR[k + l]);
441 for(
int i = 0; i < N; i++) {
442 window[i] = rsVec[0].window[i];
445 window[N] = halfSize;
int getSamplesPerLevel(int level)
getSamplesPerLevel
std::mt19937 * m
Definition: sampler_random.hpp:47
float * data
data is the main buffer where pixel values are stored.
Definition: filter_radial_basis_function.hpp:91
PIC_INLINE int powint(int x, int b)
powint computes power function for integer values.
Definition: math.hpp:416
PIC_INLINE long lround(double x)
lround rounds double numbers properly.
Definition: math.hpp:229
static void Generate(SAMPLER_TYPE type, int window)
Generate.
Definition: sampler_random.hpp:156
static void generateFigureRS(std::string nameOut, SAMPLER_TYPE type, int window, int nSamples, int nLevels)
generateFigureRS
Definition: sampler_random.hpp:136
Definition: point_samplers.hpp:51
Definition: point_samplers.hpp:51
The Image class stores an image as buffer of float.
Definition: filter_radial_basis_function.hpp:60
std::vector< float > samples
Definition: sampler_random.hpp:52
void render2Int()
render2Int
Definition: point_samplers.hpp:51
void getSampleAt(int level, int i, int &x, int &y)
getSampleAt
bool Write(std::string nameFile, LDR_type typeWrite, int writerCounter)
Write saves an Image into a file on the disk.
Definition: filter_radial_basis_function.hpp:1924
Definition: point_samplers.hpp:51
void setZero()
setZero sets data to 0.0f.
Definition: filter_radial_basis_function.hpp:1383
SAMPLER_TYPE
Definition: display.hpp:52
void wrap(float alpha)
wrap
int nSamples
Definition: sampler_random.hpp:60
void update(SAMPLER_TYPE type, Vec< N, int > window, int nSamples, int nLevels)
update
#define PIC_INLINE
Definition: base.hpp:33
SAMPLER_TYPE
Definition: point_samplers.hpp:51
std::vector< int > samplesR
Definition: sampler_random.hpp:53
void Write(std::string name, int level)
Write.
void cutRescale(unsigned int cutDim)
cutRescale
PIC_INLINE void ConvertVectorToPlus1(std::vector< RandomSampler< N > > &rsVec, RandomSampler< N+1 > &rsOut)
Definition: sampler_random.hpp:422
int width
Definition: filter_radial_basis_function.hpp:80
RandomSampler()
RandomSampler.
Definition: sampler_random.hpp:65
unsigned int uint
Definition: saturation.hpp:24
Definition: point_samplers.hpp:51
#define CLAMPi(x, a, b)
Definition: math.hpp:81
Definition: bilateral_separation.hpp:25
SAMPLER_TYPE type
Definition: sampler_random.hpp:46
#define MAX(a, b)
Definition: math.hpp:73
The RandomSampler class.
Definition: sampler_random.hpp:43
float PoissonRadius(int nSamples)
PoissonRadius estimates the radius of a Poisson-disk like distribution using nSmaples.
Definition: point_samplers.hpp:40
std::vector< int > levels
Definition: sampler_random.hpp:56
std::set< int > track
Definition: sampler_random.hpp:48
The Vec class.
Definition: vec.hpp:35
Vec< N, int > window
Definition: sampler_random.hpp:59
std::vector< int > levelsR
Definition: sampler_random.hpp:57