Midpoint displacement

midpoint
Основная суть алгоритма (который впоследствии плавно перерастет в 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);
}

Демо
Исходники

Добавить комментарий