// hacky stuff for 4d rotations // see https://math.stackexchange.com/questions/1402362/can-rotations-in-4d-be-given-an-explicit-matrix-form#1402376 import * as THREE from 'three'; function rotZW(theta) { const ctheta = Math.cos(theta); const stheta = Math.sin(theta); return new THREE.Matrix4( ctheta, -stheta, 0, 0, stheta, ctheta, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); } function rotYW(theta) { const ctheta = Math.cos(theta); const stheta = Math.sin(theta); return new THREE.Matrix4( ctheta, 0, -stheta, 0, 0, 1, 0, 0, stheta, 0, ctheta, 0, 0, 0, 0, 1, ); } function rotYZ(theta) { const ctheta = Math.cos(theta); const stheta = Math.sin(theta); return new THREE.Matrix4( ctheta, 0, 0, -stheta, 0, 1, 0, 0, 0, 0, 1, 0, stheta, 0, 0, ctheta, ); } function rotXW(theta) { const ctheta = Math.cos(theta); const stheta = Math.sin(theta); return new THREE.Matrix4( 1, 0, 0, 0, 0, ctheta, -stheta, 0, 0, stheta, ctheta, 0, 0, 0, 0, 1 ); } function rotXZ(theta) { const ctheta = Math.cos(theta); const stheta = Math.sin(theta); return new THREE.Matrix4( 1, 0, 0, 0, 0, ctheta, 0, -stheta, 0, 0, 1, 0, 0, stheta, 0, ctheta, ); } function rotXY(theta) { const ctheta = Math.cos(theta); const stheta = Math.sin(theta); return new THREE.Matrix4( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, ctheta, -stheta, 0, 0, stheta, ctheta, ); } export const rotfn = { XY: rotXY, XZ: rotXZ, XW: rotXW, YZ: rotYZ, YW: rotYW, ZW: rotZW, }; const rotMode = { 'rigid': [ rotYW, rotXW ], 'tumbling': [ rotYW, rotXZ ], 'inside-out': [ rotYW, rotXY ], 'axisymmetrical': [ rotZW, rotXY ] }; export const get_rotation = (mode, theta, psi) => { const fns = rotMode[mode]; return [ fns[0](theta), fns[1](psi) ]; } // [ // rotfn[gui.params.xRotate](theta), // rotfn[gui.params.yRotate](psi) // ];