quaternion
Version:
A rotation library using quaternions
140 lines (118 loc) • 5.66 kB
TypeScript
type Matrix4_2D = [
[number, number, number, number],
[number, number, number, number],
[number, number, number, number],
[number, number, number, number],
];
type Matrix4 = [
number,
number,
number,
number,
number,
number,
number,
number,
number,
number,
number,
number,
number,
number,
number,
number,
];
type Matrix3_2D = [[number, number, number], [number, number, number], [number, number, number]];
type Matrix3 = [number, number, number, number, number, number, number, number, number];
type QuaternionRecord = { w?: number; x?: number; y?: number; z?: number } & (
| { w: number }
| { x: number }
| { y: number }
| { z: number }
);
interface QuaternionComplexRecord {
re: number;
im: number;
}
type QuaternionArray = [number, number, number, number];
type QuaternionAugmentedArray = [number, number, number];
type AnyQuaternionArray = QuaternionArray | QuaternionAugmentedArray;
export class Quaternion {
constructor(w?: number, x?: number, y?: number, z?: number);
constructor(quaternion: string | AnyQuaternionArray | QuaternionRecord);
// tslint:disable-next-line:unified-signatures Avoid union of QuaternionRecord and QuaternionComplexRecord fields
constructor(quaternion: QuaternionComplexRecord);
w: number;
x: number;
y: number;
z: number;
add(w: number, x?: number, y?: number, z?: number): Quaternion;
add(quaternion: string | AnyQuaternionArray | QuaternionRecord): Quaternion;
// tslint:disable-next-line:unified-signatures Avoid union of QuaternionRecord and QuaternionComplexRecord fields
add(quaternion: QuaternionComplexRecord): Quaternion;
sub(w: number, x?: number, y?: number, z?: number): Quaternion;
sub(quaternion: string | AnyQuaternionArray | QuaternionRecord): Quaternion;
// tslint:disable-next-line:unified-signatures Avoid union of QuaternionRecord and QuaternionComplexRecord fields
sub(quaternion: QuaternionComplexRecord): Quaternion;
neg: () => Quaternion;
norm: () => number;
normSq: () => number;
normalize: () => Quaternion;
mul(w: number, x?: number, y?: number, z?: number): Quaternion;
mul(quaternion: string | AnyQuaternionArray | QuaternionRecord): Quaternion;
// tslint:disable-next-line:unified-signatures Avoid union of QuaternionRecord and QuaternionComplexRecord fields
mul(quaternion: QuaternionComplexRecord): Quaternion;
scale: (s: number) => Quaternion;
dot(w: number, x?: number, y?: number, z?: number): number;
dot(quaternion: string | AnyQuaternionArray | QuaternionRecord): number;
// tslint:disable-next-line:unified-signatures Avoid union of QuaternionRecord and QuaternionComplexRecord fields
dot(quaternion: QuaternionComplexRecord): number;
inverse: () => Quaternion;
div(w: number, x?: number, y?: number, z?: number): Quaternion;
div(quaternion: string | AnyQuaternionArray | QuaternionRecord): Quaternion;
// tslint:disable-next-line:unified-signatures Avoid union of QuaternionRecord and QuaternionComplexRecord fields
div(quaternion: QuaternionComplexRecord): Quaternion;
conjugate: () => Quaternion;
exp: () => Quaternion;
log: () => Quaternion;
pow(w: number, x?: number, y?: number, z?: number): Quaternion;
pow(quaternion: string | AnyQuaternionArray | QuaternionRecord): Quaternion;
// tslint:disable-next-line:unified-signatures Avoid union of QuaternionRecord and QuaternionComplexRecord fields
pow(quaternion: QuaternionComplexRecord): Quaternion;
equals(w: number, x?: number, y?: number, z?: number): boolean;
equals(quaternion: string | AnyQuaternionArray | QuaternionRecord): boolean;
// tslint:disable-next-line:unified-signatures Avoid union of QuaternionRecord and QuaternionComplexRecord fields
equals(quaternion: QuaternionComplexRecord): boolean;
isFinite: () => boolean;
isNaN: () => boolean;
toString: () => string;
real: () => number;
imag: () => [number, number, number];
toVector: () => [number, number, number, number];
toMatrix: <T extends boolean>(twoD: T) => T extends true ? Matrix3_2D : Matrix3;
toMatrix4: <T extends boolean>(twoD: T) => T extends true ? Matrix4_2D : Matrix4;
toCSSTransform: () => string;
toEuler: (order?: string) => [number, number, number];
toAxisAngle: () => [[number, number, number], number];
clone: () => Quaternion;
rotateVector: (v: [number, number, number]) => [number, number, number];
slerp(w: number, x?: number, y?: number, z?: number): (pct: number) => Quaternion;
slerp(quaternion: string | AnyQuaternionArray | QuaternionRecord): (pct: number) => Quaternion;
// tslint:disable-next-line:unified-signatures Avoid union of QuaternionRecord and QuaternionComplexRecord fields
slerp(quaternion: QuaternionComplexRecord): (pct: number) => Quaternion;
}
declare namespace Quaternion {
const Quaternion: Quaternion;
const ZERO: Quaternion;
const ONE: Quaternion;
const I: Quaternion;
const J: Quaternion;
const K: Quaternion;
function fromAxisAngle(axis: [number, number, number], angle: number): Quaternion;
function fromVectors(u: [number, number, number], v: [number, number, number]): Quaternion;
function random(): Quaternion;
function fromEuler(phi: number, theta: number, psi: number, order?: string): Quaternion;
function fromEulerLogical(psi: number, theta: number, phi: number, order?: string): Quaternion;
function fromMatrix(matrix: Matrix3 | Matrix3_2D): Quaternion;
}
export default Quaternion;