Haskell 中的整数噪声函数
integer to noise function in Haskell
我正在尝试实现一个基本的 perlin 噪声函数(我知道有一个库可以做到这一点,我只想尝试自己的),但我对用于生成的整数到噪声函数有一些问题来自整数输入的确定性噪声。
我要实现的功能在此处定义:
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。
有更好的方法吗?
你的错误是
n = (shiftR m 13) `xor` m
^^^^^
(代替幂函数(^)
)
问题源于您使用了 ^
-operator。在 C 中它是按位异或 (xor),而在 Haskell 中它是求幂。所以,你只需要将第四行改为
n = (shiftR m 13) `xor` m
一切都会好起来的。
我正在尝试实现一个基本的 perlin 噪声函数(我知道有一个库可以做到这一点,我只想尝试自己的),但我对用于生成的整数到噪声函数有一些问题来自整数输入的确定性噪声。
我要实现的功能在此处定义: 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。
有更好的方法吗?
你的错误是
n = (shiftR m 13) `xor` m
^^^^^
(代替幂函数(^)
)
问题源于您使用了 ^
-operator。在 C 中它是按位异或 (xor),而在 Haskell 中它是求幂。所以,你只需要将第四行改为
n = (shiftR m 13) `xor` m
一切都会好起来的。