Перевести квадратичный Безье в кубический - PullRequest
30 голосов
/ 02 июля 2010

Каков алгоритм преобразования квадратичного Безье (с 3 точками) в кубический (с 4 точками)?

Ответы [ 2 ]

45 голосов
/ 02 июля 2010

С http://fontforge.sourceforge.net/bezier.html:

Любой квадратичный сплайн может быть выражен как кубический (где кубический член равен нулю).Конечные точки кубики будут такими же, как и квадратичные.

CP 0 = QP 0 CP 3 = QP 2

Две контрольные точки для кубики:

CP 1 = QP 0 + 2/3 * (QP 1 -QP 0 )CP 2 = QP 2 + 2/3 * (QP 1 -QP 2 )

...Из-за округления существует небольшая ошибка, но она вряд ли будет заметна.

0 голосов
/ 07 марта 2019

Для справки, я реализовал addQuadCurve для NSBezierPath (macOS Swift 4) на основе ответа Оуэна выше .

extension NSBezierPath {
    public func addQuadCurve(to qp2: CGPoint, controlPoint qp1: CGPoint) {
        let qp0 = self.currentPoint
        self.curve(to: qp2,
            controlPoint1: qp0 + (2.0/3.0)*(qp1 - qp0),
            controlPoint2: qp2 + (2.0/3.0)*(qp1 - qp2))
    }
}

extension CGPoint {
    // Vector math
    public static func +(left: CGPoint, right: CGPoint) -> CGPoint {
        return CGPoint(x: left.x + right.x, y: left.y + right.y)
    }
    public static func -(left: CGPoint, right: CGPoint) -> CGPoint {
        return CGPoint(x: left.x - right.x, y: left.y - right.y)
    }
    public static func *(left: CGFloat, right: CGPoint) -> CGPoint {
        return CGPoint(x: left * right.x, y: left * right.y)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...