Реалистичный ландшафт в 130 строчках на JavaScript

Minecraft, Terragen, Skyrim и любой авиасимулятор используют свои генераторы ландшафта. Благодаря фрактальному генератору PlayfulJS каждый может почувствовать себя в роли Бога. [демо] [исходный код]1d95623cb8f975efe5e1ce80b93fa413.jpgЛандшафт генерируется в виде карты высот, двухмерной матрицы значений, которые соответствуют высоте каждой точки на плоскости. С такой простой структурой данных можно отображать картинку любым способом: canvas, webgl и т.д. Главное ограничение — невозможность прокладывать туннели, пещеры и тому подобные вещи в ландшафте.

function Terrain (detail) { this.size = Math.pow (2, detail) + 1; this.max = this.size — 1; this.map = new Float32Array (this.size * this.size); } Алгоритм можно применить на любых размерах карты, но разработчики рекомендуют использовать степень 2 плюс 1.Сам алгоритм работает по простому шаблону: разделяем территорию на четыре части и изменяем их высоту на случайное число. Далее проделываем ту же операцию с каждой из четырёх частей, каждый раз уменьшая диапазон случайных чисел, так что сначала генератор создаёт наиболее крупные детали, а затем — всё менее заметные. Это алгоритм случайного смещения средней точки на плоскости (midpoint displacement).

PlayfulJS работает даёт лучший результат, потому что в некоторых случаях делит территорию не на квадраты, а на ромбы.

e84f97fc8a016b93b241e251cddcb47c.gif

divide (this.max);

function divide (size) { var x, y, half = size / 2; var scale = roughness * size; if (half < 1) return;

for (y = half; y < self.max; y += size) { for (x = half; x < self.max; x += size) { square(x, y, half, Math.random() * scale * 2 - scale); } } for (y = 0; y <= self.max; y += half) { for (x = (y + half) % size; x <= self.max; x += size) { diamond(x, y, half, Math.random() * scale * 2 - scale); } } divide(size / 2); }

© Habrahabr.ru