From 6bebe3ba7068adf5241e1b766a82f31f584df58d Mon Sep 17 00:00:00 2001 From: Eduard Sergeev Date: Thu, 14 Mar 2019 11:43:36 +0700 Subject: [PATCH] Override toPath() for Arc. Darwin is needed for sin/cos. --- Source/model/geom2d/Arc.swift | 28 ++++++++++++++++++++++++++ Source/model/geom2d/Locus+ToPath.swift | 26 ------------------------ Source/model/geom2d/Locus.swift | 4 +--- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Source/model/geom2d/Arc.swift b/Source/model/geom2d/Arc.swift index 4e0e3625..5c728df5 100644 --- a/Source/model/geom2d/Arc.swift +++ b/Source/model/geom2d/Arc.swift @@ -1,3 +1,5 @@ +import Darwin + open class Arc: Locus { public let ellipse: Ellipse @@ -17,4 +19,30 @@ open class Arc: Locus { w: ellipse.rx * 2.0, h: ellipse.ry * 2.0) } + + override open func toPath() -> Path { + let rx = ellipse.rx + let ry = ellipse.ry + let cx = ellipse.cx + let cy = ellipse.cy + + var delta = extent + if shift == 0.0 && abs(extent - .pi * 2.0) < 0.00001 { + delta = .pi * 2.0 - 0.001 + } + let theta1 = shift + + let theta2 = theta1 + delta + + let x1 = cx + rx * cos(theta1) + let y1 = cy + ry * sin(theta1) + + let x2 = cx + rx * cos(theta2) + let y2 = cy + ry * sin(theta2) + + let largeArcFlag = abs(delta) > .pi ? true : false + let sweepFlag = delta > 0.0 ? true : false + + return PathBuilder(segment: PathSegment(type: .M, data: [x1, y1])).A(rx, ry, 0.0, largeArcFlag, sweepFlag, x2, y2).build() + } } diff --git a/Source/model/geom2d/Locus+ToPath.swift b/Source/model/geom2d/Locus+ToPath.swift index 19188f8a..2c0796ac 100644 --- a/Source/model/geom2d/Locus+ToPath.swift +++ b/Source/model/geom2d/Locus+ToPath.swift @@ -2,32 +2,6 @@ import Foundation extension Locus { - internal func arcToPath(_ arc: Arc) -> Path { - let rx = arc.ellipse.rx - let ry = arc.ellipse.ry - let cx = arc.ellipse.cx - let cy = arc.ellipse.cy - - var delta = arc.extent - if arc.shift == 0.0 && abs(arc.extent - .pi * 2.0) < 0.00001 { - delta = .pi * 2.0 - 0.001 - } - let theta1 = arc.shift - - let theta2 = theta1 + delta - - let x1 = cx + rx * cos(theta1) - let y1 = cy + ry * sin(theta1) - - let x2 = cx + rx * cos(theta2) - let y2 = cy + ry * sin(theta2) - - let largeArcFlag = abs(delta) > .pi ? true : false - let sweepFlag = delta > 0.0 ? true : false - - return PathBuilder(segment: PathSegment(type: .M, data: [x1, y1])).A(rx, ry, 0.0, largeArcFlag, sweepFlag, x2, y2).build() - } - internal func pointToPath(_ point: Point) -> Path { return MoveTo(x: point.x, y: point.y).lineTo(x: point.x, y: point.y).build() } diff --git a/Source/model/geom2d/Locus.swift b/Source/model/geom2d/Locus.swift index db8c42ae..ddcfa733 100644 --- a/Source/model/geom2d/Locus.swift +++ b/Source/model/geom2d/Locus.swift @@ -20,9 +20,7 @@ open class Locus { } open func toPath() -> Path { - if let arc = self as? Arc { - return arcToPath(arc) - } else if let point = self as? Point { + if let point = self as? Point { return MoveTo(x: point.x, y: point.y).lineTo(x: point.x, y: point.y).build() } else if let line = self as? Line { return MoveTo(x: line.x1, y: line.y1).lineTo(x: line.x2, y: line.y2).build()