Портирование классического Perlin Noise на JavaScript: получение периодического паттерна. Почему? (пример JsFiddle)

Я пытаюсь портировать классический Perlin Noise (src: http://mrl.nyu.edu/~perlin/doc/oscar.html#noise) в JavaScript — для научных целей. Не знаю почему, но мой код генерирует периодический шаблон вместо случайного.

Вы можете найти мой полный код с примером, нарисованным на холсте здесь (урезанным до одного измерения): http://jsfiddle.net/YL77D/

Я думаю, что проблема может быть найдена в функции "noise1":

sx = s_curve(rx0);

u = rx0 * g1[ p[ bx0 ] ];
v = rx1 * g1[ p[ bx1 ] ];

return lerp(sx, u, v);

Если мое семя x равно 10,1, 10,2, 10,3 и т. д., я думаю, что u и v должны быть одним и тем же числом (u должно быть основано на 10, а v должно быть основано на 11, поэтому sx находится где-то посередине). Я прав? Но в моем коде u и v всегда разные.

Любые идеи? Большое тебе спасибо.


person Pipo    schedule 09.05.2012    source источник


Ответы (1)


Одной из проблем может быть то, как вы используете Math.Random:

p[i] = p[j = Math.floor(Math.random() % B)];

В javascript Math.Random возвращает значение с плавающей запятой от 0 до 1.
random в C возвращает целочисленное значение от 0 до RAND_MAX.

p[i] = p[j = random() % B];
person Sani Singh Huttunen    schedule 09.05.2012
comment
Привет, Сани! Большое спасибо! Кажется, это решает мою проблему! Я изменил пример JsFiddle, и результат выглядит великолепно: jsfiddle.net/fDTbv - person Pipo; 09.05.2012