static gfloat randomize_value (gfloat now, gfloat min, gfloat max, gboolean wraps_around, gfloat rand_max, gint holdness, gint x, gint y, gint n, GeglRandom *rand) { gint flag, i; gfloat rand_val, new_val, steps; steps = max - min + 0.5; rand_val = gegl_random_float (rand, x, y, 0, n++); for (i = 1; i < holdness; i++) { float tmp = gegl_random_float (rand, x, y, 0, n++); if (tmp < rand_val) rand_val = tmp; } flag = (gegl_random_float (rand, x, y, 0, n) < 0.5) ? -1 : 1; new_val = now + flag * fmod (rand_max * rand_val, steps); if (new_val < min) { if (wraps_around) new_val += steps; else new_val = min; } if (max < new_val) { if (wraps_around) new_val -= steps; else new_val = max; } return new_val; }
/* * Return a Gaussian (aka normal) distributed random variable. * * Adapted from gauss.c included in GNU scientific library. * * Ratio method (Kinderman-Monahan); see Knuth v2, 3rd ed, p130 * K+M, ACM Trans Math Software 3 (1977) 257-260. */ static gfloat noise_gauss (GeglRandom *rand, gint xx, gint yy, gint *n) { gfloat u, v, x; do { v = gegl_random_float (rand, xx, yy, 0, (*n)++); do u = gegl_random_float (rand, xx, yy, 0, (*n)++); while (u == 0); /* Const 1.715... = sqrt(8/e) */ x = 1.71552776992141359295 * (v - 0.5f) / u; } while (x * x > -4.0f * logf (u)); return x; }
/* * Return a Gaussian (aka normal) distributed random variable. * * Adapted from gauss.c included in GNU scientific library. * * Ratio method (Kinderman-Monahan); see Knuth v2, 3rd ed, p130 * K+M, ACM Trans Math Software 3 (1977) 257-260. */ static gdouble gauss (GeglRandom *rand, int *i, int xx, int yy) { gdouble u, v, x; do { v = gegl_random_float (rand, xx, yy, 0, (*i)++); do u = gegl_random_float (rand, xx, yy, 0, (*i)++); while (u == 0); /* Const 1.715... = sqrt(8/e) */ x = 1.71552776992141359295 * (v - 0.5) / u; } while (x * x > -4.0 * log (u)); return x; }
gfloat gegl_random_float_range (const GeglRandom *rand, gint x, gint y, gint z, gint n, gfloat min, gfloat max) { return gegl_random_float (rand, x, y, z, n) * (max - min) + min; }
static gfloat noise_linear (GeglRandom *rand, gint xx, gint yy, gint *n) { return gegl_random_float (rand, xx, yy, 0, (*n)++) * 2 - 1.0; }
static gfloat noise_linear (GeglRandom *rand, int *i, int xx, int yy) { return gegl_random_float (rand, xx, yy, 0, (*i)++) * 2 - 1.0; }