OSDN Git Service

Support a spline mode
authordhrname <dhrname@users.sourceforge.jp>
Sat, 28 Mar 2015 14:16:10 +0000 (23:16 +0900)
committerdhrname <dhrname@users.sourceforge.jp>
Sat, 28 Mar 2015 14:16:10 +0000 (23:16 +0900)
org/w3c/dom/smil.js
tool/Spec/spec/SvgDomSpec.js

index da5c2f5..aa38a21 100644 (file)
@@ -591,9 +591,23 @@ base("$from").of( {
            y = 0,\r
            that = this,\r
            bezier = function (x1, y1, x2, y2, x3, y3, x4, y4) {\r
-              return function (t) {\r
-                x = (x4-3*(x3-x2)-x1)*t*t*t + 3*(x3-2*x2+x1)*t*t + 3*(x2-x1)*t + x1;\r
+              return function (x) {\r
+                var a = [x4-3*(x3-x2)-x1, 3*(x3-2*x2+x1), 3*(x2-x1), x1-x];\r
+                /*三次方程式の解から、ベジェ曲線のyを求める*/\r
+                var s = Math.carda(a),\r
+                    i = 0,\r
+                    si,\r
+                    t = 0;\r
+                while (s[i]) {\r
+                  si = s[i];\r
+                  if ((si.i === 0) && (si.r <= 1) && (si.r >= 0)) {\r
+                    t = si.r;\r
+                  }\r
+                  ++i;\r
+                }\r
+                console.log(t);\r
                 y = (y4-3*(y3-y2)-y1)*t*t*t + 3*(y3-2*y2+y1)*t*t + 3*(y2-y1)*t + y1;\r
+                console.log(s, y);\r
                 return f(y);\r
              };\r
            },\r
@@ -650,7 +664,7 @@ Math.carda = function (a) {
     /*共役複素数*/\r
     x.push( { \r
       r: x[x.length-1].r,\r
-      i: - x[x.length].i\r
+      i: - x[x.length-1].i\r
     } );\r
     return x;\r
   } else {\r
index 761576f..18671f6 100644 (file)
@@ -3261,13 +3261,13 @@ describe("SMIL Animation Spec", function() {
       calc.to.from = from;\r
       expect(calc.call()(1)).toBe(b(1).y+".0");\r
       calc.to.from = from;\r
-      expect(calc.call()(0.5)).toBe(b(0.5).y.toFixed(1));\r
+      expect(calc.call()( b(0.5).x )).toBe(b(0.5).y.toFixed(1));\r
       \r
       var ff = function(k) {\r
         calc.keySplines = k;\r
         calc.to.degit = 10;\r
         var b = bezier(0,0, k[0],k[1], k[2],k[3], 1,1),\r
-            epsiron = 0.00001; //誤差\r
+            epsiron = 1e-10; //誤差\r
         expect(calc.call()(0)).toBe(b(0).y.toFixed(10));\r
         calc.to.from = from;\r
         expect(calc.call()(1)).toBe(b(1).y.toFixed(10));\r