![]() |
Тайлинг прямоуголников со скругленными краями
В общем, есть у меня такая нарезка из 12 тайлов.
https://api.monosnap.com/image/downl...g2nQgh6NebPSsv На вход получаю сетку в виде: [ [0, 1, 1, 0, 0, 0, 1, 1, 0], [1, 1, 0, 1, 1, 1, 0, 1, 1], [1, 1, 0, 0, 0, 1, 0, 1, 1], [1, 1, 0, 0, 0, 1, 0, 1, 1], [1, 0, 1, 1, 1, 1, 1, 0, 1], [1, 1, 1, 0, 0, 1, 1, 1, 1], [1, 1, 1, 0, 0, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 1, 0, 1, 1, 1, 0, 1, 0] ] Где 0 - это пустая ячейка. А 1 - это ячейка на которой есть тайл. Задача состоит в том, чтобы по имеющимся данным построить из данных тайлов поле. Пытался нагуглить какой-нибудь хитрый алгоритм для этого, но ничего не нашел. Удалось написать это самому, но с очень большим количеством if`ов(что-то около 100) для проверки каждого возможного случая какой тайл надо поставить на данную позицию. Прошу помочь найти изящное решение для этой задачи. |
Вечером попробую сделать.
Кстати, у вас не хватает еще 3 тайлов для краев стен, типа последнего. Ну или наоборот слишком много картинок, в том случае, если их можно поворачивать. |
Да тут нету жесткой привязки к количеству тайлов. Можно всегда добавить недостающие.
Поворачивать я задумал под конец, когда буду все это дело оптимизировать. А вот найти/придумать алгоритм, который меня избавит почти от сотни if`ов как раз первый шаг к оптимизации. Сначала мне эта задача тоже показалась очень легкой, но вот ничего кроме быдло-решения найти не смог. |
А почему Вы говорите о ста ифоф, если нужно проверять только четыре или пять.
Сначала я подумал, что Вы хотите рамку сделать, а причитался и мне кажется, что тут алгоритм поиска путей подойдет. Проверять нужно только значения окружающих ячеек, которых только четыре может быть. |
я бы каждому тайлу присвоил значение( хранил их в ключевом массиве допустим) такого формата:
Код AS3:
Затем проверял ближайшие тайлы и составлял эту строку. и по ней вытаскивал необходимый тайл |
В принципе согласен с предыдущими комментаторами, но мне интересно, что делать с диагональными тайлами (кстати, Isfet, тайл - это tile. tail - это хвост :) ) В задании о таких случаях ничего не сказано. Считать оба таких тайла конечными? Но тогда если это какое-то подобие уровня, то на примере вашей "карты" будет много кусков, до которых никак не получится добраться
|
да согласен - условия недостаточные, хотелось бы выдеть конечный результат (карту) по этой сетке, тогда можно будет сказать что-то конкретнее.
|
Я вижу что скругляются только внешние углы. А что с внутренними?
Простой пример: как будет выглядеть дырка 1 1 1 1 0 1 1 1 1 |
Цитата:
На первый взгляд задача кажетя очень простой, но что-о ни одного решения в гугле найти не удалось. Я делал следющим образом:проверял все восемь тайлов вокруг и выбирал нужный тайл, соответственно получилась огромная куча if`ов типа Код AS3:
Цитата:
Причем здесь алгоритм поиска путей? Я не ищу путь, от одной ячейки к другой, я на основе анализа окружающих ячеек пытаюсь выяснить какой тайл поставить на определенную позицию. То что это можно сделать проверяю значения окружающих ячеек - это очень и очень очевидно, только их может быть не только 4, а всегда 8. И из этих восьми какие-то могут быть пустые. Поэтому в случае с пустыми надо понять - отрисовывать прямоугольник со кругленными краями или простой без обводки или еще какой другой. |
покажите скрин как должна выглядеть карта по вашей маске,
а вообще задача абсолютно простая, прочитайте мой пост выше, храните тайлы как я писал выше, проверяете 4 ячейки слева справа сверху и снизу, и составляете строку, допустим если такой вариант: --0 1 1 1 --0 сверху 0 значит там будет стенка , пишем в строку 1, справа 1 , значит там нет стенки, добавляем в строку "0" , получаем "10" , снизу 0 - > "101" , слева 1 - > "1010", по полученной строке вытаскиваем тайл из массива Код AS3:
|
Цитата:
Цитата:
Цитата:
Код AS3:
|
это не массив всевозможных комбинаций (а их 256), это массив который хранит данные о том, с какой стороны у вашего тайла-картинки - есть стена. допусти левый верхний тайл из вашего изображения должен лежать в ячейке arr["0011"]
|
Тут вот про генерацию пазла и внизу пример, может Вам пригодится.
|
Цитата:
А как мне понять, что, допустим надо в arr["1111"] положить именно FieldTileMM.png, самому предварительно рассмотрев все случаи "на глаз"? Цитата:
|
массив будет с вашим количеством тайлом, то есть 12, и класть их туда нужно относительно стен в рисунке тайла
|
Цитата:
Или Вы как то насчитали, что у Вас элементов будет больше чем картинок?? |
Решал похожую задачу, только строил границу отдельно от тайлов, как в этом приложении https://apps.facebook.com/farmheroes. Не совсем то, что тебе надо, но если сгодится опишу как построить. По твоей задаче, я бы разбил каждый из тайлов на четыре участка. Получилось бы всего три разных типа: две линии и уголок. Тип каждого участка зависел бы от наличия соседних с этим участком тайлов. У меня по моей задаче это выглядит как-то так:
Код AS3:
|
Почему не сделать просто восьми(четырех?)мерный массив со ссылками на тайлы? То есть не непонятный какой то arr["1010"] а arr[1][0][1][0]. И никаких if'ов.
А, понял в чем проблема. Вам же мало знать, что вверху 1. Вам надо знать, какого типа там тайл. Это вообще ТАК не решается. |
Цитата:
|
я бы собирал эти тайлы 'на лету' из 9ти элементов
навскидку попробовал упрощенный вариант, на самом деле все будет сложнее из-за линий каймы, но всяко проще, чем собирать из готовых, да и многовато их нужно, имхо 256(2^8), ну может за вычетом каких-то нереальных, но никак не 12 же Код AS3:
|
Вложений: 2
|
Вложений: 1
вот решение без запихивания в массив, но можно и в массив положить
Код AS3:
Итого получаем 16 тайлов, и соответственно если класть в массив будет 16 элементов, а не 256 как вы многократно твердили |
Ребят, всем большое спасибо за помощь, очень интересные решения.
silin, udaff, это реально гениально, вместо того, чтобы увеличивать количество тайлов - наоборот уменьшить да еще и затайлить их самих, никогда бы не догадался), по настоящему изящные решения. Isfet, извиняюсь и признаю, что был не прав. Мне почему-то проблематично визуально представить все возможные виды тайлов. Могли бы вы, пожалуйста, поделиться картинкой со всеми видами тайлов? Я собираюсь использовать решение silin`а, дописав обводку. Но все равно очень интересно как у вас сделано. |
Isfet, дада не 256, сори
256 это всего возможных, а их в таком раскладе просто нет и твое решение может и поудобнее будет но если придется, например, еще 'внутренние' скругления (в дырках) учесть, то вариантов прибавится.. хотел по-простому вариант с бордюром нарисовать, но по-простому не выходит - надо еще и диагональные клетки анализировать Код AS3:
|
Вложений: 1
вот виды тайлов на вашем примере
Вложение 30361 название тайла отображает наличие стен в нем, в порядке, как в margin в html (top/right/bottom/left). вообще это решение - по конкретную задачу, если нужны внутренние скругления и универсальность, тогда уже конечно нужно каждый тайл конструировать программно. |
| Часовой пояс GMT +4, время: 08:02. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.