Перевести квадратичную кривую в кубическую - PullRequest
9 голосов
/ 28 февраля 2012

Глядя на Преобразовать квадратичный Безье в куб? , я наконец могу понять, почему учителя программирования всегда говорили мне, что математика так важна.К сожалению, я не слушал.

Может ли кто-нибудь предоставить более конкретную формулу - например, computer-language-y - для преобразования квадратичной кривой в кубическую?Понимание того, что возможны некоторые ошибки округления, и это нормально.

Учитывая четырехугольную кривую, представленную переменными:

StartX, StartY
ControlX, ControlY
EndX, EndY

И желая, чтобы StartX, StartY и EndX, EndY остались прежними, ночтобы теперь иметь Control1X, Control1Y и Control2X, Control2Y кубической кривой.

Это ...

Control1X = StartX + (.66 * (ControlX - StartX))
Control2X = EndX + (.66 * (ControlX - EndX))

С теми же основными функциями, которые используются для вычисления Control1Y и Control2Y?

Ответы [ 2 ]

7 голосов
/ 28 февраля 2012

Ваш код правильный, за исключением того, что вы должны использовать 2.0/3.0 вместо 0.66.

1 голос
/ 22 января 2018

Вы можете избежать большинства ошибок округления, используя

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 может быть проще в разработке, если ему нужно только управлять путями, содержащими только кубические Безье: его можно легко распараллелить при необходимости и ускорить с помощью аппаратного обеспечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...