此JavaScript代码是否遵循中点置换算法?

此JavaScript代码是否遵循中点置换算法?,javascript,canvas,Javascript,Canvas,我正在尝试使用上推荐的JavaScript和canvas 下面的代码生成数组索引为x位置且其值为y位置的点 var createTerrain = function(chops, range) { chops = chops || 2; range = parseInt(range || 100); if (chops > 8) return; var cycle = parseInt(width / chops); for (var

我正在尝试使用上推荐的JavaScript和
canvas

下面的代码生成数组索引为
x
位置且其值为
y
位置的点

var createTerrain = function(chops, range) {
    chops = chops || 2;
    range = parseInt(range || 100); 

    if (chops > 8) return;

    var cycle = parseInt(width / chops);    

    for (var i = 0; i <= width; i += cycle) {

        var y = (height / 2) + getRandomNumber(-range, range);

        terrain[i] = y;

    }

    chops *= 2;
    range *= 0.5;
    createTerrain(chops, range);

}
var createTerrain=函数(切块,范围){
排骨=排骨| | 2;
范围=parseInt(范围| | 100);
如果(印章>8)返回;
变量周期=parseInt(宽度/印章);

对于(var i=0;i我想说它看起来不像中点位移,只是因为每个线段都应该有一个规则的X轴长度(几乎是垂直线段)。你试过生成一个简单的4段数组吗?它看起来像什么

以下是我编写的一个简短教程,您可以在实践中看到它:

源代码:

function Terrain(segmentCount) {
    this.segmentCount = segmentCount;
    this.points = [];
    for (i=0; i<=segmentCount; ++i) {
        this.points[i] = 0;
    }
};

/**
* Generate the terrain using the mid-point displacement algorithm. This is in fact
* a shortcut to the recursive function with the appropriate value to start
* generating the terrain.
*
* @param maxElevation the maximal vertical displacement to apply at this iteration
* @param sharpness how much to attenuate maxElevation at each iteration (lower
*        value means a smoother terrain). Keep between 0 and 1.
*/
Terrain.prototype.generateUsingMidPoint = function(maxElevation, sharpness) {
    this.midPoint(0, this.segmentCount, maxElevation, sharpness);
}

/**
* This is the recursive function to actually generate the terrain. It computes a new height for the point
* between "start" and "end" (the mid-point): averages start and end heights and adds a random
* displacement.
*
* @param maxElevation the maximal vertical displacement to apply at this iteration
* @param sharpness how much to attenuate maxElevation at each iteration (lower
*        value means a smoother terrain). Keep between 0 and 1.
*/
Terrain.prototype.midPoint = function(start, end, maxElevation, sharpness) {
    var middle = Math.round((start + end) * 0.5);
    if ((end-start<=1) || middle==start || middle==end) {
        return;
    }

    var newAltitude = 0.5 * (this.points[end] + this.points[start]) + maxElevation*(1 - 2*Math.random());
    this.points[middle] = newAltitude;

    this.midPoint(start, middle, maxElevation*sharpness, sharpness);
    this.midPoint(middle, end, maxElevation*sharpness, sharpness);
};
功能地形(分段计数){
this.segmentCount=segmentCount;
此参数为.points=[];

对于(i=0;i),从结果来看,您实现的算法显然是错误的。很难说您出了什么问题,因为您发布的代码不是自包含的。您正在父范围中定义的多个变量上操作,并且无法立即看出它们包含什么或它们的行为方式

例如,什么是
地形


首先,你必须意识到,如果开始点和结束点在y轴上不匹配,你就做错了;)

你应该能够通过减少随机数范围来平滑它。你已经尝试过了吗?@Matt是的,我尝试过一些事情。如果我先纠正这个算法,我会更感兴趣:)