柏林噪声简化版地形生成算法js版代码
不依赖任何其他模块的js代码,方便随时取用,直接复制到项目非常方便:
1 | /** |
介绍
柏林噪声是一种能够生成连续、无缝的随机分布的算法。它由 Ken Perlin 在 1983 年创建,常用于生成自然风景、云彩、水波等图像。在《我的世界》游戏中,柏林噪声算法被用于生成游戏世界中的地形。具体来说,每个游戏世界都是由一个大方块网格 组成的,每个小方块都有一个高度值。柏林噪声算法可以根据小方块的位置坐标来生成 一个对应的高度值,以此来生成具有自然形态的山丘、河流、峡谷等地形特征。这种 生成方式使得每个游戏世界都具有随机性和独特性,让玩家感受到更加真实的游戏体验。
传入不同的参数,将高频的噪声和低频的噪声叠加在一起形成丰富的地形,遍历棋 盘上的每一个位置对应的叠加后的噪音网络中的噪音值,即可获得整个地形。
侧视图
俯视图
将低于绿色平面的部分表示草地,将高于绿色的部分表示为石头。以此可以用js来做一些小东西、小游戏。
具体代码细节
在这个代码中,外层函数 createRandom(seed) 返回了一个内层函数。每次调用这个 内层函数,它都会修改外层函数中的变量 value。这个 value 变量可以被认为是一个状 态,记录了当前的随机数生成器所处的状态。 由于 JavaScript 的函数都是对象,当内层函数被返回后,外层函数的执行环境就会 被销毁,但是它的局部变量 value 会一直存在于内层函数的闭包中,因此不会被垃圾回 收。 这个 value 变量的作用就是存储随机数生成器的状态,从而可以保证在每次调用内 层函数时,返回的随机数都是按照确定的算法生成的。 为了在编写代码时区分各个噪音网络的种子,要使得种子参数可以使字符串,这就需要实现以下将字符串哈希化的方法:
1 | function hashCode(str) { |
此方法使用了基本的数学运算来实现哈希函数,该函数将字符串 str 中每个字符的 ASCII 码值相加,再乘以一个质数 31,最后对一个质数取余数,得到哈希值。 虽然可以实现字符串转哈希值的功能,但哈希冲突的情况比较多,对于需要高效处 理大量数据的场景,使用一些成熟的哈希函数库更加合适,由于此模式的地图相对较小, 只有 19x19,所以采用了相对简单的方式实现。 在此函数中使用了哈希算法中的常见技巧——乘法哈希法,即将当前哈希值乘上一 个常数后加上新加入的字符,这个常数被称为“乘数”,一般取一个质数,乘数的选取 影响哈希算法的性能。 在这里,31 是一个较为常见的乘数,因为它是一个奇素数,而且 hash * 31 可以 被优化为位运算 hash << 5 - hash,这样可以提高计算速度,同时生成的哈希值分布也比 较均匀,避免哈希冲突。
温馨提示
以上文字说明其实是为了凑字数,因为代码不能算入字数,导致代码不能发表,这些文字由chatGPT根据代码来生成。
本文的前两张示意图由up“在下叶凉陈”帮忙绘制。