2015-04-22 1 views
1

Я пытаюсь реализовать базовую функцию шума perlin (я знаю, что есть библиотека, которая делает именно это, я просто хочу попробовать свои), и у меня есть некоторая проблема с целым числом к ​​шуму функция, используемая для генерации детерминированного шума из целых входов.функция integer to noise в Haskell

функция Я пытаюсь реализовать определяется там: http://libnoise.sourceforge.net/noisegen/index.html#continuousnoise

и мой код до сих пор выглядит следующим образом:

noise2d :: (Int32, Int32) -> Double 
noise2d (x, y) = 
    let m = x + y * 57 
     n = (shiftR m 13)^m 
     j = (n * (n * n * 15731 + 789221) + 1376312589) .&. 0x7fffffff 
    in 1.0 - (fromIntegral j/1073741824.0) 

код компиляции, но я получаю тот же результат для любого входного сигнала, из-за того, что n оценивается в 0.

Есть ли лучший способ сделать это?

ответ

5

Проблема вытекающей из использования вами ^ -оператора. В C это побитовая исключительная дизъюнкция (xor), тогда как в Haskell это возведение в степень. Таким образом, вам просто нужно изменить четвертую строку на

 n = (shiftR m 13) `xor` m 

и все должно быть хорошо.

+0

Да, это так! Похоже, мне нужно освежить мой C, спасибо! –

3

Ваша ошибка

n = (shiftR m 13) `xor` m 
        ^^^^^ 

(вместо степенной функции (^))