Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум студии Seaward.Ru _ Разработка на Unity. Мини-игры "Пиратики" и т.п. _ Математическая генерация дна моря (глубины)

Автор: ALexusB Nov 13 2008, 14:32

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

Уперся в генерацию (роботом) дна (мелей)

Дано:
Есть матрица, например, 64х64 или 100х100, не важно, хоть 100х60 клеток.
Значение клеток - это глубина в метрах.
Для простоты считаем до 7 метров, далее для корабля не важно - "нет дна".
То есть 1 2 3 4 5 6 7 видов значений.

переходы глубин плавные, то есть 1-2 2-3 и тп, 1-7 или 1-3 быть не может.

Рандомно задаются:
- место мели в матрице
- размер и форма мели
- ширина полоски перехода на каждую глубину (то есть ширина 1-2, 2-3... можно одну на всех - это частный случай)
- число мелей (они могут быть в нескольких местах или накладываться, тогда переходы будут 1-2-3-4-3-2-1 или 1-2-1, зависимо от расстояния)

Требуется
Алгоритм генерации мелей амебообразной формы (из значений 1) с плавным переходом в 7

Решение

???

Какие есть идеи?

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

Автор: os_ Nov 13 2008, 20:35

Если я правильно понял, то координаты точек по периметру «амебы» известны (заданы), тогда предлагаемый расчет выполняется для каждой точки координаты слева направо сверху вниз по каждому ряду матрицы (как сканер). Рандом +1 или -1 к предыдущей точке ряда. Если =7, то только -1. Необходимо учитывать кол-во координатных точек в каждом ряду, т.е. если до конца ряда осталось 7 точек и глубина=7, то каждая следующая до конца точка – минус 1. (чтобы выйти обратно на =1). Наверное так.

Автор: Belphegor Nov 13 2008, 21:55

Попробовал смоделировать в эксельке. Не до 7, до 5.
Получается примерно так.

Код
5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5
5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5
5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5
5    5    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    5    5    5    5    5    5    5
5    5    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    5    5    5    5    5    5    5
5    5    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    5    5
5    5    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    5    5
5    5    4    4    3    3    3    3    3    3    3    3    3    4    4    4    4    4    4    4    4    4    4    5    5
5    5    4    4    3    3    3    3    3    3    3    3    3    3    3    3    3    3    3    3    3    3    4    5    5
5    5    4    4    3    3    3    3    3    3    3    3    3    2    2    2    2    3    3    3    3    3    4    5    5
5    5    4    4    3    3    3    3    3    3    3    3    3    2    2    2    2    3    3    3    3    3    4    5    5
5    5    4    4    3    3    3    3    2    2    2    2    3    2    2    2    2    2    2    3    3    3    4    5    5
5    5    4    4    3    3    3    3    2    1    2    2    3    2    2    2    1    1    2    3    3    3    4    5    5
5    5    4    4    3    3    3    3    2    2    2    2    2    2    2    1    1    1    2    3    3    3    4    5    5
5    5    4    4    3    3    3    3    2    2    2    2    2    1    2    2    2    2    2    3    3    3    4    5    5
5    5    4    4    3    3    3    3    3    3    3    2    1    2    2    3    3    3    3    3    3    3    4    5    5
5    5    4    4    4    4    4    4    3    3    3    2    2    2    2    3    3    3    3    3    3    3    4    5    5
5    5    4    4    4    4    4    4    3    3    3    3    3    3    3    3    3    4    4    4    4    4    4    5    5
5    5    4    4    4    4    4    4    3    3    3    3    3    3    3    3    3    4    4    4    4    4    4    5    5
5    5    5    5    4    4    4    4    3    3    3    3    3    3    3    3    3    4    4    4    4    4    4    5    5
5    5    5    5    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    5    5
5    5    5    5    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    5    5    5    5    5
5    5    5    5    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    5    5    5    5    5
5    5    5    5    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    4    5    5    5    5    5
5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5    5


Суть такая: заполняем квадрат 25*25 пятерками.
Потом берем квадрат 16*16, сделанный из четверок и заменяем пятерки на четверки в случайном месте.
Но для плавного перехода нужно сделать проверку сперва: чтоб квадрат (16+2)*(16+2) (по полю с каждой стороны) с теми же центральными клетками, что и квадрат 16*16, не имел шестерок (у меня их вообще нет, но это для всех справедливо).
Потом берем квадрат 9*9, берем рандомный центр снова, проверяем, нет ли пятерок в квадрате 11*11 с тем же центром, что и у 9*9.
Таких квадратов можно поставить несколько.

И так далее.

В эксельке заполнял, конечно, сам, но может, комп тоже способен посчитать. Во всяком случае, ничего больше в голову не приходит.


Прочитал сам. что написал. Сумбурно... Но вдруг покажется интересным.

Короче метод "выкапывания ямы". Копать есть смысл только в уже выкопанном, а слишком глубоко в одном месте копать нельзя - осыпется. 1.gif


____________
А, если не секрет, где это должно использоваться? Что за "кораблики"?

Автор: ALexusB Nov 13 2008, 22:40

2Belphegor

Спасибо! Похоже, что нужно - действительно понять сложно, но идей вложеных квадратов с одновременной проверкой для меня свежая. Попробую.
Я до того делал просто вложенные квадраты без смещения - получались египетские пирамиды под водой smile.gif

