Я бы хотел создать плоские острова, существующие в нескольких шестиугольниках. До сих пор мне удалось создать гексагональные сетки с кодом, но не могу понять, как позиционировать их в группах, создавая случайный остров. (Любая форма, которая не является идеальным кругом, квадратом и т. Д.) Я думаю, мне нужен алгоритм, который помещает шестиугольные плитки рядом с несколькими сторонами существующей плитки. Если вы можете помочь мне с идеей для алгоритма, тогда это будет здорово.Генерировать гексагональные острова
ответ
Вы ищете что-то вроде этого?
Place 1 hexagon.
for i in (islandSize-1):
Scan all hexagons for open sides. Place open sides in a list named hexBorders
Choose a random index in hexBorders, attach a new hexagon there
Этот алгоритм должен дать вам довольно округлый остров, примерно по центру на оригинальном шестнадцатеричном, потому что старые гексы имеют больше шансов получить взял.
Вы можете настроить эту фигуру, предпочитая либо более новые, либо более старые шестиугольники (например, вы можете включить возраст шестиугольника в hexBorders и настроить свой случайный выбор, чтобы он предпочитал младшие гексы).
Спасибо, Люк, я не думал о проверке всех шестиугольников для открытых сторон каждый раз, когда он был помещен. Я только подумал о том, чтобы просто проверить только что появившиеся шестиугольники для открытых сторон, что приведет к слишком большому количеству линии. Я собираюсь попробовать это. Еще раз спасибо! – user2255273
Недавно я также делал случайный генератор диаграмм для карты на основе плитки и ударялся о стену, пытаясь добавить более сложные функции (в области плитки), реализм выхода не был хорошим. Я решил создать карту изображения на основе 2D/3D, а затем преобразовать ее в карту плитки. Все еще не закончили с добавлением всех функций, которые я хочу, но результат уже величина лучше, чем раньше:
карты генератора
видеть мою simple random map generator in C++. Он основан на Diamond & Квадратный алгоритм с некоторой настройкой для получения подобных островков карт.
преобразования в мозаичную карту
Просто карта декартово пикселя в вашу шестиугольную макет сетки. Вы также можете вычислить среднее значение для некоторой области вместо использования одиночного пикселя на ячейку/плитка.
Для 3D плитки карты это будет производить «воксельный-ованный» выход поэтому вам необходимо добавить дополнительные фильтрации см
- How to procedurally generate tile map для некоторых идей.
Поскольку это довольно открытый вопрос, this article by Red Blob Games about hexagonal data structures будет отличным местом для начала. Автор описывает, как вы можете использовать 2D-массивы для хранения шестиугольников и как вы можете проходить через них.
Как только вы понимаете отношение шестиугольников друг к другу, вы можете начать их итерацией по ним интересными способами.
Вероятно, самый простой способ для создания «острова» будет с SIR типа моделью с, также известной как модель эпидемического. Это модель, которая обычно используется исследователями для моделирования распространения инфекционных заболеваний, но я обнаружил, что вы также можете использовать ее для создания псевдоестественных форм (например, острова!). SIR означает Восприимчивый-Инфекционно-Восстановленный. Это три состояния «клетки», или в этом случае шестиугольник. На любом данном этапе алгоритма зараженная клетка может заражать соседнюю ячейку.Подумайте об этом так: в начале вашего алгоритма один шестиугольник «заражен» (земля), а остальные нет (вода). На каждой итерации алгоритма клетки, прилегающие к зараженной клетке, имеют шанс (например, 1 из 10) заразиться (превращаясь в землю). После многих итераций вы обнаружите, что форма зараженной группы шестиугольников довольно случайна, но все они трогательны. For a grid-bsed example, here's some images I've uploaded to imgur. Псевдокод для этого алгоритма приведен ниже.
cellsToDo = [originCell]
for 100 iterations:
for each cell in cellsToDo:
for each neighbor to the current cell:
if randomValueBetween(0, 10) == 1:
set the current cell as infected
add the current cell to the cellsToDo list
Есть определенно другие алгоритмы, но я хотел бы начать с обучения, как шестиугольники связаны друг с другом и могут быть сохранены.
Вы задали очень широкий вопрос (есть много способов генерации шаблонов шестиугольников!), Без четко определенной цели (какая форма острова приемлема?). Вы также предоставили два исключительных случая (половина шестиугольников и «падение от края»), не объяснив, как вы думаете, что они будут работать. Это означает, что это чрезвычайно широкий вопрос, поэтому ответы вряд ли смогут охватить все - и неясно, ищете ли вы помощь с алгоритмом или кодом или чем-то еще. Я бы посоветовал вам больше разобраться с проблемой, а затем задать более конкретный вопрос. –
@ DanPuzey Извините, Дэн, я не понимал, что это плохой вопрос. Это действительно не так сложно, как вы заставляете его звучать, хотя .. Форма, которую я ищу, - это все, что не выглядит искусственным. Поэтому нет идеального круга, квадрата, линии или треугольника. Чтобы это было просто, я уберу сглаживающие плитки. (Это просто разные формы, чтобы остров не выглядел слишком похожим на сетку) и падающий край, которые являются стенами на краю острова, которые идут вниз. Любая помощь приветствуется, так как это всего лишь идея для алгоритма или фактического кода. Я отредактирую свой вопрос. Thanks – user2255273
Есть ли что-нибудь, что вы пробовали до сих пор, чтобы решить вашу проблему? И как вы генерируете свою гексагональную сетку? До сих пор, кажется, ваш вопрос заключается в том, чтобы попросить людей написать следующую часть вашего кода, не имея возможности увидеть, что представляет собой первая часть; это вряд ли приведет к тому, что вам будет полезно (или будущим читателям!). –