Параметрическая случайная функция для 2D генерации шума - PullRequest
4 голосов
/ 13 октября 2011

Я пытаюсь создать бесконечную случайную местность.Ландшафт должен генерировать один и тот же результат каждый раз при задании одного и того же начального числа.

Я пытался использовать случайную функцию Java, создавая начальное число с использованием различных функций координат x и y данного узла в сетке ландшафта.,Например, x * y + x + y + seed, 20 * x + 30 * y и т. Д.

Проблема этого подхода заключается в том, что я всегда вижу четкие шаблоны в сгенерированных числах.

В общем, я хочу вот что: f (x, y) = Случайное число

Было бы полезно, если бы вышеприведенная функция могла включать в себя некое начальное число, делающее это: f (x, y, seed) =Случайное число

Мне нужно будет сгенерировать несколько чисел для каждой комбинации x, y, но это должно быть достаточно просто для получения дополнительных чисел, как только я получу вышеуказанную функцию.Они будут служить для определения высоты местности и того, какие объекты (здания, деревья) будут присутствовать.

Пожалуйста, не упоминайте шум Perlin или другие подобные методы.Моя проблема не в том, чтобы шум хорошо выглядел, а в том, что он получает надежный «случайный» шум.

Спасибо, Джейми.

1 Ответ

5 голосов
/ 13 октября 2011

Вы ищете функцию хеширования.Попробуйте один из них:

http://www.concentric.net/~ttwang/tech/inthash.htm

Вот пример использования:

int hash32shift(int key)
{
  key = ~key + (key << 15); // key = (key << 15) - key - 1;
  key = key ^ (key >>> 12);
  key = key + (key << 2);
  key = key ^ (key >>> 4);
  key = key * 2057; // key = (key + (key << 3)) + (key << 11);
  key = key ^ (key >>> 16);
  return key;
}

int noise(int x, int y, int seed)
{
    return hash32shift(seed+hash32shift(x+hash32shift(y)));
}

И это выглядит так:

noise

...