Midpoint displacement
Основная суть алгоритма (который впоследствии плавно перерастет в Diamond square через двумерный Midpoint displacement):
// vector — массив точек, изначально заполнены только первая и последняя
// left, right — индексы первого и последнего элемента
// len = длина изначального отрезка(в пикселах)
// r - шероховатость. Чем меньше тем более плавная кривая будет в результате.
function midpoint(vector, left, right, len, r) {
if (right - left < 2)
return;
var hl = vector[left]; //высота левой точки
var hr = vector[right]; //высота правой
var h = (hl + hr) / 2 + rand(-r * len, +r * len); //считаем высоту
var index = Math.floor(left + (right - left) / 2); //ищем середину
vector[index] = h;
//выполняем алгоритм для получившихся половин
midpoint(vector, left, index, len / 2, r);
midpoint(vector, index, right, len / 2, r);
}