Я пытаюсь создать график, используя 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, используя среднюю точку в качестве конечной точки и предыдущая точка в качестве контрольной точки. Очень простой алгоритм, который дает мне довольно хорошие результаты.
Однако я заметил одну вещь: кривизна намного ниже максимальной или минимальной точки. Я бы хотел, чтобы кривая была точно там, где находится точка максимума / минимума.
Красная линия указывает, почему точки. Черная линия - это кривая. Есть ли способ измерить кривизну до пиковой точки или ближе к пиковой точке? Нужно ли использовать кубическую кривую c или менять контрольные точки? ?
Любая помощь по этому вопросу будет принята. Спасибо!