2os_

Нет, самой амебы нет - ее еще сделать нужно
Вариант закидать небольшой квадрат рандомом - нормально - будут дыры, но быры соседней глубиной. Сойдет - это даже лучше, типа неоднородности.

Автор: Destynar Nov 13 2008, 22:45

Можно попробовать сделать аналог топографической карты.

Например генерится случайно на матрице n точек глубины m+/-х. От этих точек концентрически расходится повышение/понижение грунта до соприкосновения с соседней областью.

В результате получится случайная карта глубин.
Генерить соответственно можно и фигуры из 2-n точек (в форме круга, эллипса, буквы "г" и т.п.)

Автор: ALexusB Nov 13 2008, 23:07

2Destynar
Это и нужно - другое дело алгоритм всего этого.

Кстати, как переложить элипс на матрицу? Какая формула для клеток?

Можно выбирать шаблон: элипс, квадрат, и делать 2-3 мели - тогда и буква Г и Х будут сами собой

Если делать вложенные квадраты, то даже при рандоме будет прослеживаться квадратность, Потому лучше элипсом лепить - это естестеннвая форма хотя бы.

Цитата
А, если не секрет, где это должно использоваться? Что за "кораблики"?

все для того же
http://legend.seaward.ru/forum/index.php?showtopic=11912

Автор: Destynar Nov 13 2008, 23:30

Ну например:
Есть клетка матрицы (100x100), с координатами х,у. Тогда:
1. х=0, у=0
2. х=х+а, где а - случайное число от 0 до 99
3. у=у+b, где b - случайное число от 0 до 99

Получаем случайную точку на матрице.
Потом задаем этой точке глубину:

g(глубина)=m (+/-) n, где m - средняя глубина на участке (допустим 3), а n - разброс глубин (пусть будет 2).

Соответственно потом строим цикл, и повторяем его q раз (q - сложность рельефа дна) (пусть 4)

Тогда у нас 4 точки с произвольными координатами на матрице, глубиной от 1 до 5.

Далее.
Записав координаты этих точек, получаем для каждой 8 точек, которые вокруг. И устанавливаем их глубину g (+/-) 1 (на повышение грунта или на понижение)
т.е. это получается для всех точек "х (+/-) 1 or y (+/-) 1"

Соответственно для следующего круга будет
g (+/-) 2
"х (+/-) 2 or y (+/-) 2"

И так до точки, у которой g!=0 (не равно).
Тут надо подумать, правда, что делать когда разница на границе 2 и более, но это уже технический вопрос.

Ну вот как-то так.

Автор: Belphegor Nov 13 2008, 23:43

Цитата
Соответственно для следующего круга будет
g (+/-) 2
"х (+/-) 2 or y (+/-) 2"

А как? там же во втором круге уже 16 точек, потом 24 и так далее...

А еще вдруг
Цитата
т.е. это получается для всех точек "х (+/-) 1 or y (+/-) 1"

в точке будет g + 1
а потом g - 2

разница... большая...

Или я туплю.


http://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%BB%D0%B8%D0%BF%D1%81
про эллипс

Автор: Destynar Nov 13 2008, 23:54

g (глубина) - тут выбирается на повышение идет грунт или на понижение. т.е. + ИЛИ - (для всех изменений g)

насчет второго круга прав, так он будет выбирать те же 8 точек... Надо усложнить уравнение...

Автор: ALexusB Nov 14 2008, 00:07

Поправка - в идеале это должно генерится за разумное время, иначе это будет равнозначно - сделать ручками и записать, а потом грузить на лету.

Но пока себя не сдерживаем, фронт волны тоже вариант - думал (эти спиральки наматывать - и есть метод фронта волны)
"Квадратно-гнездовой" быстрее в разы, но не такой "физический" - факт.

Автор: Belphegor Nov 14 2008, 00:40

А нельзя сетку использовать не квадратную, а шестиугольную? Соты?
Они круглее и там диагоналей нет.

Автор: ALexusB Nov 14 2008, 09:45

Теоретически можно, но не в моем случае

Упраылять сотами - это не матрица (готовая структура в коде).
Это сложности перехода между клетками, это сложности преобразования координат.
И тормоза при вычислении - а мне критична скорость обработки

Автор: Serginio Nov 14 2008, 15:21

Искомый (генерируемый) объект имеет критическую кривую со значением 7 (периметр) и критические точки со значением 1 (пики или вершины мели). Количество пиков (пусть будет не более 4), а также значение высоты пика (например от 1 до 4) можно задать случайным генератором чисел. Также рандомно задаются координаты пиков. Дальше построение (генерация) объекта закладывается по принципу от пика к глубине в 8 направлениях- каждое следующее соседнее значение (Условие 1) точки должно быть равным или на единицу большим (случайная генерация) и так до достижения значения 7. Для однопиковой мели будет работать идеально, не нужно даже задавать критический периметр... Можно также задать коэффициент корреляции, чем он выше, тем круче будут откосы мели и наоборот. Не знаю как по скорости, но в математике такое будет работать. По окончании генерации мель будет иметь форму шатра с 8-ю лапами разной длины и скольугодно (рандомно) плоской вершиной.
Для многопиковых сложнее, но можно задать функцию: если два откоса мели стыкуются со значениями 4 и 6, то 6 изменить на 5 (следующую 6 при необходимости тоже на 5, до выполнения условия 1). Но здесь уже сложно для мох куриных мозгов...
Я не программист, поэтому не смейтесь, если чего не так 3.gif

