Pull to refresh

Comments 10

Содержание статьи, видимо, интересно и может быть даже довольно практически полезно для меня лично. Но, к сожалению, статья вовсе не рассчитана на то, чтобы я её понял. Она будет понятна только очень узкому кругу читателей, которые уже запанибрата с marching cubes (мне, например, понадобится провести некоторое время в википедии и других источниках, чтобы вспомнить, что этот алгоритм вообще делает) и другими тонкостями темы. Чтобы статья читалась лучше, она должна быть лучше структурирована. Нужно введение, в котором объясняется, что и как вообще делает предложенный алгоритм, начиная с основной идеи, изложенной в том числе с помощью предельно понятных схематичных иллюстраций. Не стоит исходить из предположения, что читатель в деталях знаком с тем же алгоритмом marching cubes: следует вкратце изложить, для чего он нужен, на каком принципе основан и привести ссылку на более подробное описание для интересующихся. Далеко не каждый заинтересовавшийся будет использовать именно JavaScript, многие с этим языком попросту незнакомы, поэтому желательно изложить суть и особенности реализации алгоритма так, чтобы свести к минимуму иллюстративную роль фрагментов кода.
Статья рассчитана чтобы ее поняло большинство, а не конкретно вы. (Здесь не частные уроки, а общий материал, с котором как и везде при самообучении придется разбираться) Стоит это того или нет должно быть ясно из краткого вступления, перечисляющего возможности алгоритма, скриншотов результата и живой демки.

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

И еще раз спасибо вам за конструктив, вы мне очень помогли!
Попробуйте вдумчиво поиграть с лайв демо: http://codepen.io/impfromliga/debug/qNOazj
Это может дать интуитивное понимание того что я не учел, и того на что я не могу ответить из вашего вопроса.
Пожалуй стоит расписать подробнее наивный алгоритм, это может прояснить понимание.
Каюсь, было что дополнить сразу не учел, в текст внесено дополнение (цитирую):

«Наивный подход заключался бы в обходе всех саб-клеток с проверкой на равенство с текущей клеткой её 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 рендером можно рисовать в принципе только "края", поверх базового слоя тайлкарты, которые выделять блендингом

Sign up to leave a comment.

Articles