Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Тайлинг прямоуголников со скругленными краями (http://www.flasher.ru/forum/showthread.php?t=206073)

Furinax 10.01.2014 19:46

Тайлинг прямоуголников со скругленными краями
 
В общем, есть у меня такая нарезка из 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) для проверки каждого возможного случая какой тайл надо поставить на данную позицию.
Прошу помочь найти изящное решение для этой задачи.

ChuwY 10.01.2014 20:46

Вечером попробую сделать.
Кстати, у вас не хватает еще 3 тайлов для краев стен, типа последнего.
Ну или наоборот слишком много картинок, в том случае, если их можно поворачивать.

Furinax 10.01.2014 20:58

Да тут нету жесткой привязки к количеству тайлов. Можно всегда добавить недостающие.
Поворачивать я задумал под конец, когда буду все это дело оптимизировать.
А вот найти/придумать алгоритм, который меня избавит почти от сотни if`ов как раз первый шаг к оптимизации.
Сначала мне эта задача тоже показалась очень легкой, но вот ничего кроме быдло-решения найти не смог.

Akopalipsis 11.01.2014 00:37

А почему Вы говорите о ста ифоф, если нужно проверять только четыре или пять.
Сначала я подумал, что Вы хотите рамку сделать, а причитался и мне кажется, что тут алгоритм поиска путей подойдет. Проверять нужно только значения окружающих ячеек, которых только четыре может быть.

Isfet 11.01.2014 08:14

я бы каждому тайлу присвоил значение( хранил их в ключевом массиве допустим) такого формата:
Код AS3:

arr["1000"]  = tile;

где "1000" - это набор из стен в тайле (верх/право/низ/лево).
Затем проверял ближайшие тайлы и составлял эту строку. и по ней вытаскивал необходимый тайл

KumoKairo 11.01.2014 11:31

В принципе согласен с предыдущими комментаторами, но мне интересно, что делать с диагональными тайлами (кстати, Isfet, тайл - это tile. tail - это хвост :) ) В задании о таких случаях ничего не сказано. Считать оба таких тайла конечными? Но тогда если это какое-то подобие уровня, то на примере вашей "карты" будет много кусков, до которых никак не получится добраться

Isfet 11.01.2014 11:45

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

Wolsh 11.01.2014 13:16

Я вижу что скругляются только внешние углы. А что с внутренними?
Простой пример: как будет выглядеть дырка
1 1 1
1 0 1
1 1 1

Furinax 11.01.2014 13:31

Цитата:

Сообщение от Wolsh (Сообщение 1157009)
Я вижу что скругляются только внешние углы. А что с внутренними?
Простой пример: как будет выглядеть дырка
1 1 1
1 0 1
1 1 1

Внутренние углы не скругленные. Главное, чтобы вокруг дырки образовалась обводка.
На первый взгляд задача кажетя очень простой, но что-о ни одного решения в гугле найти не удалось.
Я делал следющим образом:проверял все восемь тайлов вокруг и выбирал нужный тайл, соответственно получилась огромная куча if`ов типа
Код AS3:

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")
}

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

Цитата:

Сообщение от Akopalipsis (Сообщение 1156992)
А почему Вы говорите о ста ифоф, если нужно проверять только четыре или пять.
Сначала я подумал, что Вы хотите рамку сделать, а причитался и мне кажется, что тут алгоритм поиска путей подойдет. Проверять нужно только значения окружающих ячеек, которых только четыре может быть.

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

Isfet 11.01.2014 13:52

покажите скрин как должна выглядеть карта по вашей маске,
а вообще задача абсолютно простая, прочитайте мой пост выше, храните тайлы как я писал выше, проверяете 4 ячейки слева справа сверху и снизу, и составляете строку, допустим если такой вариант:
--0
1 1 1
--0

сверху 0 значит там будет стенка , пишем в строку 1, справа 1 , значит там нет стенки, добавляем в строку "0" , получаем "10" , снизу 0 - > "101" , слева 1 - > "1010",

по полученной строке вытаскиваем тайл из массива

Код AS3:

tile = arr["1010"];



Часовой пояс GMT +4, время: 06:44.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.