jsketcher/modules/math/basis.ts
2022-06-25 15:19:48 -07:00

26 lines
891 B
TypeScript

import Vector, {AXIS, UnitVector} from "math/vector";
import {AXIS_X3, AXIS_Y3, AXIS_Z3, VectorData} from "math/vec";
export type Basis = [Vector, Vector, Vector];
export const IDENTITY_BASIS: Basis = Object.freeze([AXIS.X, AXIS.Y, AXIS.Z] as Vector[]) as Basis;
export const IDENTITY_BASIS3 = Object.freeze([AXIS_X3, AXIS_Y3, AXIS_Z3]) as VectorData[];
export const STANDARD_BASES = Object.freeze({
'XY': IDENTITY_BASIS,
'XZ': [AXIS.X, AXIS.Z, AXIS.Y],
'ZY': [AXIS.Z, AXIS.Y, AXIS.X]
});
export function BasisForPlane(normal: UnitVector, alignY: UnitVector = AXIS.Y, alignZ: UnitVector = AXIS.Z): [UnitVector, UnitVector, UnitVector] {
let alignPlane, x, y;
if (Math.abs(normal.dot(alignY)) < 0.5) {
alignPlane = normal.cross(alignY);
} else {
alignPlane = normal.cross(alignZ);
}
y = alignPlane.cross(normal);
x = y.cross(normal);
return [x, y, normal];
}