From 1a6b5bd27dcca793c92b7c0e8c68058f05378a62 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Sat, 29 Dec 2018 18:26:08 -0800 Subject: [PATCH] Optimize cubic Bezier sampling a bit --- utils/tile-svg/src/main.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/utils/tile-svg/src/main.rs b/utils/tile-svg/src/main.rs index afb5d0e3..00c002b9 100644 --- a/utils/tile-svg/src/main.rs +++ b/utils/tile-svg/src/main.rs @@ -1736,12 +1736,15 @@ impl CubicAxis { } impl SolveT for CubicAxis { fn sample(&self, t: f32) -> f32 { - // FIXME(pcwalton): Use Horner's method or something. - let p01 = lerp(self.from, self.ctrl0, t); - let p12 = lerp(self.ctrl0, self.ctrl1, t); - let p23 = lerp(self.ctrl1, self.to, t); - let (p012, p123) = (lerp(p01, p12, t), lerp(p12, p23, t)); - lerp(p012, p123, t) + let t2 = t * t; + let t3 = t2 * t; + + let c3 = self.to + 3.0 * (self.ctrl0 - self.ctrl1) - self.from; + let c2 = 3.0 * (self.from - 2.0 * self.ctrl0 + self.ctrl1); + let c1 = 3.0 * (self.ctrl0 - self.from); + let c0 = self.from; + + c3 * t3 + c2 * t2 + c1 * t + c0 } fn sample_deriv(&self, t: f32) -> f32 { let inv_t = 1.0 - t;