Автор: Belphegor Nov 14 2008, 15:42

Ну погоди, по 8 направлениям... А промежуточные клетки на кругах, больших второго?

3 _ 2 _ 3
_ 2 1 2 _
2 2 1 1 2
_ 2 2 2 _
2 _ 3 _ 2


вот так будет после второго заполнения, если я правильно понял.
А как заполнить остаток?

Я все-таки думаю, что "сверху" заполнять слишком много условий нужно.
Нужно "снизу" - с подножия пирамидки.

Автор: Serginio Nov 14 2008, 16:18

Цитата(Belphegor @ Nov 14 2008, 16:42) *

Ну погоди, по 8 направлениям... А промежуточные клетки на кругах, больших второго?

...А как заполнить остаток?

Я все-таки думаю, что "сверху" заполнять слишком много условий нужно.
Нужно "снизу" - с подножия пирамидки.

Снизу - сложнее. Во-первых нужно задать критический периметр из множества точек. Во-вторых количество этих рандомных точек должно быть достаточно большим с определёнными взаимовлияющими значениями. Это трудоёмко для случайной генерации.
А остаток заполняется по тому же условию 1 smile.gif От оси вправо, например. И это будут не клетки на кругах, а клетки в рядах (математика, по крайней мере, так их будет трактовать).
Кроме того, ты рассматриваешь мель, как неправильный эллипс внутри поля (пусть 64*64) с замкнутой кривой периметра. Тогда мы будем иметь только песчаные банки. А если использовать случайный выбор координат пика, то вероятна возможность его размещения слишком близко к краю такого поля, тогда мы будем иметь мель с одним склоном пологим, а другим обрывающимся, условно назовём таку мель риф. Такие образования в геологии отнюдь не редки и называются "сброс" или "взброс" в зависимости от морфологии образования (поверь горному инженеру). А если не нравится риф, то задаём условие генерации координат пика - не ближе 7-10 пунктов от края поля...

Автор: Belphegor Nov 14 2008, 17:40

Цитата
А остаток заполняется по тому же условию 1 От оси вправо, например. И это будут не клетки на кругах, а клетки в рядах (математика, по крайней мере, так их будет трактовать).

Нифига не понимаю. huh.gif Главное, чтоб Алексус понял. 1.gif

3 _ 2 _ 3
_ 2 1 2 _
2 2 1 1 2
_ 2 2 2 _
2 _ 3 _ 2


Ну вот берем

и заполняем верхний ряд по правилу: пустая клетка равна или меньше на единицу клетки слева от нее

3 3 2 1 3 2
_ 2 1 2 _
2 2 1 1 2
_ 2 2 2 _
2 _ 3 _ 2


Получается так. К примеру. А это две ошибки.
Или я все-таки неправильно тебя понял? Не бейте сильно, если что...
Цитата

Кроме того, ты рассматриваешь мель, как неправильный эллипс внутри поля (пусть 64*64) с замкнутой кривой периметра.

Ну так, вроде так и спрашивалось... huh.gif
Цитата
Снизу - сложнее. Во-первых нужно задать критический периметр из множества точек. Во-вторых количество этих рандомных точек должно быть достаточно большим с определёнными взаимовлияющими значениями. Это трудоёмко для случайной генерации.

Ну квадратную систему я предложил. Периметр получается рандомный. 1.gif
Вот только квадратность. dry.gif

Автор: Serginio Nov 14 2008, 18:44

Цитата(Belphegor @ Nov 14 2008, 18:40) *

Нифига не понимаю. huh.gif Главное, чтоб Алексус понял. 1.gif

и заполняем верхний ряд по правилу: пустая клетка равна или меньше на единицу клетки слева от нее

3 3 2 1 3 2
_ 2 1 2 _
2 2 1 1 2
_ 2 2 2 _
2 _ 3 _ 2
Получается так. К примеру. А это две ошибки.
Или я все-таки неправильно тебя понял? Не бейте сильно, если что...

Уважаемые Belphegor и ALexusB. Простите, я оговорился, wallbash.gif условие 1 должно звучать так: каждое следующее соседнее значение точки должно быть равным или на единицу большим. 3.gif
Не случайно в твоём втором примере справа от центральной верхней двойки появилась 1. Значение должно быть или 2 или 3 другого быть не может... Тогда всё работает. Просто понижение уровня грунта в мели я подменил формулировкой "понижение значения цмфры", это логический казус, приведший к неправильному написанию (прочтению) условия.
Ещё раз извините...
Короче, вокруг точки со значением 1 могут находиться точки со значениями 1 или 2. Вокруг точки со значением 2 могут находиться точки со значениями 1,2 или 3. вокруг точки со значением 3 могут находиться точки со значениями 2,3 или 4 и т.д. Частично такая схема используется в игре "Сапёр"...
Если использовать такое условие в чистом виде, то мель будет формироваться вокруг пика и иметь хаотично-бугристый вид. Вид бессистемно разбросанных по болоту кочек, и на всей площади поля может не быть ни одного значения 7... Кстати, при соблюдении условия 1, такое тоже возможно unsure.gif Но это не сложно поправить...

