Как вы используете Python Noise 1.1.1 для координат?

Я осмотрелся и, кажется, больше всего использую его для текстур, и я застрял, пытаясь понять, как реализовать Perlin/Simplex Noise для набора двумерных координат x и y.

Все, что я пытаюсь сделать, это ввести 2 случайные координаты, x и y, а затем вернуть измененные x и y, или это невозможно?

Я использую pythons noise, чтобы создать координаты, но я нахожу Я считаю, что шум перлина довольно сложен для понимания и не может полностью понять, как он работает.


person NothingToSay    schedule 19.02.2013    source источник
comment
Если вы просто хотите добавить немного шума к двум числам (x и y), вам не нужен шум Перлина — просто используйте функцию Гаусса, что-то вроде random.gauss(x, noisiness)   -  person voithos    schedule 19.02.2013
comment
Это правда, но перлиновый шум это круто :)   -  person mmgp    schedule 19.02.2013
comment
Гаусс вроде работает, но он упускает то, что мне нужно, а именно то, что координаты могут быть воспроизведены, если бы я знал перестановку.   -  person NothingToSay    schedule 19.02.2013


Ответы (1)


Можно использовать Perlin Noise для добавления некоторой неопределенности в набор 2D-координат (если набор представляет собой одну пару, это тоже нормально). Вы можете рассмотреть возвращенное значение шума (в диапазоне [-1, 1] для указанной библиотеки) вместе с некоторым фактором, чтобы определить, насколько сильно оно влияет на ваши входные координаты. Чем больше коэффициент, тем большее влияние шум оказывает на ваши данные. Вот один из самых простых возможных примеров:

from noise import snoise2 # Simplex noise for 2D points

x, y = 0.5, 0.3
factor = 0.1
n = snoise2(x, y)
print x + n * factor, y + n * factor

Мы также можем рассмотреть гораздо больший фактор и применить ту же идею к изображениям. Считая factor = 15 и округляя полученные координаты до ближайшего соседа, переходим от изображения слева к изображению справа:

введите здесь описание изображениявведите здесь описание изображения

Полный код для получения изображения следует. Факторы n1 и n2 использовались для получения "менее скучного" изображения.

import sys
from noise import snoise2
from PIL import Image

img = Image.open(sys.argv[1]).convert('L')
result = Image.new('L', img.size)
width, height = img.size

factor = 15
res = result.load()
im = img.load()
for x in xrange(width):
    for y in xrange(height):
        n1 = snoise2(x, y)
        n2 = snoise2(y, x)
        pt = [int(round(x + n1 * factor)), int(round(y + n2 * factor))]
        pt[0] = min(max(0, pt[0]), width - 1)
        pt[1] = min(max(0, pt[1]), height - 1)
        res[x, y] = im[tuple(pt)]
result.save(sys.argv[2])

Конечно, это даже не касается того, как можно использовать Perlin Noise. В качестве другого примера, учитывая определенную функцию, вы можете «зашумить» входные данные и объединить их с упомянутым фактором для создания различных выходных данных. Например, вот результат выполнения этого для некоторой функции, основанной на косинусе:

введите здесь описание изображения

person mmgp    schedule 19.02.2013