Создание функции шума без бинарных операторов? - PullRequest
3 голосов
/ 14 июля 2011

Есть ли какой-нибудь возможный способ сделать псевдослучайные числа без каких-либо бинарных операторов?Так как это 3D-карта, я пытаюсь сделать ее функцией X и Y, но, надеюсь, где-нибудь включить случайное семя, чтобы оно не было одинаковым каждый раз.Я знаю, что вы можете создать шумовую функцию, подобную этой, с помощью бинарных операторов:

double PerlinNoise::Noise(int x, int y) const
{
    int n = x + y * 57;
    n = (n << 13) ^ n;
    int t = (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff;
    return 1.0 - double(t) * 0.931322574615478515625e-9;/// 1073741824.0);
}

Но поскольку я использую lua вместо C ++, я не могу использовать бинарные операторы.Я пробовал много разных вещей, но ни одна из них не работает. Помощь

Ответы [ 4 ]

3 голосов
/ 14 июля 2011

Для битовых операторов (я думаю, это то, что вы подразумеваете под «двоичными»), взгляните на страницу вики побитовых операторов , которая содержит список модулей, которые вы можете использовать, например LuaBitOp и bitlib .

Если вы не хотите реализовывать его самостоятельно, взгляните на модуль lua-noise , который содержит реализациюперлинского шума.Обратите внимание, что это модуль C в стадии разработки.

1 голос
/ 27 июля 2011

В вышеприведенной подпрограмме нет побитовых операторов, которые нелегко преобразовать в арифметические операции.

<< 13 становится *8192* 1003 * <p>& 0x7FFFFFFF становится модом 2 ^ 31.

Пока переполнение не является проблемой, это должно быть всетебе нужно.

1 голос
/ 26 июля 2011

Если я не ошибаюсь, Мэтт Цукер FAQ по шуму Перлина использует только арифметические операторы для его описания / реализации.В нем упоминаются только побитовые операторы как трюк для оптимизации.

Вы должны реализовать оба способа и протестировать их с одним и тем же языком / временем выполнения, чтобы получить представление о разнице в скорости.

0 голосов
/ 24 июля 2011

Это было бы довольно медленно, но я думаю, вы могли бы смоделировать их с делением и умножением.

...