javascript - 神秘 "rnorm"函数地形生成 JavaScript - 这是做什么的?

标签 javascript vector terrain procedural-generation

问题:这段代码到底在做什么?

另外:“w”的使用方式是某种现有算法吗?我试图弄清楚该函数的意图,或者至少描述它产生的数字类型。

上下文:我正在查看 Martin O'Leary 的“幻想 map 生成”代码 - full source here ,简而言之,它会在 Canvas 上生成幻想 map 。对于更高级别的流程如何工作有一些富有洞察力的解释in a blog post ,但这水平太低,无法获得任何覆盖。有一个名为“rnorm”的特殊函数,它在几个地方使用,但我不知道它是如何工作的。我将其包含在下面,然后是一些在某些背景下出现的实例。任何关于这件事正在做什么的帮助都会很棒!

var rnorm = (function() {
    var z2 = null;

    function rnorm() {
        if (z2 != null) {
            var tmp = z2;
            z2 = null;
            return tmp;
        }
        var x1 = 0;
        var x2 = 0;
        var w = 2.0;
        while (w >= 1) {
            x1 = runif(-1, 1);
            x2 = runif(-1, 1);
            w = x1 * x1 + x2 * x2;
        }
        w = Math.sqrt(-2 * Math.log(w) / w);
        z2 = x2 * w;
        return x1 * w;
    }
    return rnorm;
})();

上面代码中调用的 runif() 是一个简短的函数,用于生成两个给定值之间的随机数

function runif(lo, hi) {
    return lo + Math.random() * (hi - lo);
}

此代码用于生成随机向量(实际上是生成过程中唯一使用它的地方) -

function randomVector(scale) {
return [scale * rnorm(), scale * rnorm()];
}

但我认为它的作用不止于此,因为当提供“randomVector(4)”方向时,以下内容会在整个网格高度图上产生渐变斜率: 编辑:不,实际上对坡度没有影响。这是由于一些偷偷摸摸的事实,即 map 的一侧是 0,0, map 的另一侧是宽度、高度,这会创建逐渐增加的数字。

function slope(mesh, direction) {
    return mesh.map(function (x) {
        return x[0] * direction[0] + x[1] * direction[1];
    });
}

如果还有什么我应该提供的,请告诉我。这是我的第一个问题,所以我可能对惯例有点软弱。

最佳答案

我认为这是可怕的代码。它似乎创建了一对值 z1z2,但不是将它们放入元组中并返回,而是返回 z1 和 < em>每隔一秒调用一次相应的 z2 值。我不知道他们为什么要这样做,我唯一的猜测是避免分配对象并使语法上的使用更方便。

应该简化为

function rnorm() {
    var x1 = 0;
    var x2 = 0;
    var w = 2.0;
    while (w >= 1) {
        x1 = runif(-1, 1);
        x2 = runif(-1, 1);
        w = x1 * x1 + x2 * x2;
    }
    w = Math.sqrt(-2 * Math.log(w) / w);
    return [x1 * w, x2 * w];
}

function randomVector(scale) {
    var [z1, z2] = rnorm();
    return [scale * z1, scale * z2];
}

现代编译器应该能够避免为返回的文字分配数组以及随后的解构。如果不是,您可以通过在 randomVector 中内联 rnorm 来手动完成此操作,尤其如果这是唯一调用它的地方。 p>

关于javascript - 神秘 "rnorm"函数地形生成 JavaScript - 这是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47443435/

相关文章:

algorithm - 欧几里德距离与 PIL 逊相关性与余弦相似性?

c++ - 从 vector 中删除项目,而在 C++11 范围 'for' 循环中?

javascript - 使用 Google Translate API 翻译 JavaScript 和 HTML 中的内容

javascript - 我如何在 document.getElementsByClassName 中添加 2 个 div

javascript - 我的代码有什么问题吗?缓慢改变div的颜色

java - 16x16 纹理太大,Java openGL

javascript - 如何从我的网页上将负数更改为 0

c++ - 文件未被读取 (ifstream)

python - 生成混沌噪声较少的地形