Swift中的Perlin噪声发生器



我有这个代码用于在obj-c中生成1D噪声,它运行得很好:

- (float)makeNoise1D:(int)x {
    x = (x >> 13) ^ x;
    x = (x * (x * x * (int)_seed + 19990303) + 1376312589) & RAND_MAX;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & RAND_MAX) / 1073741824.0);
}

现在我试图在Swift中复制它,但它总是失败,并在返回时显示EXEC_BAD_INSTRUCTION。这就是现在的样子,我不得不吐出最后的表情,但我很确定这不是问题所在。

func makeNoise1D(var x : Int) -> Float{
    x = (x >> 13) ^ x;
    x = (x * (x * x * seed! + 19990303) + 1376312589) & 0x7fffffff
    var inner = (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff
    return ( 1.0 - ( Float(inner) ) / 1073741824.0)
}

我已经尝试了许多不同的类型转换和拆分为子表达式,但仍然失败了。我唯一知道的是,第一行和最后一行都有效。(我的大多数测试用例x设置为20,种子设置为10,只是为了简单起见)

谢谢你的帮助!

如果一个计算的结果不能表示为Int

与(Objective-)C不同,Swift中整数的加法和乘法不"环绕"或"truncate",但如果结果不适合数据类型,则会导致错误。

但是您可以使用Swift的"溢出运算符"&*&+,它们总是截断结果:

func makeNoise1D(x : Int) -> Float{
    var x = x
    x = (x >> 13) ^ x;
    x = (x &* (x &* x &* seed! &+ 19990303) &+ 1376312589) & 0x7fffffff
    let inner = (x &* (x &* x &* 15731 &+ 789221) &+ 1376312589) & 0x7fffffff
    return ( 1.0 - ( Float(inner) ) / 1073741824.0)
}

相关内容

  • 没有找到相关文章

最新更新