@@ -196,7 +196,7 @@ extension BezierCurve {
196196 public func offset( distance d: CGFloat ) -> [ BezierCurve ] {
197197 // for non-linear curves we need to create a set of curves
198198 var result : [ BezierCurve ] = self . reduce ( ) . compactMap { $0. curve. scale ( distance: d) }
199- ensureContinuous ( & result)
199+ ensureContinuous ( & result, isClosed : false )
200200 return result
201201 }
202202
@@ -214,24 +214,17 @@ extension BezierCurve {
214214 return internalOutline ( d1: d1, d2: d2)
215215 }
216216
217- private func ensureContinuous( _ curves: inout [ BezierCurve ] ) {
218- for i in 0 ..< curves. count {
219- if i > 0 {
220- curves [ i] . startingPoint = curves [ i- 1 ] . endingPoint
221- }
222- if i < curves. count- 1 {
223- curves [ i] . endingPoint = 0.5 * ( curves [ i] . endingPoint + curves[ i+ 1 ] . startingPoint )
224- }
225- }
217+ private func ensureContinuous( _ curves: inout [ BezierCurve ] , isClosed: Bool ) {
218+ BezierCurveType . ensureContinuous ( & curves, isClosed: isClosed)
226219 }
227220
228221 private func internalOutline( d1: CGFloat , d2: CGFloat ) -> PathComponent {
229222 let reduced = self . reduce ( )
230223 let length = reduced. count
231224 var forwardCurves : [ BezierCurve ] = reduced. compactMap { $0. curve. scale ( distance: d1) }
232225 var backCurves : [ BezierCurve ] = reduced. compactMap { $0. curve. scale ( distance: - d2) }
233- ensureContinuous ( & forwardCurves)
234- ensureContinuous ( & backCurves)
226+ ensureContinuous ( & forwardCurves, isClosed : false )
227+ ensureContinuous ( & backCurves, isClosed : false )
235228 // reverse the "return" outline
236229 backCurves = backCurves. reversed ( ) . map { $0. reversed ( ) }
237230 // form the endcaps as lines
@@ -263,6 +256,29 @@ extension BezierCurve {
263256 }
264257}
265258
259+ enum BezierCurveType {
260+ static func ensureContinuous( _ curves: inout [ BezierCurve ] , isClosed: Bool ) {
261+ for i in 0 ..< curves. count {
262+ if i > 0 {
263+ curves [ i] . startingPoint = curves [ i- 1 ] . endingPoint
264+ }
265+ if i < curves. count- 1 {
266+ curves [ i] . endingPoint = 0.5 * ( curves [ i] . endingPoint + curves[ i+ 1 ] . startingPoint )
267+ }
268+ }
269+ if isClosed, curves. count > 1 {
270+ curves [ curves. count - 1 ] . endingPoint = curves [ 0 ] . startingPoint
271+ }
272+ }
273+ }
274+ extension Array where Element == BezierCurve {
275+ public func ensureContinuous( isClosed: Bool ) -> [ BezierCurve ] {
276+ var result = Array ( self )
277+ BezierCurveType . ensureContinuous ( & result, isClosed: isClosed)
278+ return result
279+ }
280+ }
281+
266282public let defaultIntersectionAccuracy = CGFloat ( 0.5 )
267283internal let reduceStepSize : CGFloat = 0.01
268284
0 commit comments