Песочный алфавит при помощи генеративных алгоритмов

Автор оригинала: Anders Hoff aka INCONVERGENT
  • Перевод
  • Tutorial
image

В посте есть результаты экспериментов с различными биологическими и физическими закономерностями, в частности песочный сплайн, дифференциальная решетка, песчаные творения и песочные знаки.

Это развитие идей из публикаций:

Визуализация при помощи генеративных алгоритмов: гифа, деревья, повторяющиеся и дифференциальные линии (на Python)

Визуализация при помощи генеративных алгоритмов: дифференциальная сетка (2D и 3D) и трещины

Однако вам необязательно читать их — все проекты, описанные здесь самодостаточны.

ПЕСОЧНЫЙ СПЛАЙН [GITHUB]


Идею песочного сплайна я почти отбросил, потому что мне казалось, что это не даст никаких интересных результатов. Тем не менее, я дал ей шанс, и в итоге остался очень доволен.

image

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

image

В этой анимации сплайн начинается справа и движется против часовой стрелки. Вы также можете заметить, чем дальше вдоль сплайна, тем больше становится уровень шума. Это не имеет ничего общего с самим сплайном, но это хороший способ сохранить исходный узел в начальном положении.

Вместо того, чтобы просто рисовать сплайн, я рисую ряд прозрачных точек вдоль линии в каждой итерации. Ещё я рисую одинаковое количество точек каждый раз, независимо от длины линии. Так как движение постепенное, высокая плотность образуется там, где линия движется медленно, а более низкая там, где линия движется быстро.

Такое поведение, и техника рисования, во многом похожи на несколько работ Тарбелла, в том числе Sand Dollar, Limb Sand Stroke, Sand traveller и Sandstroke. Отсюда и пошло название. Несколько человек указали мне, что эти образы также очень напоминают Аттрактор Лоренца, хотя метод используется немного другой.

image

Сочетание этого простого метода с различными конфигурациями сплайнов и цветов даёт огромное количество вариаций результатов, и я, вероятно, вернусь к экспериментам с ней в будущем.

ДИФФЕРЕНЦИАЛЬНАЯ РЕШЁТКА [GITHUB]


При работе над дифференциальной линией, дифференциальной сеткой и дифференциальной сеткой в 3d наиболее утомительной частью было управление структурой данных. Отчасти потому что я решил научиться использовать half-edge структуры данных в этом процессе. И ещё потому что это у меня так и не получилось. И, наконец, потому что я писал его в Cython, который был в новинку для меня.

Несмотря на всё это, я получил нормальный результат. Тем не менее, этот процесс также привёл меня к желанию создать более слабо соединённую систему. Мне казалось, что такой системой будет легче управлять. Ещё у меня была мысль, что такая система может быть похожа на слизистую плесень, так же как дифференциальная сетка более или менее похожа на лишайник.

Держа это в голове, я начал создавать дифференциальные решетки. Часть алгоритма очень похожа на дифференциальную сетку. Он состоит из соединённых узлов, и соединённые узлы пытаются оставаться близко друг к другу. Он также сохраняет принцип, когда каждый узел пытается избежать близости со всеми несвязанными узлами в определенном радиусе. Важная особенность в том, что соединения между узлами перерассчитываются перед каждой итерацией. Это означает, что нам нужен хороший способ решить, должны ли два близлежащих узла считаться соседями или нет.

Оказывается, что относительные окрестности хорошо подходят для этого. Несколько упрощённо можно сказать, что два узла являются относительными соседями, если достаточно большая область между двумя узлами не содержит других узлов.

image

Еще одна вещь, которую нужно рассмотреть в этой системе, это то, как вводятся новые узлы. В дифференциальной сетке новые узлы вводятся путем разделения краев пополам. Это один из сложных процессов half-edge структуры данных. Особенно, если вы упрямо вводили свою собственную версию структуры данных, как и я. В слабо связанной системе, такой как дифференциальная решетка, добавление нового узла — это решение позиции, ввод узла и пересчитывание соседства, как это было бы на любом этапе моделирования.

