Войти
ПрограммированиеФорумФизика

Алгоритм течения реки на карте высот...

Страницы: 1 2 Следующая »
#0
9:21, 30 мая 2019

Всем доброго дня!
Подкиньте идею, как можно "запустить" воду (реку) по карте высот.

Карта представляет из себя 512х512 точек со значениями от 0 до 127 (высота), построенные по алгоритму diamond-square.

Из моего примитивного понимания действовать должно так:

1. родник заливает первую точку
2. если рядом высота больше -  подымает точку заливки  +1
3. проверяем вокруг "родника"
4. если есть ниже или с той-же высотой - заливаем

ни или типа того... хотя тут не очень понятно что если будет постоянный спуск или спуск и  он окончится, должно "заливаться озеро"...

В общем, если есть идеи или примеры - напишите плз :)


#1
(Правка: 9:34) 9:33, 30 мая 2019

самый простой случай — сделать итеративный алгоритм, который просто распределяет воду между соседними ячейками. если ширина ячейки h, а высота — x, то объём ячейки равен x*h^2. хранишь сколько воды(объём) находится в каждой ячейке, отсюда высчитываешь высоту столба жидкости в ней. на каждом шаге итеративного алгоритма пробегаешься по всем ячейкам и переливаешь воду из каждой по тем соседям, в которых уровень ниже, чем в текущей. получится что-то вроде flood fill, но с учётом объёма. этот алгоритм покроет все гидростатические случаи, включая выравнивание уровня воды с сообщающихся озёрах через реки, разлив воды по равнинам и прочее, но не учитывает динамические процессы вроде прорванной дамбы или завихрений на поворотах.

в более сложном случае можно считать несложную гидродинамичку через решение уравнения навье-стокса.

#2
12:36, 30 мая 2019

в принципе Suslik правильно сказал,

Пофантазирую)
я например бы взял карту глубины преобразовал ее в 2д набор точек - и залил бы банальной заливкой в пределах определенного набора высот - а то все зальет.)) Можно определенной высоте присвоить некий коэфициент, а разливающейся луже - мощь которая чем дальше тем слабее. Если текущая мощь водицы меньше коэфициента высоты то ставим в текущую точку текущую мощь воды и выходим из рекурсии. Далее при следующем заходе копим мощь и как только та станет больше коэф высоты - заливаем ее водой ну и так далее.

так по идее можно и дым и газ какой по карте распределять))

#3
13:45, 30 мая 2019

http://codeflow.org/entries/2011/nov/10/webgl-gpu-landscaping-and-erosion/

#4
14:17, 30 мая 2019

Suslik
> несложную гидродинамичку через решение уравнения навье-стокса
Для такой задачи хватит двухмерных уравнений Сен-Венана. Только я не назвал бы это "несложной гидродинамикой".

#5
0:12, 3 июня 2019

joub
Лично я бы сделал итерациями:
У каждой клетки задан уровень воды (в начале у всех = 0) и
4 соседа, поток из клетки на соседа пропорционален разнице уровней. Где высота > уровень воды - там нет потока.
Кроме того, есть клетки-источники, где появляется вода (истоки родников-притоков) и слив (море-океан), чтобы карту не залило полностью, с уровнем ниже основной части карты и уровень нем не меняется
Остается итерировать по всем клеткам карты, до тех пор, пока уровни не "устаканятся", для скорости можно рассматривать только клетки, занятые водой

Описание не учитывает, что карта полигональная, в одной клетке (2 треугольника), уровень суши может быть частично выше, частично ниже воды, это нужно учесть при расчете потоков к/от соседей.
В результате получишь список клеток, занятых рекой, можно просто рисовать плоскость воды на всю клетку с Z-buffer, можно отсекать сушу по поверхности воды, как тебе надо
Надо учесть, что в пределах клетки с ненулевым потоком поверхность воды не горизонтальная, для рисования можно считать высоту воды в углах как среднее уровней 4х соседей

#6
0:35, 3 июня 2019

что-то все кинулись в какие-то дебри...
задача стоит проще....

По сути-то надо обсчитать русло реки, и не более... но для правдоподобности это надо делать, опираясь на теорию поведения частиц воды, т.к. река может течет в соседнюю клетку - если ее уровень ниже уровня клетки с водой (это простоя часть), а вот часть когда река может "залить" луга, превратившись в озерцо с входящим и исходящим руслом... вот это уже сложнее...

#7
0:57, 3 июня 2019

joub
> По сути-то надо обсчитать русло реки
Итеративный алгоритм это и делает, куда еще проще

#8
9:37, 7 июня 2019

joub
> По сути-то надо обсчитать русло реки, и не более...
Для установившегося течения можно найти формулы гидравлики, с которыми всё просто, если свести реку в одномерный объект.
Для неустановившегося движения так легко не отделаешься:)

#9
19:08, 8 июня 2019

ммм, может конкурс алгоритмов разлива воды учинить?

#10
22:51, 8 июня 2019

Уж слишком вы загоняетесь господа...

Идейка есть одна, но еще не до конца ее додумал...
Как только реализую, выложу куда нибудь алгоритм...

#11
(Правка: 10:41) 10:37, 9 июня 2019

И вот, одна ночь и что-то получилось, в принципе такой генератор по моему мнению должен пойти для реализации моей идеи Игры-брадилки ))

Осталось еще на карту нанести лес, крупные/мелкие поселения, и дороги/мосты между ними.

Видосик генерации
На видео видно как происходит заливка озер, и течение выпадающих рек...


Исходник - Java (maven)

Примеры карт

Изображение
#12
(Правка: 19:16) 19:13, 9 июня 2019

joub
Если у Вас "вода спускается с верхней точки вниз", то получится озеро с наклонной от источника поверхностью?
Залить все одним уровнем воды - тоже неправильно, у рек ощутимый уклон и один источник на горе не зальет всю карту

#13
20:25, 9 июня 2019

Aslan
Изначально есть текущий уровень воды = высоте, мы ищем в какой клетке он еще ниже, туда и направляем источник, и снижаем уровень воды - до того в который пустили воду.
Если же мы не нашли ничего - то подымаем уровень на 1 и  перебираем варианты по новой - так появляется озеро, до тех пор, пака оно не "перельет" за кроя ландшафта и не появится новая - вытекающая река...

#14
20:27, 9 июня 2019

непосредственно тут идет расчет, смотрите строки с 25-80, в строках 100-103 я "подымаю" уровень в тех местах реки, если унас образуется озеро...

Страницы: 1 2 Следующая »
ПрограммированиеФорумФизика