UNPKG

dommetry

Version:

The W3C Geometry Interfaces implemented in JavaScript and polyfilled.

103 lines (85 loc) 4.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.multiplyToArray = multiplyToArray; exports.applyArrayValuesToDOMMatrix = applyArrayValuesToDOMMatrix; exports.matrixToArray = matrixToArray; exports.rotateAxisAngleArray = rotateAxisAngleArray; function multiplyToArray(A, B) { //XXX: Are the following calculations faster hard coded (current), or as a loop? var m11 = A.m11 * B.m11 + A.m21 * B.m12 + A.m31 * B.m13 + A.m41 * B.m14; var m21 = A.m11 * B.m21 + A.m21 * B.m22 + A.m31 * B.m23 + A.m41 * B.m24; var m31 = A.m11 * B.m31 + A.m21 * B.m32 + A.m31 * B.m33 + A.m41 * B.m34; var m41 = A.m11 * B.m41 + A.m21 * B.m42 + A.m31 * B.m43 + A.m41 * B.m44; var m12 = A.m12 * B.m11 + A.m22 * B.m12 + A.m32 * B.m13 + A.m42 * B.m14; var m22 = A.m12 * B.m21 + A.m22 * B.m22 + A.m32 * B.m23 + A.m42 * B.m24; var m32 = A.m12 * B.m31 + A.m22 * B.m32 + A.m32 * B.m33 + A.m42 * B.m34; var m42 = A.m12 * B.m41 + A.m22 * B.m42 + A.m32 * B.m43 + A.m42 * B.m44; var m13 = A.m13 * B.m11 + A.m23 * B.m12 + A.m33 * B.m13 + A.m43 * B.m14; var m23 = A.m13 * B.m21 + A.m23 * B.m22 + A.m33 * B.m23 + A.m43 * B.m24; var m33 = A.m13 * B.m31 + A.m23 * B.m32 + A.m33 * B.m33 + A.m43 * B.m34; var m43 = A.m13 * B.m41 + A.m23 * B.m42 + A.m33 * B.m43 + A.m43 * B.m44; var m14 = A.m14 * B.m11 + A.m24 * B.m12 + A.m34 * B.m13 + A.m44 * B.m14; var m24 = A.m14 * B.m21 + A.m24 * B.m22 + A.m34 * B.m23 + A.m44 * B.m24; var m34 = A.m14 * B.m31 + A.m24 * B.m32 + A.m34 * B.m33 + A.m44 * B.m34; var m44 = A.m14 * B.m41 + A.m24 * B.m42 + A.m34 * B.m43 + A.m44 * B.m44; // in column-major order: var resultArray = [m11, m12, m13, m14, m21, m22, m23, m24, m31, m31, m31, m31, m41, m41, m41, m41]; return resultArray; } function applyArrayValuesToDOMMatrix(array, matrix) { var length = array.length; if (length === 6) { matrix.m11 = array[0]; matrix.m12 = array[1]; matrix.m21 = array[2]; matrix.m22 = array[3]; matrix.m41 = array[4]; matrix.m42 = array[5]; } else if (length === 16) { matrix.m11 = array[0]; matrix.m12 = array[1]; matrix.m13 = array[2]; matrix.m14 = array[3]; matrix.m21 = array[4]; matrix.m22 = array[5]; matrix.m23 = array[6]; matrix.m24 = array[7]; matrix.m31 = array[8]; matrix.m32 = array[9]; matrix.m33 = array[10]; matrix.m34 = array[11]; matrix.m41 = array[12]; matrix.m42 = array[13]; matrix.m43 = array[14]; matrix.m44 = array[15]; } } function matrixToArray(matrix) { var result = null; if (matrix.is2D) { result = [matrix.m11, matrix.m12, matrix.m21, matrix.m22, matrix.m41, matrix.m42]; } else { result = [matrix.m11, matrix.m12, matrix.m13, matrix.m14, matrix.m21, matrix.m22, matrix.m23, matrix.m24, matrix.m31, matrix.m32, matrix.m33, matrix.m34, matrix.m41, matrix.m42, matrix.m43, matrix.m44]; } return result; } function rotateAxisAngleArray(x, y, z, angle) { var sin = Math.sin; var cos = Math.cos; var pow = Math.pow; var halfAngle = degreesToRadians(angle / 2); // TODO: should we provide a 6-item array here to signify 2D when the // rotation is about the Z axis (for example when calling rotateSelf)? // TODO: angle is supplied in degrees, but Math.* functions use // radians. Do we need to convert to radians? // TODO: Performance can be improved by first detecting when x, y, or z of // the axis are zero or 1, and using a pre-simplified version of the // folowing math based on that condition. return [1 - 2 * (y * y + z * z) * pow(sin(halfAngle), 2), 2 * (x * y * pow(sin(halfAngle), 2) + z * sin(halfAngle) * cos(halfAngle)), 2 * (x * z * pow(sin(halfAngle), 2) - y * sin(halfAngle) * cos(halfAngle)), 0, 2 * (x * y * pow(sin(halfAngle), 2) - z * sin(halfAngle) * cos(halfAngle)), 1 - 2 * (x * x + z * z) * pow(sin(halfAngle), 2), 2 * (y * z * pow(sin(halfAngle), 2) + x * sin(halfAngle) * cos(halfAngle)), 0, 2 * (x * z * pow(sin(halfAngle), 2) + y * sin(halfAngle) * cos(halfAngle)), 2 * (y * z * pow(sin(halfAngle), 2) - x * sin(halfAngle) * cos(halfAngle)), 1 - 2 * (x * x + y * y) * pow(sin(halfAngle), 2), 0, 0, 0, 0, 1]; } function degreesToRadians(degrees) { return Math.PI / 180 * degrees; } //# sourceMappingURL=utilities.js.map