From 59c449f6c4adf1296f0aa55196a7a9440eaec721 Mon Sep 17 00:00:00 2001
From: kramm <kramm>
Date: Sat, 21 May 2005 17:01:58 +0000
Subject: [PATCH] optimized spline approximation

---
 lib/gfxtools.c |   17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/lib/gfxtools.c b/lib/gfxtools.c
index 938f6e4..ec98609 100644
--- a/lib/gfxtools.c
+++ b/lib/gfxtools.c
@@ -411,7 +411,7 @@ static int approximate3(const cspline_t*s, qspline_t*q, int size, double quality
 	    test.control.y += test.end.y;
 	}
 
-#define PROBES
+//#define PROBES
 #ifdef PROBES
 	/* measure the spline's accurancy, by taking a number of probes */
 	for(t=0;t<probes;t++) {
@@ -444,16 +444,21 @@ static int approximate3(const cspline_t*s, qspline_t*q, int size, double quality
 
 	/* convert control point representation to 
 	   d*x^3 + c*x^2 + b*x + a */
-
-	/* FIXME: we need to do this for the subspline between [start,end],
-	   not [0,1] */
 	dx= s->end.x  - s->control2.x*3 + s->control1.x*3 - s->start.x;
 	dy= s->end.y  - s->control2.y*3 + s->control1.y*3 - s->start.y;
 	
+	/* we need to do this for the subspline between [start,end], not [0,1] 
+	   as a transformation of t->a*t+b does nothing to highest coefficient
+	   of the spline except multiply it with a^3, we just need to modify
+	   d here. */
+	{double m = end-start;
+	 dx*=m*m*m;
+	 dy*=m*m*m;
+	}
+	
 	/* use the integral over (f(x)-g(x))^2 between 0 and 1
 	   to measure the approximation quality. 
-	   (it boils down to const*d^2)
-	 */
+	   (it boils down to const*d^2) */
 	recurse = (dx*dx + dy*dy > quality2);
 #endif
 
-- 
1.7.10.4