swift:Hermite圆帽UIBezierpath

时间:2017-07-05 21:53:31

标签: swift uibezierpath hermite

我的应用中有一个部分,用户可以在其中绘制内容。 由于touchesMoved的刷新率较慢,如果用户快速绘制,则线条不会平滑。 这就是我使用Hermite的原因。它为每个刷新率设置一个点,然后在这些点之间绘制一个UIBezier路径(扩展名使其平滑)。 它工作得很好!我现在有一个流畅的设计!

唯一的问题是,我有时候没有得到一个圆形的开始上限,如果我打开相同的路径,它也会发生。

我认为这与在这些点之间绘制bezier路径的代码有关。所以我正在找一个也使用Hermite并知道如何解决这个问题的人。 enter image description here

1 个答案:

答案 0 :(得分:1)

Hermite spline只是一系列立方贝塞尔曲线。但是你可以通过UIBezierPath获得这些奇怪的差异。例如,当您添加多个三次贝塞尔曲线时,存在UIBezierPath渲染问题,其中起点,控制点1,控制点2和结束都是共线的。所以,我已经在我的hermite样条曲线路径上添加了一个检查,以检查这四个点是否共线,如果是这样,只需在这些情况下添加一行。

所以,而不仅仅是:

addCurve(to: endPoint, controlPoint1: control1, controlPoint2: control2)

我做:

let angleFull = angle(between: previousPoint, and: endPoint)
let angle1 = angle(between: previousPoint, and: control1)
let angle2 = angle(between: control2, and: endPoint)

if (angleFull == angle1 || angle1 == nil) && (angleFull == angle2 || angle2 == nil) {
    addLine(to: endPoint)
} else {
    addCurve(to: endPoint, controlPoint1: control1, controlPoint2: control2)
}

其中

private func angle(between point1: CGPoint, and point2: CGPoint) -> CGFloat? {
    if point1 == point2 { return nil }
    return atan2(point2.y - point1.y, point2.x - point1.x)
}

另一种更通用的解决方案(虽然有点不优雅,恕我直言),方法是避免完全加入这些三次曲线,因此,在添加每个三次曲线之前,首先执行move(to:)前一个点。这应该可以防止因加入立方贝塞尔相关的错误而产生的所有问题。