Автор: Belphegor Nov 14 2008, 19:02

Это я ступил. Сперва понял правильно (прибавлял), а потом стал вычитать.
Но все равно, вот гляди

Цитата
Короче, вокруг точки со значением 1 могут находиться точки со значениями 1 или 2. Вокруг точки со значением 2 могут находиться точки со значениями 1,2 или 3. вокруг точки со значением 3 могут находиться точки со значениями 2,3 или 4 и т.д.

Имеем две находящиеся рядом точки - 2 и 3 и две пустые точки внизу. Допустим, что вверху где-то находится пик, поэтому заполнение идет вниз.
Если заполнение радиально.
2 3
_ _
Вокруг точки со значением 2 могут находиться точки со значениями 1,2 или 3.
допустим 2.
2 3
2 _
вокруг точки со значением 3 могут находиться точки со значениями 2,3 или 4 и т.д.
а вот если поставить 4, то первое условие нарушается и вводится ошибка
2 3
2 4

А если заполнение построчно - если расчет вести не от верхней точки, а от, к примеру, левой, то может получиться так
2 3
2 _
Вокруг точки со значением 2 могут находиться точки со значениями 1,2 или 3.
2 3
2 1

Получается хаотично-бугристый, но тут бугры чересчур крупные.
Хотя логически правильно. То есть нужно дополнительно проверять? Вот мне и кажется, что слишком много условий.

Автор: ALexusB Nov 14 2008, 19:28

Цитата
Нифига не понимаю. Главное, чтоб Алексус понял.

Я тоже не догнал

Точнее, подход от высоты (1) в глубину (7) я уже пробовал +- тапки также на понижение - это слишком сложный многопроходовый алгоритм. При этом у нас не должно быть мелей 1х1 - они не имееют смысла. Нужно минимум 7х7 + выравнивание до некой не квадратной фигуры.

То есть, нужно генерить размер мели еще, а потом от нее на понижение идти - и тут вторая трабла - 2-3 мели одновременно
Их нужно тогда генерить сперва (1), а потом выравнивать по более сложному правилу, тк будет 1-2-3-2-1
И оны перехода тоже должн быть разные, то есть
1-1-2-2-2-2-3-3-3-3-2-2-1 - то есть нет симертии.

Пока у мя в голове сложилась рабочая картина предложеноого квадратами от 7 до 1, но нужно ее загруглить.


Еще нет совершенно никакой проблемы, если мель попадет в угол карты. Просто клетки за гранью не отработают.

Автор: Serginio Nov 14 2008, 19:35

Цитата(Belphegor @ Nov 14 2008, 20:02) *

2 3
2 _
вокруг точки со значением 3 могут находиться точки со значениями 2,3 или 4 и т.д.
а вот если поставить 4, то первое условие нарушается и вводится ошибка
2 3
2 4

Ты сам себя запутываешь. Поставить 4, безусловно можно, но следуя какому алгоритму? Т.е. откуда там взялась 4? Если основная ось проходит вертикально вниз через цифру 3 в твоём примере, то цифра 4 будет находиться на основной оси и мы от неё по часовой стрелке образуем ряд, в котором у тебя почему-то уже стоит двойка (эта двой должна быть вторичной), т.е. образовываться после четвёрки, тогда сгенериться не 2, а 4 или 5 (условие 1). Если же первична твоя нижняя двойка, то работает (условие 2) вокруг двойки могут быть цифры 1, 2 или 3; но вокруг тройки (верхней) могут быть цифры 2,3 или 4, т.е. сгенериться или 2 или 3 от наложения условий.
Цитата
А если заполнение построчно - если расчет вести не от верхней точки, а от, к примеру, левой, то может получиться так
2 3
2 _
Вокруг точки со значением 2 могут находиться точки со значениями 1,2 или 3.
2 3
2 1

Здесь проще. Условие 1 гласит, что цифра должна быть равна или больше. Единицы здесь ни в каком случае не будет (если генерация идёт сверху вниз). Если же генерация идёт снизу, то не будет тройки.
Цитата
Получается хаотично-бугристый, но тут бугры чересчур крупные.
Хотя логически правильно. То есть нужно дополнительно проверять? Вот мне и кажется, что слишком много условий.

В твоих примерах не крупные бугры. Здесь противоречие. Как математическое, так и логическое. Между глубиной 1 метр и глубиной 3 метра обязательно существует точка с глубиной 2 метра. Даже в случае вертикального размещения плоскости. Посмотри любую геологическую карту. На ней изогипсы (линии высот или глубин) никогда не пересекаются и не соединяются. В принципе что-то подобное нужно сгенерировать и здесь.
Я прекрасно вижу свою ошибку, вернее ту ситуацию, когда условия пересекутся, но, надеюсь, что поле не будет таким огромным, да и уважаемый ALexusB наверняка знает парочку волшебных слов, чтоб это отрегулировать wink.gif
Хотя не исключаю, что моя модель с точки зрения программирования - есть полная туфта и бред дилетанта.

Автор: Belphegor Nov 14 2008, 20:41

Сделал копию своей модели в Фотошопе.
Все еще квадратнее, чем я думал, зато более наглядно. Зацените.

http://ipicture.ru/Gallery/Viewfull/9119714.html

нужно увеличить число двоек и единиц.
Скругляйте теперь. 1.gif

