Esempio n. 1
0
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;
}
Esempio n. 2
0
/*
 * 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;
}
Esempio n. 3
0
/*
 * 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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
static gfloat
noise_linear (GeglRandom *rand, gint xx, gint yy, gint *n)
{
  return gegl_random_float (rand, xx, yy, 0, (*n)++) * 2 - 1.0;
}
Esempio n. 6
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;
}