rabbit-ear
Version:
origami design library
85 lines (82 loc) • 2.69 kB
JavaScript
/* Rabbit Ear 0.9.4 alpha 2024-04-20 (c) Kraft, GNU GPLv3 License */
const identity2x2 = [1, 0, 0, 1];
const identity2x3 = identity2x2.concat(0, 0);
const multiplyMatrix2Vector2 = (matrix, vector) => [
matrix[0] * vector[0] + matrix[2] * vector[1] + matrix[4],
matrix[1] * vector[0] + matrix[3] * vector[1] + matrix[5],
];
const multiplyMatrix2Line2 = (matrix, { vector, origin }) => ({
vector: [
matrix[0] * vector[0] + matrix[2] * vector[1],
matrix[1] * vector[0] + matrix[3] * vector[1],
],
origin: [
matrix[0] * origin[0] + matrix[2] * origin[1] + matrix[4],
matrix[1] * origin[0] + matrix[3] * origin[1] + matrix[5],
],
});
const multiplyMatrices2 = (m1, m2) => [
m1[0] * m2[0] + m1[2] * m2[1],
m1[1] * m2[0] + m1[3] * m2[1],
m1[0] * m2[2] + m1[2] * m2[3],
m1[1] * m2[2] + m1[3] * m2[3],
m1[0] * m2[4] + m1[2] * m2[5] + m1[4],
m1[1] * m2[4] + m1[3] * m2[5] + m1[5],
];
const determinant2 = m => m[0] * m[3] - m[1] * m[2];
const invertMatrix2 = (m) => {
const det = determinant2(m);
if (Math.abs(det) < 1e-12
|| Number.isNaN(det)
|| !Number.isFinite(m[4])
|| !Number.isFinite(m[5])) {
return undefined;
}
return [
m[3] / det,
-m[1] / det,
-m[2] / det,
m[0] / det,
(m[2] * m[5] - m[3] * m[4]) / det,
(m[1] * m[4] - m[0] * m[5]) / det,
];
};
const makeMatrix2Translate = (x = 0, y = 0) => identity2x2.concat(x, y);
const makeMatrix2Scale = (scale = [1, 1], origin = [0, 0]) => [
scale[0],
0,
0,
scale[1],
scale[0] * -origin[0] + origin[0],
scale[1] * -origin[1] + origin[1],
];
const makeMatrix2UniformScale = (scale = 1, origin = [0, 0]) => (
makeMatrix2Scale([scale, scale], origin)
);
const makeMatrix2Rotate = (angle, origin = [0, 0]) => {
const cos = Math.cos(angle);
const sin = Math.sin(angle);
return [
cos,
sin,
-sin,
cos,
origin[0],
origin[1],
];
};
const makeMatrix2Reflect = (vector, origin = [0, 0]) => {
const angle = Math.atan2(vector[1], vector[0]);
const cosAngle = Math.cos(angle);
const sinAngle = Math.sin(angle);
const cos_Angle = Math.cos(-angle);
const sin_Angle = Math.sin(-angle);
const a = cosAngle * cos_Angle + sinAngle * sin_Angle;
const b = cosAngle * -sin_Angle + sinAngle * cos_Angle;
const c = sinAngle * cos_Angle + -cosAngle * sin_Angle;
const d = sinAngle * -sin_Angle + -cosAngle * cos_Angle;
const tx = origin[0] + a * -origin[0] + -origin[1] * c;
const ty = origin[1] + b * -origin[0] + -origin[1] * d;
return [a, b, c, d, tx, ty];
};
export { determinant2, identity2x2, identity2x3, invertMatrix2, makeMatrix2Reflect, makeMatrix2Rotate, makeMatrix2Scale, makeMatrix2Translate, makeMatrix2UniformScale, multiplyMatrices2, multiplyMatrix2Line2, multiplyMatrix2Vector2 };