hermiteスプラインは単なる一連の立方体ベジエです。しかし、これらの奇妙な矛盾をUIBezierPath
で得ることができます。たとえば、開始点、制御点1、制御点2、および終了点がすべて同一直線上にある複数の立方体ベジエを追加すると、レンダリングに問題が発生します(UIBezierPath
)。そこで、私はhermiteスプラインパスにチェックを入れて、これら4つの点が同一線上にあるかどうかを確認し、そうであれば、その場合に線を追加します。だから、
、代わりにちょうど:
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)
}
別の、より一般的な解決策(ビット洗練しかし、私見)、アプローチは、これらのcuに参加することを避けることですそれぞれの3次曲線を追加する前に、前の点を最初にmove(to:)
にします。キュービックベジエを結合することに関連するバグに起因するすべての問題を防ぐことができます。
出典
2017-07-05 23:17:19
Rob
関連していませんが、「touchesMoved'の遅いリフレッシュレートのために...」と言います。物理デバイスでは、合体タッチを使用してポイント間のギャップを減らすことができます。これはデバイスでのみ機能し、すべての場合ではありませんが、対応デバイスではより正確なパスになります。あなたはすでにそれをやっているでしょうが、将来の読者のために言及します。 – Rob