Вы можете избежать большинства ошибок округления, используя
Control1 = (Start + 2 * Control) / 3
Control2 = (End + 2 * Control) / 3
Обратите внимание, что отрезки также можно преобразовать в кубические кривые Безье, используя:
Control1 = Start
Control2 = End
Это может быть удобно при преобразовании сложного путисмешивание различных типов кривых (линейных, квадратичных, кубических)
Существует также базовое преобразование для преобразования эллиптических дуг в кубические (с некоторыми незначительными незаметными ошибками): вам просто нужно разбить хотя бы дугу на эллиптических квадрантах (обрезая эллипс сначала по двум ортогональным осям симметрии или по произвольной ортогональной оси, проходящей через центр, если эллипс является кругом, а затем представляющим каждую дугу; когда эллипс является криклом, две фокусные точки путаются в одной точкецентр круга).
Многие рендеры SVG делают это, добавляя дополнительное разбиение на октанты (чтобы вы также получили точное положение не только для точек, через которые проходят две основные оси, но и длядве диагональные оси, которые делятся пополам (когда эллипскруг) каждый квадрант (когда эллипс не является кругом, ассимилируйте его как круг, сплющенный с помощью линейного преобразования только вдоль малой оси, вы делаете то же самое вычисление), потому что октанты также довольно точно расположены (cos (pi / 4)= sin (pi / 4) = sqrt (2) / 2 ~ 0,71, и поскольку это дополнительное разбиение позволит точную визуализацию касательных в точках, пересекающих диагонали в 45 градусах окружности): полный эллипс затем преобразуется в 8 кубическихдуги (т.е. 8 точек на эллипсе и 16 контрольных точек): вы почти не заметите разницы между этими эллиптическими дугами и кубическими дугами (вы можете создать алгоритм, который использует ту же «ошибку сплющивания», которая вычисляется при разбиении Безье на списоклинейных сегментов, которые затем рисуются с использованием классического быстрого алгоритма Брезенхэма для отрезков линий.
Такое преобразование произвольных путей полезно, когда вы хотите получить другие кривые из пути, в частности, кривые"буферы" на заданном расстоянии, особенно когда эти пути должны бытьОбратимся к «штрихам» с определенной «шириной хода»: вам нужно вычислить две «внутренние» и «внешние» кривые, а затем сконцентрироваться на том, как конвертировать митры / квадраты / закругленные углы, а затем нарезать длинные митры наудобное расстояние (соответствующее коэффициенту «предел митры», умноженному на «ширину хода»).
Более продвинутые средства визуализации также будут использовать митры, представленные касательными окружностями, когда между двумя дугами есть угол между двумя сегментами (этополезно для рисования симпатичных географических карт) ...
Преобразование произвольных путей, смешивающих сегменты, эллиптические дуги и дуги Безье только в кубические, является необходимым шагом для вычисления точных изображений без чрезмерных дефектов, видимых при увеличении. Это необходимокогда ваши буферы «обводки» должны принимать некоторые эффекты (например, вычисление штрихов), а затем улучшать результат с помощью полупрозрачных пикселей или субпикселей для сглаживания отрисованных штрихов (сглаживание легко вычислить только тогда, когда все сведено к линейным сегментамиlsos может быть проще в разработке, если ему нужно только управлять путями, содержащими только кубические Безье: его можно легко распараллелить при необходимости и ускорить с помощью аппаратного обеспечения.