Хотя квадрат - самая плохая форма для больших высот. Там лучше прямоугольники (если эллипс никак). Они, перекрываясь, создают более сложные формы, которые бывают скруглены.

Цитата
безусловно можно, но следуя какому алгоритму? Т.е. откуда там взялась 4?

Я и пытаюсь понять, по какому алгоритму заполнять круги.
То ли радиально по лучам от центра. Но с увеличением номера круга увеличивается кол-во нужных лучей, там не соориентируешься.
То ли по часовой стрелке кругами. Тогда круги между собой не связаны.
То ли по строкам. Тогда нужно каждый раз проверять соответствие столбцов и! диагоналей.
Как?

Автор: ALexusB Nov 14 2008, 22:12

Сделал квадратами от 7 к 1
http://online.seaward.ru/files/MapEdit.swf

Получились теже пирамиды, но уже с правильными переходами при наложении. До того у мя было наоборот от 1 к 7

Но как мы видим, ранд - фигня sad.gif
Пирамиды и есть

Автор: Tymofei Nov 15 2008, 00:30

Пирамиды получаются, потому что весь расчет работает "от вершин и далее".

ИМХО:
1) нужно сгенерить в массиве произвольное число в известном интервале:
-группа I - мели (1);
-группа II - глубины (7).

2) как верно отметил уважаемый Serginio, между пиковыми значениями должны быть промежуточные, следовательно, нужно произвести проверку, чтобы расстояние между координатами ближайших точек в полученных группах превышало 6 единиц (1-2-3-4-5-6-7-6-5-4-3-2-1).
Неудовлетворяющие условию значения исключить, группы объединить в один массив.

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

Недостатки метода:
а) на поле всегда будут мели и глубины;
б) визуальное отображение глубин на линии между соседними пиковыми значениями всегда будет равномерным;
в) для расчета глубин вдоль границ активного "поля" потребуются неотображаемые мели и глубины.
Как вариант, можно повторять уже известные значения (мели - желтые точки, "нет дна" - синие):
http://www.radikal.ru , где центральная область - активное "поле", остальные повторения - для расчета глубин по границам.

Автор: ALexusB Nov 15 2008, 02:01

Цитата
Недостатки метода:а) на поле всегда будут мели и глубины;

Не годится sad.gif
нужны фарватеры - это же все для корабликов делается, а не ради самих мелей.
Нужна чистая вода обязательно. Потому и мели с понижением дна.

Автор: ALexusB Nov 15 2008, 12:36

Начал понимать подход с реперными точками - да, может получиться.

всего высот 8, от 0 до 7
0 - это торчащие камни в цвете воды как у 1, потому я и ставил тз из 1-7, тк 0 накидать по 1 не вопрос.

Вобще, подумав (про баланс). Понимаю, что плясать только от (1) не верно в корне
Должны быть "мели" и 7-6-7 и 7-6-5-6-7 без захода в 1 вообще
Это просто и красиво и функуонально для шхуна vs линкор
То есть 1 и 0 - это скорее редкость.
1 будет переходом от суши (это вообще -1 smile.gif), а так в чистом море видимо будет до (2) не мельче.

Автор: ALexusB Nov 19 2008, 22:25

Дело сдвинулось.
Метод с реперными точками и решеткой осознал, в ехеле ручками програн на нескольких сетках 7х7 и получил в итоге те же квадратики + неясность как роботом делать промежутки, что б не было 2-4 3-5 и 5-7 стыков. Как раз про принципу игры "сапер", как и говорилось

Но пока это все делал вывел для себя замену реперам "пирамидками наоборот". Все просто - пирамидки нужны малеькие, разной высоты и не 1-2, а сотни. Тогда на выходе имеем мель произвольной формы, но вписанной в прямоугольник.
Это пока не победил.

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

Автор: Serginio Nov 20 2008, 13:03

Цитата(ALexusB @ Nov 19 2008, 23:25) *

Дело сдвинулось.
Метод с реперными точками и решеткой осознал, в ехеле ручками програн на нескольких сетках 7х7 и получил в итоге те же квадратики + неясность как роботом делать промежутки, что б не было 2-4 3-5 и 5-7 стыков. Как раз про принципу игры "сапер", как и говорилось

Чтоб не было таких стыков, генерирование цифр должно происходить линейно (например от определённой оси влево и вправо, одновременно для всех рядов поля). От другой оси генерирование идёт навстречу. Принцип один - одинаковых цифр в ряду должно быть не меньше 2 и не более 10 (чтоб склоны не были очень крутыми или очень пологими). При стыковке полей (когда заполнены уже все ячейки) идёт корректировка (проверка) в обратном направлении и изменение цифр только в сторону понижения их значения (уже без ограничени количества одинаковых цифр в ряду). Пример:
33445!55444
22334!66555
33445!66655
44566!76655
В данном примере 2 ошибки, корректировка простая: ВУо второй строке при проверке от оси ! вправо, на значение 6 будет влиять значение 4, которая слева от оси. 6 под этим влиянием изменится на 5. Следующая 6, такдже на 5.
В четвёртой строке 6 изменится на 5 под влиянием верхней четвёрки...
Бред, конечно... Но для модели, которая будет состоять из одной кривой плоскости (как простынь, разостланная на траве), больше ничего в голову не лезет.
Цитата
Но пока это все делал вывел для себя замену реперам "пирамидками наоборот". Все просто - пирамидки нужны малеькие, разной высоты и не 1-2, а сотни. Тогда на выходе имеем мель произвольной формы, но вписанной в прямоугольник.
Это пока не победил.

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

