Skip to content

Commit fb701cb

Browse files
committed
Merge pull request web-animations#427 from ericwilligers/rotation-units
Matrix decomposition: support angle units grad and turn
2 parents 3ee1ec5 + da7cdd2 commit fb701cb

File tree

2 files changed

+25
-32
lines changed

2 files changed

+25
-32
lines changed

src/matrix-decomposition.js

+17-24
Original file line numberDiff line numberDiff line change
@@ -253,29 +253,32 @@
253253
];
254254
}
255255

256+
function toRadians(arg) {
257+
var rads = arg.rad || 0;
258+
var degs = arg.deg || 0;
259+
var grads = arg.grad || 0;
260+
var turns = arg.turn || 0;
261+
var angle = (degs / 360 + grads / 400 + turns) * (2 * Math.PI) + rads;
262+
return angle;
263+
}
264+
256265
function convertItemToMatrix(item) {
257266
switch (item.t) {
258267
case 'rotatex':
259-
var rads = item.d[0].rad || 0;
260-
var degs = item.d[0].deg || 0;
261-
var angle = (degs * Math.PI / 180) + rads;
268+
var angle = toRadians(item.d[0]);
262269
return [1, 0, 0, 0,
263270
0, Math.cos(angle), Math.sin(angle), 0,
264271
0, -Math.sin(angle), Math.cos(angle), 0,
265272
0, 0, 0, 1];
266273
case 'rotatey':
267-
var rads = item.d[0].rad || 0;
268-
var degs = item.d[0].deg || 0;
269-
var angle = (degs * Math.PI / 180) + rads;
274+
var angle = toRadians(item.d[0]);
270275
return [Math.cos(angle), 0, -Math.sin(angle), 0,
271276
0, 1, 0, 0,
272277
Math.sin(angle), 0, Math.cos(angle), 0,
273278
0, 0, 0, 1];
274279
case 'rotate':
275280
case 'rotatez':
276-
var rads = item.d[0].rad || 0;
277-
var degs = item.d[0].deg || 0;
278-
var angle = (degs * Math.PI / 180) + rads;
281+
var angle = toRadians(item.d[0]);
279282
return [Math.cos(angle), Math.sin(angle), 0, 0,
280283
-Math.sin(angle), Math.cos(angle), 0, 0,
281284
0, 0, 1, 0,
@@ -284,9 +287,7 @@
284287
var x = item.d[0];
285288
var y = item.d[1];
286289
var z = item.d[2];
287-
var rads = item.d[3].rad || 0;
288-
var degs = item.d[3].deg || 0;
289-
var angle = (degs * Math.PI / 180) + rads;
290+
var angle = toRadians(item.d[3]);
290291

291292
var sqrLength = x * x + y * y + z * z;
292293
if (sqrLength === 0) {
@@ -347,28 +348,20 @@
347348
0, 0, item.d[2], 0,
348349
0, 0, 0, 1];
349350
case 'skew':
350-
var xDegs = item.d[0].deg || 0;
351-
var xRads = item.d[0].rad || 0;
352-
var yDegs = item.d[1].deg || 0;
353-
var yRads = item.d[1].rad || 0;
354-
var xAngle = (xDegs * Math.PI / 180) + xRads;
355-
var yAngle = (yDegs * Math.PI / 180) + yRads;
351+
var xAngle = toRadians(item.d[0]);
352+
var yAngle = toRadians(item.d[1]);
356353
return [1, Math.tan(yAngle), 0, 0,
357354
Math.tan(xAngle), 1, 0, 0,
358355
0, 0, 1, 0,
359356
0, 0, 0, 1];
360357
case 'skewx':
361-
var rads = item.d[0].rad || 0;
362-
var degs = item.d[0].deg || 0;
363-
var angle = (degs * Math.PI / 180) + rads;
358+
var angle = toRadians(item.d[0]);
364359
return [1, 0, 0, 0,
365360
Math.tan(angle), 1, 0, 0,
366361
0, 0, 1, 0,
367362
0, 0, 0, 1];
368363
case 'skewy':
369-
var rads = item.d[0].rad || 0;
370-
var degs = item.d[0].deg || 0;
371-
var angle = (degs * Math.PI / 180) + rads;
364+
var angle = toRadians(item.d[0]);
372365
return [1, Math.tan(angle), 0, 0,
373366
0, 1, 0, 0,
374367
0, 0, 1, 0,

test/js/matrix-interpolation.js

+8-8
Original file line numberDiff line numberDiff line change
@@ -407,42 +407,42 @@ suite('matrix interpolation', function() {
407407
test('decompose various CSS properties with unsupported units', function() {
408408
compareInterpolatedTransforms(
409409
['rotateX(110grad)', 'rotateX(10deg) matrix(1, 0, 0, 1, 0, 0)'],
410-
['rotateX(0deg)', 'rotateX(10deg) matrix(1, 0, 0, 1, 0, 0)'],
410+
['rotateX(99deg)', 'rotateX(10deg) matrix(1, 0, 0, 1, 0, 0)'],
411411
0.5);
412412

413413
compareInterpolatedTransforms(
414414
['rotateY(2turn)', 'rotateY(2rad) matrix(1, 0, 0, 1, 0, 0)'],
415-
['rotateY(0rad)', 'rotateY(2rad) matrix(1, 0, 0, 1, 0, 0)'],
415+
['rotateY(12.56637rad)', 'rotateY(2rad) matrix(1, 0, 0, 1, 0, 0)'],
416416
0.5);
417417

418418
compareInterpolatedTransforms(
419419
['rotate(320deg)', 'rotateY(10grad) matrix(1, 0, 0, 1, 0, 0)'],
420-
['rotate(320deg)', 'rotateY(0deg) matrix(1, 0, 0, 1, 0, 0)'],
420+
['rotate(320deg)', 'rotateY(9deg) matrix(1, 0, 0, 1, 0, 0)'],
421421
0.5);
422422

423423
compareInterpolatedTransforms(
424424
['rotateZ(10grad)', 'rotateZ(2rad) matrix(1, 0, 0, 1, 0, 0)'],
425-
['rotateZ(0rad)', 'rotateZ(2rad) matrix(1, 0, 0, 1, 0, 0)'],
425+
['rotateZ(0.157rad)', 'rotateZ(2rad) matrix(1, 0, 0, 1, 0, 0)'],
426426
0.5);
427427

428428
compareInterpolatedTransforms(
429429
['rotate3d(1, 1, 1, 100deg)', 'rotate3d(1, 1, 1, 2turn) matrix(1, 0, 0, 1, 0, 0)'],
430-
['rotate3d(1, 1, 1, 100deg)', 'rotate3d(1, 1, 1, 0deg) matrix(1, 0, 0, 1, 0, 0)'],
430+
['rotate3d(1, 1, 1, 100deg)', 'rotate3d(1, 1, 1, 720deg) matrix(1, 0, 0, 1, 0, 0)'],
431431
0.5);
432432

433433
compareInterpolatedTransforms(
434434
['skew(30grad)', 'skew(10deg) matrix(1, 0, 0, 1, 0, 0)'],
435-
['skew(0deg)', 'skew(10deg) matrix(1, 0, 0, 1, 0, 0)'],
435+
['skew(27deg)', 'skew(10deg) matrix(1, 0, 0, 1, 0, 0)'],
436436
0.5);
437437

438438
compareInterpolatedTransforms(
439439
['skewx(3grad)', 'skewx(1rad) matrix(1, 0, 0, 1, 0, 0)'],
440-
['skewx(0rad)', 'skewx(1rad) matrix(1, 0, 0, 1, 0, 0)'],
440+
['skewx(0.04712rad)', 'skewx(1rad) matrix(1, 0, 0, 1, 0, 0)'],
441441
0.5);
442442

443443
compareInterpolatedTransforms(
444444
['skewy(3rad)', 'skewy(1grad) matrix(1, 0, 0, 1, 0, 0)'],
445-
['skewy(3rad)', 'skewy(0rad) matrix(1, 0, 0, 1, 0, 0)'],
445+
['skewy(3rad)', 'skewy(0.0157rad) matrix(1, 0, 0, 1, 0, 0)'],
446446
0.5);
447447

448448
compareInterpolatedTransforms(

0 commit comments

Comments
 (0)