как интерпретировать контур символа свободного шрифта, когда первая точка контура не соответствует кривой - PullRequest
1 голос
/ 12 августа 2010

На самом деле я работаю над средством визуализации, которое преобразует глифы свободного типа в полилинии для управления системой лазерной маркировки.У меня проблема в том, что я не знаю, как правильно обрабатывать контур, начинающийся с точки вне кривой (99,9% начинаются с точек кривой!).Я долго искал информацию, но ничего полезного не нашел.

Спасибо за вашу помощь

1 Ответ

1 голос
/ 07 июля 2015

FreeType использует три типа точек: на кривой, квадратичные контрольные точки (также известные как «конические») и кубические контрольные точки.Квадратичные контрольные точки сгруппированы с точками на кривой по обе стороны от них, чтобы сформировать три точки, необходимые для определения квадратичного сплайна Безье.Кубические контрольные точки должны быть в парах и сгруппированы с точками на кривой с обеих сторон, чтобы составить четыре точки, необходимые для кубического сплайна Безье.

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

Если вы хотите точно увидеть, как это делается, посмотрите исходный код FreeType.Функция FT_Outline_Decompose проходит путь и преобразует его в серию линий и кривых обоих типов.Он находится в этом файле:

http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/src/base/ftoutln.c

Особый интерес начинается с этого комментария (еще раз отметим, что «конический» в данном контексте означает то же, что и «квадратичный»):

/* first point is conic control.  Yes, this happens. */
...