Хотел спросить. А как программа рассматривает, собственно "мель"? Как единую плоскость с координатами точек по трём осям? Или как набор плоскостей, каждая из которых имеет свой уровень (глубину)? Или там математикой (тригонометрией) и не пахнет, - а просто генерация объёмных объектов (пирамидок к примеру) в определённой последовательности (или по определённым принципам)?
Дело в том, что на Ваших примерах прямоугольных мелей явно просматривается "слоистая" их структура. Я подумал, и пока не вижу особых препятствий для того, чтоб генерировать овальные (пока в форме правильных эллипсов) слои с чётким алгоритмом. Т.е. мель будет выглядеть точно, как у Вас, только не из прямоугольников, а из эллипсов. Стыковку их можно придумать (при соблюдении некоторого условия, вообще проблем нет). Только для этого нужно, чтоб дно (плоскость со значением 7) программой рассматривалось, как плоскость координат.
Если это возможно, то готов завтра к вечеру математически описАть алгоритм построения.

Автор: ALexusB Nov 20 2008, 13:27

Все верно- плоскость и есть. матрица двумерная. Значение и есть глубина.

Так что идея с эллипсами годится - мне нужен понятный алгоритм рисования эллипса по клеткам. Ну и соотв другие идеи.

В игре проверяется реальная координата корабля (его части, тк он больше клетки матрицы) на пересечение с матрицей мели. Вот и все.

Если отойти от матрицы и рисовать фигуры в реальный координатах, я потом не пойму, где мель. Если только по пикселям не считывать цвет. Но в визуальном плане дно сильно заблёрено и накрыто анимацией волн, так что лучше матрицу.
Но рассмотреть можно и реальные коорд, если это действительно проще. А потом их как-то в матрицу перевести. Типа как переводят фотографии в полотно для вышивания крестиком (то есть матрицу)
на минимапе у меня 1х1 пиксель = клетки матрицы. Так что если рисовать на минимапе, а потом его по пикселям перевести в матрицу - то и будет результат!

Вощем, канает подход - слушаю!

Автор: Serginio Nov 20 2008, 13:41

Цитата(ALexusB @ Nov 20 2008, 14:27) *

... Значение и есть глубина.

...Если отойти от матрицы и рисовать фигуры в реальный координатах, я потом не пойму, где мель. Если только по пикселям не считывать цвет.

Для каждого значения (глубины) будет своя плоскость (вернее её часть в виде эллипса). Соответственно объекты лежащие в разных плоскостях имеют разный цвет (как у Вас на минимапе). Это не есть проблема.
Короче, занимаюсь...

Автор: os_ Dec 11 2008, 15:37

2 варианта генерации поверхности дна.


Прикрепленные файлы
Прикрепленный файл  dno.rar ( 5.85 килобайт ) Кол-во скачиваний: 381

Автор: ALexusB Dec 11 2008, 17:16

Наглядно, спасибо.

А если от середины плясать а не от угла по диагонали?
Как быть - перевернуть алгоритм в др сторону?
И как задать рандомную площадку кляксевидной формы, от которой плясать?

Автор: Serginio Dec 11 2008, 18:03

Цитата(os_ @ Dec 11 2008, 16:37) *

2 варианта генерации поверхности дна.

Конкретная работа. Но это Exel.
Если получится что-то подобное в PHP, то можно будет пробовать развивать. Здесь инструментарий ограничен, программа не хочет хавать всё, что мы от неё требуем.

Автор: os_ Dec 11 2008, 19:55

Можно и от середины плясать. Но для меня не совсем ясна задача, точнее её конечные визуальные условия. И просветите, что такое PHP?

Автор: ALexusB Dec 11 2008, 20:15

PHP - это http://ru.wikipedia.org/wiki/Php язык программирования для ВЕБ.
Например, скрипты этого форума - РНР и есть (см в строку адреса, на разрешение в конце)

Мель должна генерится в РНР, а отрисовываться во флаш.
Отрисовку по матрице уже сделал, с ней проблем нет вообще. Нужно матрицк нагенерить - пример где-то выше показывал.

Автор: os_ Dec 15 2008, 14:48

ИМХО оптимальный вариант:
Создать несколько базовых форм различной конфигурации «амеб», «ромашек». Каждую из фигур выводить на экран, по принципу "детской пирамидки", разным цветом и разным размером (масштабировать), в зависимости от глубины – чем глубже, тем крупнее и темнее. Тогда отпадает необходимость сложного механизма генерации самой формы. Остается случайным образом определить координаты каждой формы и построить на этом месте "пирамидку".


Прикрепленные изображения
Прикрепленное изображение

Автор: m-traxx Dec 15 2008, 16:35

Цитата(os_ @ Dec 15 2008, 14:48) *

ИМХО оптимальный вариант:

Надо ещё учесть, что основное количество мелей, это не холмики и рифы.
Чаще всего это песчаные мели, косы.
Они очень узкие и длинные.
Морская прибрежная зона не бывает усеяна "холмиками".
Не без этого конечно... но преобладать они не должны.
Приливы-отливы создают длинные песчаные образования.

