Comments 10
https://ru.wikipedia.org/wiki/Marching_squares — как написано в статье, к делу не относиться! Он упомянут, что бы его НЕ читать!
Фрагменты кода в статьях я привожу на JS т.к. этот язык очень популярен и многие знают именно его (не на всех же языках код приводить). Весь код в статью был добавлен последним делом, именно в целях дополнительной понятности (и отмены необходимости скакать на гитхаб в другой вкладке).
В то же время вся суть алгоритма, на сколько мне видится, последовательно объясняется (спойлеры читают те, кто хотят углубить понимание).
Пожалуйста, лучше структурируйте ваш комментарий. Иначе, не указывая конкретно, что вам не понятно, я не смогу вам помочь.
Каких иллюстраций кроме имеющихся основных, по вашему мнению не хватает?
Что кроме имеющегося перечисления возможностей нужно внести во введение? Уже сейчас, в статье сразу после перечисления возможных применений, (без спойлеров) идет объяснение, «что и как вообще делает предложенный алгоритм», и между прочем именно с основной идеи и начиная:
— Используется очень простая схема сглаживания тайлов. Это достигается за счет переходной текстуры, которая вставляется между любыми двумя другими, тайлы переходов в которую должны быть нарисованы для всех остальных текстур.
— Алгоритм разбивает клетки на четвертинки 2х2, каждую из них заполняет более маленьким ориентированным тайлом из заготовленного набора.
Очень просто написать «я не понял, — материал слаб». Но в критике желательна конкретика.
Иначе я лишь внесу правки которые вызовут больше вопросов у других…
Кстати говоря, я ожидаю что совместно здесь, многие прояснят ситуацию и помогут действительно улучшить материал.
Для начала, если вы действительно пишете для большинства, нужно пояснять термины. Что такое тайл я худо-бедно вспомнил, а вот что такое сглаживание тайлов — непонятно. Так же непонятно что такое сабтайлы, переходные тайлы, сабклетки, логическая изолиния и т.п. Ну то есть к середине статьи (а не там, где эти термины даны) у меня появились догадки, но что если они не совпадают с тем, что вы имели в виду?
«Ясно, что «сглаживая» регулярные клетки визуально, одни будут наползать на другие.» — совсем не ясно что имеется в виду.
Есть много предложений, которые вообще написаны не по-русски.
«Это достигается за счет переходной текстуры, которая вставляется между любыми двумя другими, тайлы переходов в которую должны быть нарисованы для всех остальных текстур.» — я перечитал раз 5, но так и не понял что имеется в виду (ещё больше дезориентировало следующее предложение, в котором утверждается, что это какое-то ограничение).
Иллюстрации. Например в начале была бы уместна иллюстрация, показывающая зачем это вообще все нужно (ну то есть что этот алгоритм вообще делает).
И да, лично я ваш код так и не смог в голове распарсить.
ps. Ох, не люблю писать критику, все как-то в резких выражениях всегда получается =)
upd. И ещё, зря вы картинку обновили, и так на ней было слишком много чего и непонятно куда там нужно смотреть, а вы добавили ещё больше информации. Не нужно все валить в одну кучу.
ps. Ох, не люблю писать критику, все как-то в резких выражениях всегда получается =)
Где нужно, пусть будет резко, я не гордый.
У вас очень содержательный комментарий, огромное спасибо, уже дорабатываю!
Предложение не по-русски вообще заменил на «Используется очень простая схема сглаживания тайлов. Это достигается за счет “Диффузного круга”, части которого накладываются в места стыков разных клеток, или на стык полной клетки прилегающей к пустой.» (изображение круга лежит рядом) Это по идее, должно сразу прояснить что:
"«Ясно, что «сглаживая» регулярные клетки визуально, одни будут наползать на другие.»"
Больше иллюстраций! Отдельных по месту, в том числе и в начале.
Код вообще убрал под спойлеры, т.к. он дополнительный. Поняв часть со складыванием тайлов можно написать свою реализацию, но данный конкретный алгоритм рассматривает еще и оптовую обработку, а этого без битовой магии не получить. Описывать битовые операции это тема отдельной статьи.
Могу дать комментарий тут, — все константы работают по принципу один HEX разряд на саб-клетку. Соответственно выбираются индексы нужных клеток (с учетом того что результирующая сетка сдвинута) + верные позиции HEX разрядов содержащих данные о конкретных саб-клетках. При чтении все проще, т.к. алгоритм совершает все эти перестановки подготавливая данные к удобной работе опираясь на результирующую сетку (Об этом написано в одном из спойлеров)
цифры 2 или 8 в константах это смещения разных координат выбираемого саб-тайла от углов диффузного круга в центр
для х позиции, которая изначально может быть 0 или 3 это ^2 = 2 или 1,
для y, которая изначально 0 или 12 это ^8 = 8 или 4
И еще раз спасибо вам за конструктив, вы мне очень помогли!
Это может дать интуитивное понимание того что я не учел, и того на что я не могу ответить из вашего вопроса.
«Наивный подход заключался бы в обходе всех саб-клеток с проверкой на равенство с текущей клеткой её 2х соседей. При этом результат проверки это сдвиг координат вибираемого кусочка текстуры к центру (смотрите рис.). Изначально все четвертинки принимаются как угловые кусочки текстуры и образуют при соединении синий кружок (со всех сторон соседи синие). НЕравенство с соседом по вертикали сдвигает выбираемый кусок текстуры к центру по вертикали (на две позиции, так он выбирается следом за противоположным по вертикали углом) По горизонтали используется аналогичная проверка и сдвиг. Случай когда после проверок ничего не сдвинулось (остался целый синий круг) желательно обрабатывать как исключение и выводить целую клетку разом а не по четвертям.
Здесь наивный метод заканчивается.
(далее в коде начальная позиция тайлов и будет иметь константу 0xfc30. А сдвиги по горизонталям/вертикалям будут работать с соответствующими HEX разрядами нужных ячеек массива)»
Смотрим на рисунке «Топология зон диффузии» видим 16 кусочков тайлов из которых может составляться клетка в зависимости от соседей.
Простейшая ситуация все соседи равны (клетка составляется из краевых кусочков) можно запомнить по аналогии, — что кусочки как бы прилипают к соседям
(Пусть это начальное состояние от которого мы меняемся
Если какой-то сосед не равен, он отталкивает от себя кусочек на две позиции.
Когда все соседи проверенны и все кусочки тайла соответственно оттолкнуты можно выводить клетку этими четырьмя кусочками.
(Для эффективности можно проверить на оптовые условия например если клетка полностью целая, или полностью пустая)
я тут внезапно понял что A=B B=C C=D проверку для небольшого кол-ва текстур (ограниченного битностью каналов и математикой режимов наложения) можно сделать блендингом (что в большинстве высокоуровневых языков будет еще быстрее) для этого всего лишь надо без размытия х2 увеличенную карту наложить суммированием на себя же со сдвигом в {+1,+1} пиксель (по диагонали то бишь) если базовых текстур у вас не много, то в результате получатся данные в 2х2 квадратах где:
1-ый пиксел по сути всегда складывался с самим собой,
2-ой с правой клеткой
3-ий с клеткой ниже
4-ый с клеткой по диагонали в направлении сдвига
самое простое для примера 3 текстур можно использовать максимальной насыщенности RGB цвета для маркировки и блэндинг screen
B(Cb, Cs) = 1 - [(1 - Cb) x (1 - Cs)]
= Cb + Cs -(Cb x Cs)
https://www.w3.org/TR/compositing-1/#blendingscreen
в нем указанные цвета будут складываться однозначно в основные цвета радуги
более того даунсемплировав эти 2х2 зоны к оригинальному изображению они арифметически усредняться, что также можно использовать для быстрого "выделения края", - области которые ни с чем не пересеклись можно рисовать цельными тайлами (рендер которых у вас скорее всего уже организован базовыми техниками)
т.о. expansion рендером можно рисовать в принципе только "края", поверх базового слоя тайлкарты, которые выделять блендингом
xfcRS — оригинальный лаконичный шустрый рендер сглаженных тайлов, «expansion fast cell — Rounded Squares»