Index: experimental/docs/interpolatorFunctions.js |
diff --git a/experimental/docs/interpolatorFunctions.js b/experimental/docs/interpolatorFunctions.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d51969ff1161ef0e7be1de1bf0c5be4d742d8ddf |
--- /dev/null |
+++ b/experimental/docs/interpolatorFunctions.js |
@@ -0,0 +1,84 @@ |
+function interp(A, B, t) { |
+ return A + (B - A) * t; |
+} |
+ |
+function interp_cubic_coords(x1, x2, x3, x4, t) |
+{ |
+ var ab = interp(x1, x2, t); |
+ var bc = interp(x2, x3, t); |
+ var cd = interp(x3, x4, t); |
+ var abc = interp(ab, bc, t); |
+ var bcd = interp(bc, cd, t); |
+ var abcd = interp(abc, bcd, t); |
+ return abcd; |
+} |
+ |
+// FIXME : only works for path with single cubic |
+function path_partial(value, path) { |
+ assert(isArray(path)); |
+ var out = []; |
+ for (var cIndex = 0; cIndex < path.length; ++cIndex) { |
+ out[cIndex] = {}; |
+ var curveKey = Object.keys(path[cIndex])[0]; |
+ var curve = path[cIndex][curveKey]; |
+ var outArray; |
+ switch (curveKey) { |
+ case "cubic": |
+ var x1 = curve[0], y1 = curve[1], x2 = curve[2], y2 = curve[3]; |
+ var x3 = curve[4], y3 = curve[5], x4 = curve[6], y4 = curve[7]; |
+ var t1 = 0, t2 = value; |
+ var ax = interp_cubic_coords(x1, x2, x3, x4, t1); |
+ var ay = interp_cubic_coords(y1, y2, y3, y4, t1); |
+ var ex = interp_cubic_coords(x1, x2, x3, x4, (t1*2+t2)/3); |
+ var ey = interp_cubic_coords(y1, y2, y3, y4, (t1*2+t2)/3); |
+ var fx = interp_cubic_coords(x1, x2, x3, x4, (t1+t2*2)/3); |
+ var fy = interp_cubic_coords(y1, y2, y3, y4, (t1+t2*2)/3); |
+ var dx = interp_cubic_coords(x1, x2, x3, x4, t2); |
+ var dy = interp_cubic_coords(y1, y2, y3, y4, t2); |
+ var mx = ex * 27 - ax * 8 - dx; |
+ var my = ey * 27 - ay * 8 - dy; |
+ var nx = fx * 27 - ax - dx * 8; |
+ var ny = fy * 27 - ay - dy * 8; |
+ var bx = (mx * 2 - nx) / 18; |
+ var by = (my * 2 - ny) / 18; |
+ var cx = (nx * 2 - mx) / 18; |
+ var cy = (ny * 2 - my) / 18; |
+ outArray = [ |
+ ax, ay, bx, by, cx, cy, dx, dy |
+ ]; |
+ break; |
+ default: |
+ assert(0); // unimplemented |
+ } |
+ out[cIndex][curveKey] = outArray; |
+ } |
+ return out; |
+} |
+ |
+function interp_paths(value, paths) { |
+ assert(isArray(paths)); |
+ assert(paths.length == 2); |
+ var curves0 = paths[0]; |
+ assert(isArray(curves0)); |
+ var curves1 = paths[1]; |
+ assert(isArray(curves1)); |
+ assert(curves0.length == curves1.length); |
+ var out = []; |
+ for (var cIndex = 0; cIndex < curves0.length; ++cIndex) { |
+ out[cIndex] = {}; |
+ var curve0Key = Object.keys(curves0[cIndex])[0]; |
+ var curve1Key = Object.keys(curves1[cIndex])[0]; |
+ assert(curve0Key == curve1Key); |
+ var curve0 = curves0[cIndex][curve0Key]; |
+ var curve1 = curves1[cIndex][curve1Key]; |
+ assert(isArray(curve0)); |
+ assert(isArray(curve1)); |
+ assert(curve0.length == curve1.length); |
+ var outArray = []; |
+ for (var i = 0; i < curve1.length; ++i) { |
+ outArray[i] = curve0[i] + (curve1[i] - curve0[i]) * value; |
+ } |
+ out[cIndex][curve0Key] = outArray; |
+ } |
+ return out; |
+} |