SVG динамически рисует неправильную графику

JavaScript SVG Canvas
SVG динамически рисует неправильную графику

Об авторе Wuyue Ant Financial Data Experience Техническая команда

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

окончательный эффект

Посмотрим на конечный результат~

Описание чипа:

Сканирование лица:

Ручное написание:

Эффект довольно крутой, и весь процесс разработки реализации начинается с спроса.

нужно

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

Обсудите n мультипозов с одноклассниками по дизайну:

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

Но студенты-дизайнеры настаивают на собственной позе, то есть на восстановлении реальной сцены, то есть на сканировании!

Так что я могу только:

Ну, хватит ерунды, вернемся к теме~

Следующие два решения пришли на ум для динамического рендеринга браузера:

Вариант первый

Хотя браузер не предоставляет метод динамического рисования, svg предоставляет более важный атрибут штриха, который по-китайски называется штрихом. Первой мыслью было использовать stroke-dasharray для установки пунктирной обводки, а затем использовать анимацию для изменения stroke-dashoffset для отрисовки динамической копии. Таким образом можно добиться эффекта динамического рисования. Но есть следующие недостатки.

  • Каждый путь должен контролироваться написанием CSS-анимации.
  • Процесс рисования единый, вы можете использовать только несколько алгоритмов анимации, предоставляемых браузером, и вы не можете сами контролировать процесс рисования
  • Если в будущем будет такой спрос, фронтэнду потребуется много развития

На основании вышеперечисленных моментов от этого решения отказались.

Вариант 2

Можем ли мы сами контролировать процесс рисования svg и реализовать его динамическое рисование? Как будто... это возможно! !

Анализ SVG

Первое, что нужно сделать, это проанализировать файл svg. Неправильную графику можно вырезать с помощью инструмента пера ps, а затем экспортировать в AI, чтобы получить информацию о пути графики. Или напрямую попросите студентов-дизайнеров предоставить изображения в формате svg. Наконец, мы можем получить информацию о пути графа, например, следующим образом:

svg.png

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

  • Информация о макете, которую можно рассматривать как исходный размер в viewBox.
  • Часть стиля — это стиль, позволяющий контролировать толщину, цвет и т. д. линии.
  • Третья часть красного прямоугольника — это информация о пути, которая здесь имеет фиксированный формат. Подробнее см. здесь https://developer.mozilla.org/en-US/docs/Web/SVG.

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

path.png

разбор команды

Проблема ясна, то есть разделить инструкцию пути. Каждая команда анализируется, затем подсчитываются баллы по каждой команде и рисуются линии в соответствии с соответствующим стилем. Конкретный процесс выглядит следующим образом:

step.png

Ключевой код части инструкции синтаксического анализа выглядит следующим образом:

parse.png

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

order.png

командный рисунок

Затем идет исполняемая часть кода для каждой инструкции:

line.png
C.png

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

lineTo.png
draw.png

Нарисуйте точки и соедините линии, чтобы сделать анимационную часть:

animate.png

Тогда мы добились эффекта в начале этой статьи~

Суммировать

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

И мы можем открыть скорость рисования и другие конфигурации для студентов-дизайнеров.Если есть такой спрос, студентам-дизайнам нужно только предоставить изображение svg с путем. Затем вы можете настроить конфигурацию самостоятельно, освободив объем разработки для фронтенд-студентов.

Заинтересованные студенты могут подписаться на эту колонку или отправить свое резюме по адресу 'wuyue.lwy####alibaba-inc.com'.replace('####', '@'). Приглашаются люди с высокими идеалами~

Оригинальная ссылка:GitHub.com/proto team/no…