Как нормализовать значения шума Perlin в диапазоне [0, 1]? - PullRequest
1 голос
/ 22 марта 2019

Я использую массив numpy для хранения значений Perlin Noise.Мне сказали, что значения Perlin Noise в 2D-массиве находятся в диапазоне [-0,7, 0,7] соответственно, но это не так.По крайней мере, не для библиотеки " noise " Каземана, когда я настраиваю параметры для октав, постоянства и лакунарности.

Я бы использовал другую библиотеку, за исключением того, что не могу найти ни одной для python, которая будет работать где-то так быстро.Кроме того, типичная формула для нормализации значения в диапазоне [0, 1], похоже, не работает здесь независимо.Даже если я получу минимальное / максимальное значения неизмененного шума, он все равно не даст мне желаемый диапазон значений.Я просто должен угадать, что использовать для значений min / max, пока диапазон не станет примерно [0, 1].

Как я могу нормализовать значения Perlin Noise в диапазоне [0, 1]?

import noise
import numpy
import sys

def __noise(noise_x, noise_y):
    """
    Generates and returns a noise value normalized to (roughly) range [0, 1].

    :param noise_x: The noise value of x
    :param noise_y: The noise value of y
    :return: float
    """

    value = noise.pnoise2(noise_x, noise_y, 8, 1.7, 2)
    # Normalize to range [0, 1]
    value = numpy.float32((value + 0.6447) / (0.6697 + 0.6447))

    return value


map_arr = numpy.zeros([900, 1600], numpy.float32)

for y in range(900):

    for x in range(1600):

        noise_x = x / 1600 - 0.5
        noise_y = y / 900 - 0.5

        value = __noise(noise_x, noise_y)
        map_arr[y][x] = value

for row in map_arr:
    for num in row:
        sys.stdout.write(str(num) + " ")
    print("")

1 Ответ

2 голосов
/ 22 марта 2019

map_arr = (map_arr - map_arr.min()) / (map_arr.max() - map_arr.min()) (с использованием numpy вещания и векторизации) должно быть достаточно.

...