Как состыковать узоры на сторонах 3D-объекта?

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

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

628573faeb8ec543102991.gif

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

Мне бы хотелось знать, какие есть подходы к реализации такой задачи? Какие существуют алгоритмы? Что почитать/посмотреть на эту тему?
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Два варианта, или научитесь генерировать узоры с заданными одной или несколькими границами, или распрямите вашу фигуру в плоскость, сгенерируйте на ней один большой узор и потом распилите на части.

В первом способе можно обходом в ширину пройтись по граням, скопировать в текущую грань границу соседних узоров и генерировать в текущем квадрате.

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

Доя этого используйте структуру данных непересекающиеся множества (disjoint set union). При добавлении ребра объединяйте два множества. Ребро можно добавить, только если оно между разными множествами. Вместо выбора случайного ребра - советую взять массив всех ребер и случайно перемешать его. Потом в таком порядке добавлять ребра, если можно.

Второй способ с выпрямлением имеет точно такой же алгоритм генерации лабиринта, но там решотка уже не прямоуголная, а на основе ромбов. Надо только порисовать и аккуратно ввести систему координат и понять формулы, какие координаты у 4 соседних точек в решотке и какие точки относятся к какой грани. А потом опять DSU и случайные ребра.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
Взять обычный алгоритм генерации клеточного лабиринта, например, https://habr.com/ru/post/321210/
Только у тебя будет дополнительное условие - крайние клетки грани считаются смежными с крайними клетками соседней грани.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы