Комментарии 38
Алгоритм из статьи хорошо подходит для генерации ландшафта, например, в стратегиях.Хотелось бы посмотреть на то, сколько ресурсов съест поиск маршрута на такой карте и какие выдаст результаты…
Шумы очень простая штука. Пару недель назад, за день написал демку. Там всего две функции.
Это ответ на вопрос.
XY — разные иксы и игреки, которые использовались в формуле. В общем, это положительное целое число, не превышающее 32768 (превышать нет смысла)
% — оператор получения остатка от деления одного целого числа на другое
Т.е. берётся остаток от деления не очень хорошего случайного числа и 128. Если вы знакомы с программированием вообще (не С++), то в данном случае берутся младшие 7бит целого числа (при размере сетки 128 клеток). А младшие биты в псевдослучайных числах итак не сильно случайны, а тут и само число очень плохо случайно… Вот и получаем не очень хороший результат в итоге.
Другое дело, что даже с настоящим генератором случайных чисел визуально разницы могло и не быть, потому что это же всё случайно.)
Прикреплю-ка видео по теме <random>, может кто ещё не видел.
Уже практически 6 лет стандарту C++11, а повсюду всё тот же rand()
… Вот недавно на Coursera встретился, на новом курсе по алгоритмам.
Статья о том, как заполнить матрицу псевдослучайными числами… в следующей статье автор будет описывать сортировку пузырьком… "подписывайтесь, ставьте лайки".
Я прекрасно понимаю, что нужны материалы разного уровня. Но это уже совсем уг.
Видел программу-скринсейвер для DOS, рисующую по точно такому же алгоритму разноцветную "плазму". Алгоритм, состоящий в заполнении поля случайными прямоугольниками, был заметен при замедлении работы программы, например, средствами DOSBox. Просто вместо высоты алгоритм генерировал порядковый номер оттенка из градиентной палитры.
Как я уже говорил ранее — в моём случае это стратегия, правда ещё не дописанная. Кто-то в комментариях предлагал генерацию планет, я же этот алгоритм планирую прикрутить на генерацию астероидов. Также вполне сойдёт для клона 3х-мерной песочницы по типу minecraft.
планет
по смыслу то же самое, только делается произвольными разрезами.
А вообще всем интересующимся вот ресурс. Тема знатная и богатейшая, хотя и не простая.
Что касательно второй проблемы — на практике данной проблемы при размерах более 32х32 не возникнет. Если же есть необходимость оставить края карты пологими можно ограничить площадь, на которой генерируются квадраты.
Вторым шагом можно попробовать blur. Идея в следующем, значение высоты равно (v[x+1,y] + v[x-1,y] + v[x,y+1] + v[x,y-1] + v[x,y] * 4) / 8. Если пробларить раза четыре получатся неплохие холмы =)
Простой и быстрый алгоритм генерации ландшафта