UNPKG

@thi.ng/matrices

Version:

Matrix & quaternion operations for 2D/3D geometry processing

64 lines (63 loc) 1.53 kB
import { dotS2, dotS3, dotS4 } from "@thi.ng/vectors/dots"; import { setC2, setC3, setC4 } from "@thi.ng/vectors/setc"; import { vop } from "@thi.ng/vectors/vop"; const mulV = vop(1); const mulV22 = mulV.add( 4, (out, m, v) => setC2(out || v, dotS2(m, v, 0, 0, 2), dotS2(m, v, 1, 0, 2)) ); const mulV23 = mulV.add( 6, (out, m, v) => setC2(out || v, dotS2(m, v, 0, 0, 2) + m[4], dotS2(m, v, 1, 0, 2) + m[5]) ); const mulV33 = mulV.add( 9, (out, m, v) => setC3( out || v, dotS3(m, v, 0, 0, 3), dotS3(m, v, 1, 0, 3), dotS3(m, v, 2, 0, 3) ) ); const mulV44 = mulV.add( 16, (out, m, v) => setC4( out || v, dotS4(m, v, 0, 0, 4), dotS4(m, v, 1, 0, 4), dotS4(m, v, 2, 0, 4), dotS4(m, v, 3, 0, 4) ) ); const mulV344 = (out, m, v) => { const w = dotS3(m, v, 3, 0, 4) + m[15]; return w !== 0 ? setC3( out || v, (dotS3(m, v, 0, 0, 4) + m[12]) / w, (dotS3(m, v, 1, 0, 4) + m[13]) / w, (dotS3(m, v, 2, 0, 4) + m[14]) / w ) : void 0; }; const mulVQ = (out, q, v) => { const { 0: px, 1: py, 2: pz } = v; const { 0: qx, 1: qy, 2: qz, 3: qw } = q; const ix = qw * px + qy * pz - qz * py; const iy = qw * py + qz * px - qx * pz; const iz = qw * pz + qx * py - qy * px; const iw = -qx * px - qy * py - qz * pz; return setC3( out || v, ix * qw + iw * -qx + iy * -qz - iz * -qy, iy * qw + iw * -qy + iz * -qx - ix * -qz, iz * qw + iw * -qz + ix * -qy - iy * -qx ); }; export { mulV, mulV22, mulV23, mulV33, mulV344, mulV44, mulVQ };