mirror of
https://github.com/dscyrescotti/Memola.git
synced 2026-04-24 17:48:39 +02:00
feat: smooth out stroke
This commit is contained in:
@@ -134,7 +134,9 @@ extension GraphicContext {
|
|||||||
|
|
||||||
func appendStroke(with point: CGPoint) {
|
func appendStroke(with point: CGPoint) {
|
||||||
guard let currentStroke else { return }
|
guard let currentStroke else { return }
|
||||||
guard let currentPoint, point.distance(to: currentPoint) > currentStroke.thickness * currentStroke.penStyle.anyPenStyle.stepRate else { return }
|
guard let currentPoint, point.distance(to: currentPoint) > currentStroke.thickness * currentStroke.penStyle.anyPenStyle.stepRate else {
|
||||||
|
return
|
||||||
|
}
|
||||||
currentStroke.append(to: point)
|
currentStroke.append(to: point)
|
||||||
self.currentPoint = point
|
self.currentPoint = point
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ struct SolidPointStrokeGenerator: StrokeGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func append(to point: CGPoint, on stroke: Stroke) {
|
func append(to point: CGPoint, on stroke: Stroke) {
|
||||||
guard stroke.keyPoints.count > 0 else {
|
guard stroke.keyPoints.endIndex > 0 else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
stroke.keyPoints.append(point)
|
stroke.keyPoints.append(point)
|
||||||
switch stroke.keyPoints.count {
|
switch stroke.keyPoints.endIndex {
|
||||||
case 2:
|
case 2:
|
||||||
let start = stroke.keyPoints[0]
|
let start = stroke.keyPoints[0]
|
||||||
let end = stroke.keyPoints[1]
|
let end = stroke.keyPoints[1]
|
||||||
@@ -28,7 +28,7 @@ struct SolidPointStrokeGenerator: StrokeGenerator {
|
|||||||
addCurve(from: start, to: end, by: control, on: stroke)
|
addCurve(from: start, to: end, by: control, on: stroke)
|
||||||
case 3:
|
case 3:
|
||||||
stroke.removeQuads(from: stroke.quadIndex + 1)
|
stroke.removeQuads(from: stroke.quadIndex + 1)
|
||||||
let index = stroke.keyPoints.count - 1
|
let index = stroke.keyPoints.endIndex - 1
|
||||||
var start = stroke.keyPoints[index - 2]
|
var start = stroke.keyPoints[index - 2]
|
||||||
var end = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
var end = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
||||||
var control = CGPoint.middle(p1: start, p2: end)
|
var control = CGPoint.middle(p1: start, p2: end)
|
||||||
@@ -39,7 +39,7 @@ struct SolidPointStrokeGenerator: StrokeGenerator {
|
|||||||
addCurve(from: start, to: end, by: control, on: stroke)
|
addCurve(from: start, to: end, by: control, on: stroke)
|
||||||
default:
|
default:
|
||||||
smoothOutPath(on: stroke)
|
smoothOutPath(on: stroke)
|
||||||
let index = stroke.keyPoints.count - 1
|
let index = stroke.keyPoints.endIndex - 1
|
||||||
let start = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
let start = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
||||||
let control = stroke.keyPoints[index - 1]
|
let control = stroke.keyPoints[index - 1]
|
||||||
let end = CGPoint.middle(p1: stroke.keyPoints[index - 1], p2: stroke.keyPoints[index])
|
let end = CGPoint.middle(p1: stroke.keyPoints[index - 1], p2: stroke.keyPoints[index])
|
||||||
@@ -48,12 +48,12 @@ struct SolidPointStrokeGenerator: StrokeGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func finish(at point: CGPoint, on stroke: Stroke) {
|
func finish(at point: CGPoint, on stroke: Stroke) {
|
||||||
switch stroke.keyPoints.count {
|
switch stroke.keyPoints.endIndex {
|
||||||
case 0...1:
|
case 0...1:
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
append(to: point, on: stroke)
|
append(to: point, on: stroke)
|
||||||
let index = stroke.keyPoints.count - 1
|
let index = stroke.keyPoints.endIndex - 1
|
||||||
let start = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
let start = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
||||||
let end = stroke.keyPoints[index]
|
let end = stroke.keyPoints[index]
|
||||||
let control = CGPoint.middle(p1: start, p2: end)
|
let control = CGPoint.middle(p1: start, p2: end)
|
||||||
@@ -64,37 +64,34 @@ struct SolidPointStrokeGenerator: StrokeGenerator {
|
|||||||
private func smoothOutPath(on stroke: Stroke) {
|
private func smoothOutPath(on stroke: Stroke) {
|
||||||
stroke.removeQuads(from: stroke.quadIndex + 1)
|
stroke.removeQuads(from: stroke.quadIndex + 1)
|
||||||
adjustPreviousKeyPoint(on: stroke)
|
adjustPreviousKeyPoint(on: stroke)
|
||||||
switch stroke.keyPoints.count {
|
switch stroke.keyPoints.endIndex {
|
||||||
case 4:
|
case 4:
|
||||||
let index = stroke.keyPoints.count - 2
|
let index = stroke.keyPoints.endIndex - 2
|
||||||
let start = stroke.keyPoints[index - 2]
|
let start = stroke.keyPoints[index - 2]
|
||||||
let end = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
let end = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
||||||
let control = CGPoint.middle(p1: start, p2: end)
|
let control = CGPoint.middle(p1: start, p2: end)
|
||||||
addCurve(from: start, to: end, by: control, on: stroke)
|
addCurve(from: start, to: end, by: control, on: stroke)
|
||||||
fallthrough
|
fallthrough
|
||||||
default:
|
default:
|
||||||
let index = stroke.keyPoints.count - 2
|
let index = stroke.keyPoints.endIndex - 2
|
||||||
let start = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
let start = CGPoint.middle(p1: stroke.keyPoints[index - 2], p2: stroke.keyPoints[index - 1])
|
||||||
let control = stroke.keyPoints[index - 1]
|
let control = stroke.keyPoints[index - 1]
|
||||||
let end = CGPoint.middle(p1: stroke.keyPoints[index - 1], p2: stroke.keyPoints[index])
|
let end = CGPoint.middle(p1: stroke.keyPoints[index - 1], p2: stroke.keyPoints[index])
|
||||||
addCurve(from: start, to: end, by: control, on: stroke)
|
addCurve(from: start, to: end, by: control, on: stroke)
|
||||||
}
|
}
|
||||||
stroke.quadIndex = stroke.quads.count - 1
|
stroke.quadIndex = stroke.quads.endIndex - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
private func adjustPreviousKeyPoint(on stroke: Stroke) {
|
private func adjustPreviousKeyPoint(on stroke: Stroke) {
|
||||||
let index = stroke.keyPoints.count - 1
|
let index = stroke.keyPoints.endIndex - 1
|
||||||
let prev = stroke.keyPoints[index - 1]
|
let prev = stroke.keyPoints[index - 2]
|
||||||
|
let mid = stroke.keyPoints[index - 1]
|
||||||
let current = stroke.keyPoints[index]
|
let current = stroke.keyPoints[index]
|
||||||
let averageX = (prev.x + current.x) / 2
|
let averageX = (prev.x + current.x + mid.x) / 3
|
||||||
let averageY = (prev.y + current.y) / 2
|
let averageY = (prev.y + current.y + mid.y) / 3
|
||||||
let point = CGPoint(x: averageX, y: averageY)
|
let point = CGPoint(x: averageX, y: averageY)
|
||||||
if index != 0 {
|
stroke.keyPoints[index] = point
|
||||||
stroke.keyPoints[index] = point
|
stroke.keyPoints[index - 1] = point
|
||||||
}
|
|
||||||
if index - 1 != 0 {
|
|
||||||
stroke.keyPoints[index - 1] = point
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func addPoint(_ point: CGPoint, on stroke: Stroke) {
|
private func addPoint(_ point: CGPoint, on stroke: Stroke) {
|
||||||
|
|||||||
Reference in New Issue
Block a user