Благодаря этому вся задача сводится к решению, куда разместить новые узлы, и как часто новые узлы должны появляться. В этих примерах новые узлы появляются в областях, где локальная плотность узлов достаточно низка. Это приводит к тому, что новые узлы часто появляются за пределами существующей структуры. Получается что-то наподобие слизистой плесени, которая постепенно растет наружу.

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

image

Эта система реализована с помощью pyCUDA, что означает, что все расчеты расстояний и расчёты соседства могут быть сделаны на GPU. Поэтому это, вероятно, один из самых быстрых алгоритмов, которые я когда-либо реализовывал. Можно сделать системы с сотнями тысяч узлов удивительно быстро, с учетом количество вычислений.

Ниже изображение с около 80 000 узлами, которое было нарисовано на моём механическом плоттере.

image

ПЕСЧАНЫЕ ТВОРЕНИЯ [GITHUB]

При работе над песочными сплайнами у меня получились несколько промежуточных результатов, которые напомнили мне текст, написанный от руки/ Вместо того, чтобы напрямую пытаться сделать что-то, что выглядело бы как написанный текст, я начал экспериментировать с генерацией малых «Песчаных творений».

Я попробовал несколько разных подходов, но следующий метод привел к наиболее приятным результатам:

  • Создать несколько случайных контрольных точек из равномерного распределения, ограниченного сферой.
  • Расположить их в произвольном порядке.
  • Создать B-сплайн из контрольных точек в том же порядке.

image

Для того, чтобы добавить текстуру к формам, я делаю еще один сплайн путём клонирования первого набора контрольных точек, и немного перемещая все наугад. Потом я использую ранее упомянутую sandstroke технику, чтобы нарисовать прямые линии между одинаково расположенными точками на двух сплайнах. Таким образом, получается хорошая зернистость.

С небольшими изменениями параметров можно получить совершенно разные результаты, как например в примере ниже.

image

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

ПЕСЧАНЫЕ ЗНАКИ [GITHUB]


После того как я опубликовал нескольких своих Песчаных Творений, мне предложили попробовать сделать свой шрифт. Я не пробовал сделать это ранее, но зато пробовал различные методы создания написанного от руки текста, путем объединения нескольких песчаных творений, из предыдущего раздела. Как вы можете видеть ниже, даже очень простые комбинации песчаных творений могут создать довольно приятное асемическое письмо.

Чтобы получить представление о том, как это работает, вы можете посмотреть на изображение ниже, где выделены контрольные точки.

image

Есть ряд вещей, с которыми можно поэкспериментировать даже в этой простой конфигурации:

  • Количество контрольных точек на знак;
  • Расстояние между знаками;
  • Форма знаков;
  • Положение знаков относительно горизонтальной центральной линии;
  • Внутренний порядок контрольных точек в знаках;
  • Количество знаков в слове;
  • Как письмо делится на строки;
  • И так далее ...

Не говоря уже о том, что все эти вещи предполагают написанный слева направо, более или менее латинский, написанный от руки текст.

Ниже приведен пример одной из конфигураций, которую считаю лучшей до сих пор.

image

Есть ещё такое видео того, как мой плоттер выписывает текст.

Наконец, я хотел бы обратить ваше внимание на Lettres de ma mère, сделанную пионером генеративного искусства Верой Молнэр.
Больше работ автора можно увидеть на сайте Inconvergent

Предыдущие проекты этого же автора:


А если генеративное искусство и визуализация данных, вас заинтересовали — посмотрите другие посты degenerative_art, вот самые популярные на данный момент:


AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 32

    +8
    До последнего ожидал, что пост про расшифровку почерка докторов.
    +3
    Красиво и напоминает письменность пришельцев из фильма «Прибытие».
    Спасибо за перевод.

    Прибытие
      0
      Не говоря уже о том, что все эти вещи предполагают написанный слева направо, более или менее латинский, написанный от руки текст.


      Не совсем понял — это именно шрифт (ну или не обязательно буквально шрифт, но...), или генеративное искусство «по мотивам»? ;)

      Ну т.е. можно ли задать осмысленный текст, который так или иначе будет присутствовать в выводе и потом попробовать его расшифровать, используя частотный анализ и тому подобное…
        0
        Я понял вопрос. Как настоящее современное искусство, оно не ограничивает себя какими-то там смыслами)

        Такой тип письма, как в статье, называется Асемиотическим (линк), термин определяется как «лишенный специфического семантического содержания (содержимого)».

        Т.е., это просто, грубо говоря, каракули кода. Думаю, не проблема адаптировать элементы этого кода и задать правила отрисовки через существующие буквы-слова, но это будет уже просто шрифт и совсем другая история.
          +1
          Не не не…

          Если там нет заложенного смысла — это как раз очень интересно! )

          Особенно, если кто-то все-таки расшифрует…
        +1

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

          +3
          Меня, если честно, больше занимает иной аспект: если у автора смысла в генерируемом потоке сплайнов нет, по крайней мере сознательно заложенного, а кто-то таки найдет этот смысл…
            0
            Как и отметил автор — смысл современного искусства в отсутствии ограничения смыслом, то-есть в самом творении.
              0
              Я как раз только «за»…

              Меня давно занимает идея, что человек может найти смысл даже там где его нет… И собственно вопрос: если автор его не закладывал, но смысл все-таки нашли, то значит ли это, что мы сами этот смысл привносим, или гипотетически он там был и до нас, без относительно желания автора? ;)

              Если вот такое Асемиотическое письмо будет «расшифровано» (что бы мы не вкладывали в этот термин), то 100% это привнесли сами горе-расшифровщики, или смысл мог как-то «самозародиться»? ))) Это примерно про 100 тысяч обезьян и «Войну и мир» или про вавилонскую библиотеку…
                0
                Ну, справедливости ради, хочется отметить, что каких-то прям широко признанных всеми случаев принятия полной бессмыслицы за что-то осмысленное как-то не припоминается.
                Каждый отдельный человек — да, может искать смысл в чем угодно, но это скорее экзистенциальный поиск и мне кажется, что в большинстве случаев он отдает себе отчет в этом.
              0

              в искусстве такое постоянно, сам это испытал, как в одну так и в другую сторону, так что не удивлюсь

              0

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

                0

                а может искусственный интеллект захочет нам что-то сказать

                  0
                  Есть сомнения, что полный рандом можно расшифровать во что-то осмысленное, какой бы ключ не взять :).
                    0

                    Результатом расшифровки полного рандома, в зависимости от выбора ключа, может быть абсолютно любая комбинация символов. Понимаете? Абсолютно любая. Какой текст ни напиши, найдётся ключ, который переводит рандомный шум в этот текст.


                    А вот в случае если у нас не шифр, а неизвестный язык или неизвестная письменность, то у нас есть зацепки, по которым мы можем отличать правильные расшифровки от неправильных.

                      0
                      Ну и каков шанс, что после такого перевода рандомного текста каким либо ключем текст окажется осмысленным?:) Кажется, он стремится к 0 :).
                        0

                        То же самое можно сказать о любом хорошем шифре.

                          0
                          И?:) Какой вывод можно из этого сделать?:)
                            0

                            Вывод только один: вы меня троллите. Делаете вид, будто не понимаете, а сами ржёте (на что смайлики указывают).

                              0
                              Да нет на самом деле.
                              «Есть сомнения, что полный рандом можно расшифровать во что-то осмысленное» — вот он и ответ :).
                                0

                                И откуда же Вы взяли такой вывод? Я же Вам русским по белому написал, что полный рандом можно расшифровать ВО ЧТО УГОДНО, в том числе и во множество различных осмысленных текстов.
                                Вы про XOR с бесконечным ключом слышали?

                                  0
                                  Можно конечно, но если вероятность получить что-то осмысленно стремится к нулю…
                                    0

                                    Да причём тут вероятность? Если я переберу все возможные ключи — я получу все возможные тексты подходящей длины.
                                    Как вообще сюда вероятность относится?

                                      0
                                      «Если я переберу все возможные ключи» — и сколько у вас это займет времени?:)
                                        0

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

                0
                Крутая статья, спасибо!

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое