шум перлина

 
0
 
Algorithms
ava
xTr1m | 19.03.2013, 14:26
Доброго времени суток, помогите, пожалуйста, понять суть алгоритма на конкретном примере.  Есть у меня два цвета, мне нужно заполнить некий массив, используя шум Перлина.
Никак не пойму: я сначала должен случайно заполнить массив этими двумя цветами, а потом к каждой ячейке применить шум?
Или алгоритм позволяет, подавая на вход два цвета, получить шум к одному из них и этот результат добавить в ячейку массива?
Comments (3)
ava
xTr1m | 19.03.2013, 14:14 #
Еще немного подумав, решил упростить себе задачу, поэтому вопрос несколько видоизменился. Пусть у меня есть число, мне нужно заполнить массив этим числом + некий шум. То есть, к исходному числу я применяю алгоритм "шум перлина" и получаю значению, которое немного отличается от исходного. в сети я нашел несколько вариантов, но никак не пойму за счет чего достигается рандомность шума? Почти везде приводят такую функцию

_inline float CMyNoise::Noise2D(int x)
{
  int n = x:
  n = (n<<13) ^ n;
  return ( 1.0f - ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) /
      1073741824.0f);
}

но ведь сама по себе она не дает рандомности? Или мне нужно получить шум, прибавить его к исходному числу и потом на вход уже подавать этот результат?
ava
xTr1m | 19.03.2013, 14:34 #
вот, например, кусок. но в чем рандомность? или что-то нужно еще добавить?

function Noise1(integer x)
    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
  end function


  function SmoothedNoise_1(float x)
    return Noise(x)/2  +  Noise(x-1)/4  +  Noise(x+1)/4
  end function


  function InterpolatedNoise_1(float x)

      integer_X    = int(x)
      fractional_X = x - integer_X

      v1 = SmoothedNoise1(integer_X)
      v2 = SmoothedNoise1(integer_X + 1)

      return Interpolate(v1 , v2 , fractional_X)

  end function


  function PerlinNoise_1D(float x)

      total = 0
      p = persistence
      n = Number_Of_Octaves - 1

      loop i from 0 to n

          frequency = 2i
          amplitude = pi

          total = total + InterpolatedNoisei(x * frequency) * amplitude

      end of i loop

      return total

  end function
ava
Bitter | 21.03.2013, 16:52 #
мне кажется рандомность, а точнее псевдорандомность получается из-за многочисленного переполнения регистра, но для одного и того же числа оно будет одинаковое. по этому можно либо добавить сюда еще время (чем мельче интервал тем лучше) или подавать на вход результат предыдущего выполнения, как вы и сами уже догадались
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
ava  Bitter   xTr1m
advanced
Submit