Я не уверен, работает ли мой генератор шума Perlin, шум, который он создает, очень сильно отличается от изображений, которые я вижу в Интернете. Шахта выглядит слишком однородным (это три различных изображения):2D Perlin Noise выглядит нечетным
Принимая во внимание то, что я обычно вижу что-то вроде:
Мой код в основном:
/* Get the coord of the top-left gradient of the grid (y, x) falls in */
int j = floor(x);
int i = floor(y);
/* Get the distance (y, x) is from it */
double dx = x-j;
double dy = y-i;
/* Influence of (g)radient(i)(j) (starting at the top-left one) */
double g00 = dot(grad(hashes, hsize, grads, i, j), dy, dx);
double g01 = dot(grad(hashes, hsize, grads, i, j+1), dy, dx-1);
double g10 = dot(grad(hashes, hsize, grads, i+1, j), dy-1, dx);
double g11 = dot(grad(hashes, hsize, grads, i+1, j+1), dy-1, dx-1);
/* Interpolate the influences using the blending function */
/* Linear interpol the top 2 */
double lt = lerp(g00, g01, fade(dx));
/* Linear interpol the bottom 2 */
double lb = lerp(g10, g11, fade(dx));
/* Linear interpol lb lt, completing the bilienear interpol */
return lerp(lt, lb, fade(dy));
Complete code. Он основан главным образом на учебнике this. Я использую this script, чтобы нарисовать файл csv.
Я понимаю основы, но после прочтения нескольких «учебников», которые обычно противоречат друг другу и «эталонной реализации», которая не очень читаема, у меня есть несколько сомнений. Точечные интерполяции (x, y)
должны быть в каком интервале? Как я понимаю, это должно быть [0, GRID_SIZE-1]
(например, [0, 255]
, если используется предварительно вычисленная таблица с 256 случайными значениями). Тем не менее, мой код приводит только к достаточно хорошим изображениям, когда (x, y)
сопоставляется с [0, 1]
, и я вижу некоторые реализации в Интернете, которые отображают его на [0, 255]
независимо от размера сетки. Я также не уверен, правильно ли выбрал градиенты из таблицы.
Похож на шум перлина, слишком масштабированный. Посмотрите на ответ М Oehm. – lisyarus