LINUX.ORG.RU

Как оптимально апроксимировать кубическую безье квадратичными?


0

1

На преобразовании форматов шрифтов надо иногда перегонять кубические безье в квадратичные. Проблема не в том, чтобы апроксимировать, а в том, чтобы это сделать минимальным количеством сплайнов. В реальной жизни хватает разбивки пополам, но не всегда. Картинку можно посмотреть тут https://github.com/fontello/svg2ttf/issues/24 .

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

Пока смог нагуглить только тут http://www.caffeineowl.com/graphics/2d/vectorial/cubic2quad01.html , но:

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

★★★★★

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

next_time ★★★★★
()
Ответ на: комментарий от kike

Там упор на оптимизацию скорости, и критериев оценки нема.

Vit ★★★★★
() автор топика
Ответ на: комментарий от next_time

Фонтфорж оставлен на совсем крайний случай, если ничего понятнее найти не получится.

Vit ★★★★★
() автор топика

У меня нет решения, но я злорадно хехекаю в сторону постов «зачем погромисту математика?!711»

anonymous
()
Ответ на: комментарий от quickquest

За ссылки большое спасибо. Тут пока проблема в том, чтобы сформулировать, что именно будет функционалом.

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

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

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

Простейшее решение — использование полярных координат с полюсом в локальном центре координат символа (контура, фигуры). После нормировки ошибка будет в % относительно единичного радиуса. Для всего символа создается таблица граничных условий для точек стыковки сплайнов с равенством их первых производных для ликвидации изломов.

quickquest ★★★★★
()
Ответ на: комментарий от quickquest

Что-то у меня есть серьезные сомнения насчет оптимальности таких критериев для вычислений.

А вы можете глянуть по ссылке алгоритм «Quadratic approximation of a cubic Bezier by adaptive division» http://www.caffeineowl.com/graphics/2d/vectorial/cubic2quad01.html ? Я там не смог осилить, в чем погрешность выражается. Остальное очень даже похоже на правду. По крайней мере аплет, если подергать точки в разные состояния, выдает очень похожие на правду результаты (сегментов 2-3, визуальное совпадение очень хорошее).

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

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

dikiy ★★☆☆☆
()
Ответ на: комментарий от Vit

Похоже, по ссылке погрешность в чем-то вроде точек. Наверное, достаточно будет нормализовать погрешность по bounding box от координат вершин, или забить на относительную точность и нормализовать по общему размеру картинки.

Vit ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.