Skip to content

Commit 47384fd

Browse files
egonelbrebuilds.sr.ht
authored and
builds.sr.ht
committed
internal/stroke: optimize SplitCubic
│ sec/op │ sec/op vs base │ SplitCubic/4-10 37.36n ± 0% 36.16n ± 0% -3.21% (p=0.000 n=10) SplitCubic/8-10 74.53n ± 0% 72.21n ± 0% -3.12% (p=0.000 n=10) SplitCubic/16-10 149.3n ± 1% 144.5n ± 0% -3.22% (p=0.000 n=10) SplitCubic/33-10 340.1n ± 0% 334.4n ± 0% -1.65% (p=0.000 n=10) Signed-off-by: Egon Elbre <egonelbre@gmail.com>
1 parent 2176fed commit 47384fd

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

internal/stroke/stroke.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,11 @@ func approxCubeTo(quads *[]QuadSegment, splits int, maxDistSq float32, from, ctr
709709
// and use the midpoint between the two curves Q1 and Q2 as control point:
710710
//
711711
// C = (3ctrl0 - pen + 3ctrl1 - to)/4
712-
c := ctrl0.Mul(3).Sub(from).Add(ctrl1.Mul(3)).Sub(to).Mul(1.0 / 4.0)
712+
// using, q0 := 3ctrl0 - pen, q1 := 3ctrl1 - to
713+
// C = (q0 + q1)/4
714+
q0 := ctrl0.Mul(3).Sub(from)
715+
q1 := ctrl1.Mul(3).Sub(to)
716+
c := q0.Add(q1).Mul(1.0 / 4.0)
713717
const maxSplits = 32
714718
if splits >= maxSplits {
715719
*quads = append(*quads, QuadSegment{From: from, Ctrl: c, To: to})
@@ -718,10 +722,12 @@ func approxCubeTo(quads *[]QuadSegment, splits int, maxDistSq float32, from, ctr
718722
// The maximum distance between the cubic P and its approximation Q given t
719723
// can be shown to be
720724
//
721-
// d = sqrt(3)/36*|to - 3ctrl1 + 3ctrl0 - pen|
725+
// d = sqrt(3)/36 * |to - 3ctrl1 + 3ctrl0 - pen|
726+
// reusing, q0 := 3ctrl0 - pen, q1 := 3ctrl1 - to
727+
// d = sqrt(3)/36 * |-q1 + q0|
722728
//
723729
// To save a square root, compare d² with the squared tolerance.
724-
v := to.Sub(ctrl1.Mul(3)).Add(ctrl0.Mul(3)).Sub(from)
730+
v := q0.Sub(q1)
725731
d2 := (v.X*v.X + v.Y*v.Y) * 3 / (36 * 36)
726732
if d2 <= maxDistSq {
727733
*quads = append(*quads, QuadSegment{From: from, Ctrl: c, To: to})

0 commit comments

Comments
 (0)