Автор: Scatimon Dec 16 2008, 09:27

Цитата(os_ @ Dec 15 2008, 14:48) *

ИМХО оптимальный вариант:

Ну и будут опять одни пирамиды, тока вот такой формы. blink.gif Смысл в том чтобы не повторялось дно.

Автор: os_ Dec 16 2008, 15:29

Спрайты могут применяться для оптимизации графического ядра, когда отрисовка трёхмерной детализованной модели слишком накладна и может привести к сильному падению скорости рендеринга.

На 3D-акселераторах применяется такая техника: объект рисуется в виде плоскости с наложенной на неё текстурой с прозрачными областями...
http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D1%80%D0%B0%D0%B9%D1%82_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0)


Если сделать набор разнообразных «профилей», да ещё с прозрачными областями, тогда и картинка будет реально смотреться.
Примерно так будет выглядеть через слой воды:


Прикрепленные изображения
Прикрепленное изображение

Автор: Serginio Dec 16 2008, 17:57

Цитата(os_ @ Dec 16 2008, 16:29) *

Спрайты могут применяться для оптимизации графического ядра, когда отрисовка трёхмерной детализованной модели слишком накладна и может привести к сильному падению скорости рендеринга.

На 3D-акселераторах применяется такая техника: объект рисуется в виде плоскости с наложенной на неё текстурой с прозрачными областями...

Нужен не рисунок, а объект имеющий высоту, на которую бы реагировали модельки шипов.

Автор: ALexusB Dec 21 2008, 16:42

Оно (дно) и сейчас в моей двиге не плохо смотрится (там же еще слой волн). Другое дело -нужна матрица самих высот. Что б понимать стукается корабль или нет. А отрисовка этой матрицы - уже сделано.
Похоже на приведенный выше рисунок, кстати smile.gif

Автор: TAHAT Dec 21 2008, 22:41

Человек на твоей задаче магистерскую работу защитил... и статью написал: http://3daccelerator.com.ua/articles/3dlandshaft.html

Автор: ALexusB Dec 22 2008, 16:22

Спасибо за статью!!!
накидаю несколько вариантов - покажу результаты по алгоритмам

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

Автор: ALexusB Dec 22 2008, 22:44

Получилось
http://dev.seaward.ru/File/MapEdit_1.swf

рельеф есть - факт. Баланса для карты нет - тоже факт. Фарватера нет или нужно глубин вводить больше.

Тут не совсем приведенный алгоритм, скорее тасовка нормализаций и сдвигов высот.

Еще повожусь и подберу нужное
Можно настройкой играться - совсем мелко или глубоко.

В целом, я удовлетворен - работает шустро, визуально приемлимо, осталось только протности задавать, чтоб густо-пусто было. Типа пирамидок рендомной формы.

Автор: N.tony Jun 6 2009, 13:41

Если я не сильно поздно, я бы тоже предложил smile.gif

Если вам нужна модель дна, не пристыкованного к суше (т.е. без начально заданных краев с некоторых сторон), то можно использовать простейший способ а-ля "карта высот":
В фотошопе есть специально обученный фильтр "облака". Создав новый файл нужного размера, просто применить черно-белый вариант облаков, а затем проскейлить цвет каждой точки (белый -> 1, черный -> 7). В результате получится, в общем-то, то что надо:


Прикрепленные изображения
Прикрепленное изображение

Автор: Tymofei Jun 6 2009, 14:02

Цитата(N.tony @ Jun 6 2009, 14:41) *
Если я не сильно поздно, я бы тоже предложил smile.gif
Мулька в том, чтобы визуально отображались математические значения.
Если возвращать значения глубин по распознаванию цветов получится не айс - метод будет медленным, ИМХО.

Автор: N.tony Jun 6 2009, 14:11

Цитата(Tymofei @ Jun 6 2009, 13:02) *

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

Если сохранять изображение как серый битмап, то в итоге там и будет матрица со значением 0-255 для каждой точки. Распознавать ничего, собственно, не надо:
Код
7-H=(X-S)/Y

Где H - итоговое значение глубины, X - значение, записанное в битмапе, S - шифт для сдвига всего изображения в более "глубокую" область, а Y - собственно, коэффициент. Он считается как-то типа (255-S)/7, ну а потом просто надо округлить правую часть и отрицательные значения делать нулем.

Как-то так.

Автор: ALexusB Jun 6 2009, 21:36

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

Автор: N.tony Jun 6 2009, 23:08

Цитата(ALexusB @ Jun 6 2009, 20:36) *

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

Ну, это же только первый набросок, так сказать smile.gif Вторым шагом идет изучение реализации фильтра "облака" в фотошопе и попытка создания упрощенного алгоритма для ваших нужд.

Я вот так сильно заинтересовался этим вопросом, что даже почитал литературы:
http://oddlabs.com/jo/terrain/Realtime%20Procedural%20Terrain%20Generation.pdf

В целом, покопавшись немного, заалгоритмил метод midpoint displacement, с помощью которого получается примерно такая картина.

Upd Еще добавлю анимашку про то как оно получается smile.gif У меня параметры смещения для новых точек сильно зависят от итерации, т.е. основной рельеф появляется уже в самом начале, а дальше добавляются только штрихи. Можно изменить веса так, чтобы мели генерировались итерации на третьей-четвертой, тогда может получиться более хаотически.

