Изменить кривизну quadBezierCurve в Swift - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь создать график, используя UIBezierPath. Я рассчитываю CGPoints по заданным данным, а затем создаю кривую.

Алгоритм кривой выглядит следующим образом:

func createGraph(for data: [CGPoint]) {
    for point in data {
        if let prevPoint = prevPoint {
            let midPoint = CGPoint(x: (point.x + prevPoint.x) / 2, y: (point.y + prevPoint.y) / 2)

            if isFirst {
                bezierPath.addLine(to: midPoint)
                isFirst = false
            } else {
                bezierPath.addQuadCurve(to: midPoint, controlPoint: prevPoint)
            }

        }else {
            bezierPath.move(to: point)
        }

        prevPoint = point
    }

    if let prevPoint = prevPoint {
        bezierPath.addLine(to: prevPoint)
    }


    let shapeLayer = CAShapeLayer()
    shapeLayer.path = bezierPath.cgPath
    shapeLayer.lineWidth = 4
    shapeLayer.strokeColor = UIColor.black.cgColor
    shapeLayer.fillColor = .none
    shapeLayer.lineCap = .round
    view.layer.addSublayer(shapeLayer)



    let animation = CABasicAnimation(keyPath: "strokeEnd")
    animation.fromValue = 0.0
    animation.toValue = 1.0
    animation.duration = 2.5

    shapeLayer.add(animation, forKey: "drawKeyAnimation")
}

Я нахожу среднюю точку между текущей точкой и предыдущей точкой (если имеется), а затем создаю quadCurve, используя среднюю точку в качестве конечной точки и предыдущая точка в качестве контрольной точки. Очень простой алгоритм, который дает мне довольно хорошие результаты.

Однако я заметил одну вещь: кривизна намного ниже максимальной или минимальной точки. Я бы хотел, чтобы кривая была точно там, где находится точка максимума / минимума.

enter image description here

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

Любая помощь по этому вопросу будет принята. Спасибо!

...