{"version":3,"file":"groupD8.mjs","sources":["../../../src/maths/matrix/groupD8.ts"],"sourcesContent":["// Your friendly neighbour https://en.wikipedia.org/wiki/Dihedral_group\n//\n// This file implements the dihedral group of order 16, also called\n// of degree 8. That's why its called groupD8.\n\nimport { Matrix } from './Matrix';\n\n/*\n * Transform matrix for operation n is:\n * | ux | vx |\n * | uy | vy |\n */\n\nconst ux = [1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1];\nconst uy = [0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1];\nconst vx = [0, -1, -1, -1, 0, 1, 1, 1, 0, 1, 1, 1, 0, -1, -1, -1];\nconst vy = [1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, 1, 1, 1, 0, -1];\n\n/**\n * [Cayley Table]{@link https://en.wikipedia.org/wiki/Cayley_table}\n * for the composition of each rotation in the dihederal group D8.\n * @type {number[][]}\n * @private\n */\nconst rotationCayley: number[][] = [];\n\n/**\n * Matrices for each `GD8Symmetry` rotation.\n * @type {Matrix[]}\n * @private\n */\nconst rotationMatrices: Matrix[] = [];\n\n/*\n * Alias for {@code Math.sign}.\n */\nconst signum = Math.sign;\n\n/*\n * Initializes `rotationCayley` and `rotationMatrices`. It is called\n * only once below.\n */\nfunction init(): void\n{\n    for (let i = 0; i < 16; i++)\n    {\n        const row: number[] = [];\n\n        rotationCayley.push(row);\n\n        for (let j = 0; j < 16; j++)\n        {\n            /* Multiplies rotation matrices i and j. */\n            const _ux = signum((ux[i] * ux[j]) + (vx[i] * uy[j]));\n            const _uy = signum((uy[i] * ux[j]) + (vy[i] * uy[j]));\n            const _vx = signum((ux[i] * vx[j]) + (vx[i] * vy[j]));\n            const _vy = signum((uy[i] * vx[j]) + (vy[i] * vy[j]));\n\n            /* Finds rotation matrix matching the product and pushes it. */\n            for (let k = 0; k < 16; k++)\n            {\n                if (ux[k] === _ux && uy[k] === _uy\n                      && vx[k] === _vx && vy[k] === _vy)\n                {\n                    row.push(k);\n                    break;\n                }\n            }\n        }\n    }\n\n    for (let i = 0; i < 16; i++)\n    {\n        const mat = new Matrix();\n\n        mat.set(ux[i], uy[i], vx[i], vy[i], 0, 0);\n        rotationMatrices.push(mat);\n    }\n}\n\ninit();\n\ntype GD8Symmetry = number;\n/**\n * @typedef {number} GD8Symmetry\n * @see groupD8\n */\n\n/**\n * Implements the dihedral group D8, which is similar to\n * [group D4]{@link http://mathworld.wolfram.com/DihedralGroupD4.html};\n * D8 is the same but with diagonals, and it is used for texture\n * rotations.\n *\n * The directions the U- and V- axes after rotation\n * of an angle of `a: GD8Constant` are the vectors `(uX(a), uY(a))`\n * and `(vX(a), vY(a))`. These aren't necessarily unit vectors.\n *\n * **Origin:**<br>\n *  This is the small part of gameofbombs.com portal system. It works.\n * @see maths.groupD8.E\n * @see maths.groupD8.SE\n * @see maths.groupD8.S\n * @see maths.groupD8.SW\n * @see maths.groupD8.W\n * @see maths.groupD8.NW\n * @see maths.groupD8.N\n * @see maths.groupD8.NE\n * @author Ivan @ivanpopelyshev\n * @namespace maths.groupD8\n */\nexport const groupD8 = {\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 0°       | East      |\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    E: 0,\n\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 45°↻     | Southeast |\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    SE: 1,\n\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 90°↻     | South     |\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    S: 2,\n\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 135°↻    | Southwest |\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    SW: 3,\n\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 180°     | West      |\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    W: 4,\n\n    /**\n     * | Rotation    | Direction    |\n     * |-------------|--------------|\n     * | -135°/225°↻ | Northwest    |\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    NW: 5,\n\n    /**\n     * | Rotation    | Direction    |\n     * |-------------|--------------|\n     * | -90°/270°↻  | North        |\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    N: 6,\n\n    /**\n     * | Rotation    | Direction    |\n     * |-------------|--------------|\n     * | -45°/315°↻  | Northeast    |\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    NE: 7,\n\n    /**\n     * Reflection about Y-axis.\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    MIRROR_VERTICAL: 8,\n\n    /**\n     * Reflection about the main diagonal.\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    MAIN_DIAGONAL: 10,\n\n    /**\n     * Reflection about X-axis.\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    MIRROR_HORIZONTAL: 12,\n\n    /**\n     * Reflection about reverse diagonal.\n     * @memberof maths.groupD8\n     * @constant {GD8Symmetry}\n     */\n    REVERSE_DIAGONAL: 14,\n\n    /**\n     * @memberof maths.groupD8\n     * @param {GD8Symmetry} ind - sprite rotation angle.\n     * @returns {GD8Symmetry} The X-component of the U-axis\n     *    after rotating the axes.\n     */\n    uX: (ind: GD8Symmetry): GD8Symmetry => ux[ind],\n\n    /**\n     * @memberof maths.groupD8\n     * @param {GD8Symmetry} ind - sprite rotation angle.\n     * @returns {GD8Symmetry} The Y-component of the U-axis\n     *    after rotating the axes.\n     */\n    uY: (ind: GD8Symmetry): GD8Symmetry => uy[ind],\n\n    /**\n     * @memberof maths.groupD8\n     * @param {GD8Symmetry} ind - sprite rotation angle.\n     * @returns {GD8Symmetry} The X-component of the V-axis\n     *    after rotating the axes.\n     */\n    vX: (ind: GD8Symmetry): GD8Symmetry => vx[ind],\n\n    /**\n     * @memberof maths.groupD8\n     * @param {GD8Symmetry} ind - sprite rotation angle.\n     * @returns {GD8Symmetry} The Y-component of the V-axis\n     *    after rotating the axes.\n     */\n    vY: (ind: GD8Symmetry): GD8Symmetry => vy[ind],\n\n    /**\n     * @memberof maths.groupD8\n     * @param {GD8Symmetry} rotation - symmetry whose opposite\n     *   is needed. Only rotations have opposite symmetries while\n     *   reflections don't.\n     * @returns {GD8Symmetry} The opposite symmetry of `rotation`\n     */\n    inv: (rotation: GD8Symmetry): GD8Symmetry =>\n    {\n        if (rotation & 8)// true only if between 8 & 15 (reflections)\n        {\n            return rotation & 15;// or rotation % 16\n        }\n\n        return (-rotation) & 7;// or (8 - rotation) % 8\n    },\n\n    /**\n     * Composes the two D8 operations.\n     *\n     * Taking `^` as reflection:\n     *\n     * |       | E=0 | S=2 | W=4 | N=6 | E^=8 | S^=10 | W^=12 | N^=14 |\n     * |-------|-----|-----|-----|-----|------|-------|-------|-------|\n     * | E=0   | E   | S   | W   | N   | E^   | S^    | W^    | N^    |\n     * | S=2   | S   | W   | N   | E   | S^   | W^    | N^    | E^    |\n     * | W=4   | W   | N   | E   | S   | W^   | N^    | E^    | S^    |\n     * | N=6   | N   | E   | S   | W   | N^   | E^    | S^    | W^    |\n     * | E^=8  | E^  | N^  | W^  | S^  | E    | N     | W     | S     |\n     * | S^=10 | S^  | E^  | N^  | W^  | S    | E     | N     | W     |\n     * | W^=12 | W^  | S^  | E^  | N^  | W    | S     | E     | N     |\n     * | N^=14 | N^  | W^  | S^  | E^  | N    | W     | S     | E     |\n     *\n     * [This is a Cayley table]{@link https://en.wikipedia.org/wiki/Cayley_table}\n     * @memberof maths.groupD8\n     * @param {GD8Symmetry} rotationSecond - Second operation, which\n     *   is the row in the above cayley table.\n     * @param {GD8Symmetry} rotationFirst - First operation, which\n     *   is the column in the above cayley table.\n     * @returns {GD8Symmetry} Composed operation\n     */\n    add: (rotationSecond: GD8Symmetry, rotationFirst: GD8Symmetry): GD8Symmetry => (\n        rotationCayley[rotationSecond][rotationFirst]\n    ),\n\n    /**\n     * Reverse of `add`.\n     * @memberof maths.groupD8\n     * @param {GD8Symmetry} rotationSecond - Second operation\n     * @param {GD8Symmetry} rotationFirst - First operation\n     * @returns {GD8Symmetry} Result\n     */\n    sub: (rotationSecond: GD8Symmetry, rotationFirst: GD8Symmetry): GD8Symmetry => (\n        rotationCayley[rotationSecond][groupD8.inv(rotationFirst)]\n    ),\n\n    /**\n     * Adds 180 degrees to rotation, which is a commutative\n     * operation.\n     * @memberof maths.groupD8\n     * @param {number} rotation - The number to rotate.\n     * @returns {number} Rotated number\n     */\n    rotate180: (rotation: number): number => rotation ^ 4,\n\n    /**\n     * Checks if the rotation angle is vertical, i.e. south\n     * or north. It doesn't work for reflections.\n     * @memberof maths.groupD8\n     * @param {GD8Symmetry} rotation - The number to check.\n     * @returns {boolean} Whether or not the direction is vertical\n     */\n    isVertical: (rotation: GD8Symmetry): boolean => (rotation & 3) === 2, // rotation % 4 === 2\n\n    /**\n     * Approximates the vector `V(dx,dy)` into one of the\n     * eight directions provided by `groupD8`.\n     * @memberof maths.groupD8\n     * @param {number} dx - X-component of the vector\n     * @param {number} dy - Y-component of the vector\n     * @returns {GD8Symmetry} Approximation of the vector into\n     *  one of the eight symmetries.\n     */\n    byDirection: (dx: number, dy: number): GD8Symmetry =>\n    {\n        if (Math.abs(dx) * 2 <= Math.abs(dy))\n        {\n            if (dy >= 0)\n            {\n                return groupD8.S;\n            }\n\n            return groupD8.N;\n        }\n        else if (Math.abs(dy) * 2 <= Math.abs(dx))\n        {\n            if (dx > 0)\n            {\n                return groupD8.E;\n            }\n\n            return groupD8.W;\n        }\n        else if (dy > 0)\n        {\n            if (dx > 0)\n            {\n                return groupD8.SE;\n            }\n\n            return groupD8.SW;\n        }\n        else if (dx > 0)\n        {\n            return groupD8.NE;\n        }\n\n        return groupD8.NW;\n    },\n\n    /**\n     * Helps sprite to compensate texture packer rotation.\n     * @memberof maths.groupD8\n     * @param {Matrix} matrix - sprite world matrix\n     * @param {GD8Symmetry} rotation - The rotation factor to use.\n     * @param {number} tx - sprite anchoring\n     * @param {number} ty - sprite anchoring\n     */\n    matrixAppendRotationInv: (matrix: Matrix, rotation: GD8Symmetry, tx = 0, ty = 0): void =>\n    {\n        // Packer used \"rotation\", we use \"inv(rotation)\"\n        const mat: Matrix = rotationMatrices[groupD8.inv(rotation)];\n\n        mat.tx = tx;\n        mat.ty = ty;\n        matrix.append(mat);\n    },\n};\n"],"names":[],"mappings":"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"}