Вот ведь мне делать нечего по выходным...


Прикрепленные изображения
Прикрепленное изображение Прикрепленное изображение

Автор: N.tony Jun 9 2009, 00:40

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

На момент, видимо, сделать что-то существенно лучше с midpoint displacement не получится - и так на картинке видно, что из-за ненатурального изменения параметров появляются небольшие артефакты в виде горизонтальных и вертикальных "дорожек".

Дальше только если подключать, например, диаграммы Вороного - это, в целом, как раз для изначального засеивания поля мелями, а затем уже использования смещений для "шума". Боюсь, пока заалгоритмить эту штуку я не смогу - надобно читать умные книжки, а это не так увлекательно smile.gif

З.Ы. http://dev.seaward.ru/File/MapEdit_1.swf отчего-то не работает, поэтому я не в курсе какой у вас был предыдущий результат. Собственно, хочется спросить - то, что у меня получается, оно положительные эмоции вызывает?


Прикрепленные изображения
Прикрепленное изображение

Автор: ALexusB Jul 4 2009, 19:12

Результат впечатляет, особенно анимированное масштабирование.

Другое дело, что начав делать не конкретные заготовки и набирать возможности под игру, а спланировав конкретные модули, БД и сетевое общение, я понял, что мели - это делекое будущее.
Они ж на ИИ тоже влияют, а у меня пока даже тупого нет.

Реальный генератор ландшафта красив, я выше по ссылкам делал как пример - но это не играбельно sad.gif
Приведенное в #49 тоже не играбельно в силу того, что на такой карте низя играть - она не в балансе.

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

Пока мне видится генератор карт из нарисованных руками мелей (шаблонов)
Сам шаблон может генерится по формулам, а потом руками его "принять, не принять".
Мелей в сумме должна быть не более 20% карты и должны быть явные фарватеры для кораблей

Автор: Serginio Jul 4 2009, 20:08

Цитата(ALexusB @ Jul 4 2009, 19:12) *
Мелей в сумме должна быть не более 20% карты и должны быть явные фарватеры для кораблей

Если в генератор засунуть не 7 высот, а скажем 10-12, и утопить ландшафт до самой верхней отметки, то дорожки-фарватеры появятся сами собой. Там, где преобладать будут глубокие значения пикселов wink.gif

Попробуй мысленно притопить карту из #49 и мелкому кораблику будет раздолье, а крупный тоже сможет вывернуться, но уже с трудом...

Автор: ALexusB Jul 4 2009, 21:31

Тоже делал, делал по 20-30 высот и обрезал по 7, типа как горы задить водой - будут острова-мели

Токо получается криво - квадратики большие, высот мало, а генерится оно "естественно", то есть просто пятнами перехода

Пирамидка в виде основания облочка не получается этим генератором. Ее проще самому нарисовать (шгаблоны) разных форм.

Автор: Serginio Jul 4 2009, 21:47

Цитата(ALexusB @ Jul 4 2009, 21:31) *
Тоже делал, делал по 20-30 высот и обрезал по 7, типа как горы задить водой - будут острова-мели

Токо получается криво - квадратики большие, высот мало, а генерится оно "естественно", то есть просто пятнами перехода

Пирамидка в виде основания облочка не получается этим генератором. Ее проще самому нарисовать (шгаблоны) разных форм.

Хм. То, что высот мало - решаемо. Нужно не только низ обрезать, а и верх. Тогда мель будет не в виде пика, а в виде какого-то пятна. Типа была пирамидка над водой, потом море верхушку обрушило до уровня воды (срезало).
Квадратики большие - вроде от масштаба зависит.
А форма основания не критична, более критична пологость склонов. Дальше пусть рандомно расползается.

Мне в этом плане понравилась система, которую Танат подсказал (по ссылке). Ещё зимой смотрел. Там можно изощратся по всякому.

Автор: N.tony Jul 4 2009, 23:00

Цитата(ALexusB @ Jul 4 2009, 18:12) *

Мелей в сумме должна быть не более 20% карты и должны быть явные фарватеры для кораблей
Если под мелями тут имеется в виду любая точка с высотой меньше 7, то 20% - это как-то маловато...
Обрезать-то можно по-всякому, но получится, например, вот так:


Прикрепленные изображения
Прикрепленное изображение

Автор: Serginio Jul 4 2009, 23:22

Цитата(N.tony @ Jul 4 2009, 23:00) *
Если под мелями тут имеется в виду любая точка с высотой меньше 7, то 20% - это как-то маловато...
Обрезать-то можно по-всякому, но получится, например, вот так:

Не-не. 20% - это самый гут. Вот, если бы на этой мигающей картинке ещё мелкие точки убрать (алгоритмом), а оставить только крупные пятна мелей, то было бы очень похоже на правду.

Автор: ALexusB Jan 2 2011, 23:21

Анимация воды на флаше. Линки давал когда-то, раз тему восстановили вопросом про волны, то освежим
http://xitri.com/2008/05/05/more-vody-programmnaya-animaciya-i-ne-tolko.html
http://xitri.com/2008/05/10/foam-water-main-secret.html

Я пробовал пару способов, но уперся в тормоза. Нужно мудрить слоем размером с экран, а не все поле локации делать с водой.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)