|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
Тайлинг прямоуголников со скругленными краями
В общем, есть у меня такая нарезка из 12 тайлов.
На вход получаю сетку в виде: [ [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 тайлов для краев стен, типа последнего. Ну или наоборот слишком много картинок, в том случае, если их можно поворачивать.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
Да тут нету жесткой привязки к количеству тайлов. Можно всегда добавить недостающие.
Поворачивать я задумал под конец, когда буду все это дело оптимизировать. А вот найти/придумать алгоритм, который меня избавит почти от сотни if`ов как раз первый шаг к оптимизации. Сначала мне эта задача тоже показалась очень легкой, но вот ничего кроме быдло-решения найти не смог. |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
А почему Вы говорите о ста ифоф, если нужно проверять только четыре или пять.
Сначала я подумал, что Вы хотите рамку сделать, а причитался и мне кажется, что тут алгоритм поиска путей подойдет. Проверять нужно только значения окружающих ячеек, которых только четыре может быть. |
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
я бы каждому тайлу присвоил значение( хранил их в ключевом массиве допустим) такого формата:
где "1000" - это набор из стен в тайле (верх/право/низ/лево). Затем проверял ближайшие тайлы и составлял эту строку. и по ней вытаскивал необходимый тайл Последний раз редактировалось Isfet; 11.01.2014 в 11:42. |
|
|||||
В принципе согласен с предыдущими комментаторами, но мне интересно, что делать с диагональными тайлами (кстати, Isfet, тайл - это tile. tail - это хвост ) В задании о таких случаях ничего не сказано. Считать оба таких тайла конечными? Но тогда если это какое-то подобие уровня, то на примере вашей "карты" будет много кусков, до которых никак не получится добраться
|
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
да согласен - условия недостаточные, хотелось бы выдеть конечный результат (карту) по этой сетке, тогда можно будет сказать что-то конкретнее.
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Я вижу что скругляются только внешние углы. А что с внутренними?
Простой пример: как будет выглядеть дырка 1 1 1 1 0 1 1 1 1
__________________
Reality.getBounds(this); |
|
|||||
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
Цитата:
На первый взгляд задача кажетя очень простой, но что-о ни одного решения в гугле найти не удалось. Я делал следющим образом:проверял все восемь тайлов вокруг и выбирал нужный тайл, соответственно получилась огромная куча if`ов типа if(topLeft && top && topRight && right && left && bottomLeft && top && bottomTight) { return тайл без обводки каких либо обводок } else if(!topLeft && top && topRight && right && left && bottomLeft && top && bottomTight) { return еще какой-то тайл } else if(!topLeft && !top && topRight && right && left && bottomLeft && top && bottomTight) { return еще какой-то тайл } else { throw new Error("такой случай не определен - допиши новый if") } Цитата:
Причем здесь алгоритм поиска путей? Я не ищу путь, от одной ячейки к другой, я на основе анализа окружающих ячеек пытаюсь выяснить какой тайл поставить на определенную позицию. То что это можно сделать проверяю значения окружающих ячеек - это очень и очень очевидно, только их может быть не только 4, а всегда 8. И из этих восьми какие-то могут быть пустые. Поэтому в случае с пустыми надо понять - отрисовывать прямоугольник со кругленными краями или простой без обводки или еще какой другой. |
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
покажите скрин как должна выглядеть карта по вашей маске,
а вообще задача абсолютно простая, прочитайте мой пост выше, храните тайлы как я писал выше, проверяете 4 ячейки слева справа сверху и снизу, и составляете строку, допустим если такой вариант: --0 1 1 1 --0 сверху 0 значит там будет стенка , пишем в строку 1, справа 1 , значит там нет стенки, добавляем в строку "0" , получаем "10" , снизу 0 - > "101" , слева 1 - > "1010", по полученной строке вытаскиваем тайл из массива |
Часовой пояс GMT +4, время: 17:15. |
|
« Предыдущая тема | Следующая тема » |
|
|