Преобразование кривой Безье в набор дуг окружности
17.04.2014Для реализации визуализации шрифтов на шейдерах в движке потребовалось преобразование кривой Безье (кубической, квадратичной) в набор дуг окружности. Долго штудировал математику, просмотрел даже некоторые забугорные whitepaper’s, но красивого решения не нашел.
Исходные данные, кубические кривые:
B = { ( 0, 0 ), ( 0.25, 0.25 ), ( 0.75, 0.75 ), ( 1, 0 ) }
B = { ( 0, 0 ), ( 0.25, 0.75 ), ( 0.75, 0.25 ), ( 1, 1 ) }
B = { ( 0.25, 0.25 ), ( 0.75, 0.75 ), ( 0.25, 0.5 ), ( 0.75, 0.25 ) }
Квадратичные кривые:
B = { ( 0, 0 ), ( 0.75, 0.75 ), ( 1, 0 ) }
B = { ( 0, 0 ), ( 0, 1 ), ( 1, 1 ) }
B = { ( 0.25, 0.25 ), ( 0.75, 0.75 ), ( 0.45, 1 ) }
В итоге был найден достаточно простой рекурсивный алгоритм, которые аппроксимирует кривые. В результате получены следующие картинки.
Кубические кривые (в порядке предоставления входных данных):
Квадратичные кривая (в порядке представления входных данных):
На каждую кривую получается в среднем 5-10 дуг окружностей. Вполне допустимо.