05:45 

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

Path в SVG — это набор команд с параметрами. Команда может ничего не рисовать, а только двигать рисовалку. Например, «сдвинь рисовалку в место с такими-то координатами» (M) и «сдвинь рисовалку на столько-то по горизонтали и на столько-то по горизонтали» (m). А может нарисовать линию. Например, горизонтальную до такой-то икс-координаты (команда H) или вертикальную на такое-то расстояние (h). А ещё есть вертикальные (V и v), произвольные прямые (L и l), кривые Безье квадратичные (Q, q, T, t) и кубические (C, c, S, s) и кусок эллипса (A, a). И команда Z, которая рисует прямую до того места, с которого наш путь начинался. И команда z, которая делает ровно то же самое.

Так вот, path в Inkscape вообще на это вот всё не похож. Открывать он всё это умеет, а сохранять умеет только команды m, l и c (т.е. сдвиг, рисование прямой и кубическая кривая Безье, и всё это в относительных координатах). В частности, если открыть в нём svg-файл с путём, чуть-чуть этот путь обработать, а затем сохранить, квадратичные кривые в нём превратятся в кубические кривые. Ещё в него добавятся всякие забавные атрибуты, которых не было раньше, вроде sodipodi:nodetypes="csccaccccc". Что произошло, что за типы узлов?

Итак, представьте. У нас есть линия, составленная из отрезков прямых и из кубических кривых Безье.

Точки, где фрагменты стыкуются, называются узлами (nodes).

У кубической кривой Безье четыре опорные точки. Первая и последняя называются узлами (nodes), вторая и предпоследняя рукоятками (handles). Это деление на узлы и рукоятки осмысленно уже хотя бы потому, что через первую и четвёртую опорную точку кривая Безье проходит обязательно, а через вторую и третью, как правило, нет. Рукоятка не существует сама по себе, а всегда принадлежит узлу, с которым соседствует.

У прямой опорных точек две, узлами называются обе.

Как мы видим, у узла может быть от нуля рукояток (если он соединяет две прямые или если путь им заканчивается и единственный его сосед — прямая) до двух рукояток (если он соединяет две кривые). Рукоятки могут «втягиваться» в узел (если щёлкнуть на неё с контролом), а можно их из узла «вытянуть» (если щёлкнуть на узел с шифтом), так что деление на прямые и кривые становится вообще не очень осмысленным (хотя быстрые способы втянуть или выпустить на заметную длину все втянутые рукоятки на отмеченных сегментах всё равно остались, потому что полезны на практике, и называются именно «превратить сегмент в прямую» и «превратить сегмент в кривую»).

Итак, линии у нас теперь без типов. Зато теперь типы есть у узлов. Этих типов, насколько я могу судить, четыре:

— c (cusp nodes или corner nodes), которые никаким ограничениям не подвержены и поэтому могут образовывать на пути углы и зазубрины
— s (smooth nodes), у которых обе рукоятки должны лежать на одной проходящей через узел прямой
— z (symmetric nodes, не знаю, почему решили их сокращать как z), у которых обе рукоятки должны лежать на одной проходящей через узел прямой и находиться на одинаковом расстоянии от узла
— и, наконец, a (auto-smooth nodes), которые подстраивают положение рукояток под соседние узлы по алгоритму, в который мне было влом вникать (ходят слухи, что там как-то задействованы сплайны Катмалла-Рома).

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

Вот что-то такое инкскейп внутри себя и хранит: тип узла, координаты узла, координаты его рукояток, и так для каждого узла пути. Ну, я так думал. А потом заглянул в исходники, увидел там всякие Geom::QuadraticBezier и BezierCurveN<required_degree> и ваще запутался.

@темы: root@глупыйпингвин:~#

URL
Комментарии
2017-03-09 в 09:38 

DaarkWel
А ещё сейчас разрабатывается вторая версия формата SVG, и новые версии Инкскейпа, которые, с одной стороны, должны бы по идее его — новый SVG — поддерживать, с другой, не терять совместимости со старыми версиями, и с третьей, поддерживать вот эти вот все свои плюшки... Как оно устроено внутри, я не знаю, мне вообще страшно туда лезть :-}

2017-03-09 в 10:30 

Заболекарь
Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
DaarkWel, а что собой представляет вторая версия?

URL
2017-03-09 в 10:48 

DaarkWel
В основном, насколько я понимаю, упор делается на поддержку современного веба — все эти html5, css3, анимация, скрипты и интерактивность, и другие страшные слова :-} www.w3.org/TR/SVG2

2017-03-09 в 13:15 

падрэ Алькадес
Буэнос диас, голодранцы, я пришел надавать вам по соплям кредитными билетами.
Глянул в иллюстраторовский свг - сходу нашел L, M, Q и Z.

2017-03-09 в 14:02 

Заболекарь
Мегакрендель: заколебарь, жаболекарь, зомболекарь, лежебокарь
падрэ Алькадес, а как он показывает пользователю, скажем, квадратичный сплайн?

URL
   

Эх, разум, да ещё разум

главная