diff --git a/dist/mz-math.esm.js.map b/dist/mz-math.esm.js.map index d19dc34..a812247 100644 --- a/dist/mz-math.esm.js.map +++ b/dist/mz-math.esm.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/main/format.ts", "../src/main/other.ts", "../src/main/angle.ts", "../src/main/linear-algebra/vector.ts", "../src/main/linear-algebra/matrix.ts", "../src/main/linear-algebra/matrix-transformations.ts", "../src/main/random.ts", "../src/main/convert.ts", "../src/main/derivative.ts", "../src/main/equations/linear-equations.ts", "../src/main/equations/quadratic-equations.ts", "../src/main/bezier-curves/bezier-curve.ts", "../src/main/path-movement.ts", "../src/main/color.ts", "../src/main/id.ts", "../src/main/collision-detection.ts", "../src/main/animation.ts", "../src/main/circle-ellipse.ts", "../src/main/sequence.ts", "../src/main/statistics.ts", "../src/main/ml.ts", "../src/main/series.ts", "../src/main/combinatorics/factorial.ts", "../src/main/combinatorics/combinatorics.ts"], - "sourcesContent": ["export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}\n\nexport const isClockwise = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n return angle2Deg >= angle1Deg;\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const getAnglesDistance = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0, decimalPlaces = Infinity) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n if(isClockwise(angle1Deg, angle2Deg, startAngleDeg)) {\n return setDecimalPlaces((angle2Deg - angle1Deg + 360) % 360, decimalPlaces);\n }\n else{\n return setDecimalPlaces((angle1Deg - angle2Deg + 360) % 360, decimalPlaces);\n }\n};\n\nexport const percentToAngle = (percent: number, startAngleDeg: number, endAngleDeg: number, circleStartAngle = 0) => {\n if(percent < 0) {\n percent = 0;\n }\n\n if(percent > 100) {\n percent = 100;\n }\n\n const distance = getAnglesDistance(startAngleDeg, endAngleDeg, circleStartAngle);\n\n const clockwise = isClockwise(startAngleDeg, endAngleDeg, circleStartAngle);\n if(clockwise) {\n return mod(circleStartAngle + (percent * distance / 100), 360);\n }\n else {\n return mod(circleStartAngle - (percent * distance / 100), 360);\n }\n};", "import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, LABColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to degrees.\n * @param {number} h\n * @return {number} [0, 360] degrees\n */\nconst convertHueToDegrees = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n return h;\n // convert huw to %\n // return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (max === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n const diff = max - min;\n\n let h = 0;\n\n // if red is max\n if(max === r){\n h = (g - b) / diff + (g < b ? 6 : 0);\n }\n\n // if green is max\n if(max === g){\n h = 2 + (b - r) / diff;\n }\n\n // if blue is max\n if(max === b){\n h = 4 + (r - g) / diff;\n }\n\n return convertHueToDegrees(h);\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n/**\n * RGB to HEX\n * rgbToHex([235, 64, 52]) // #eb4034\n */\nexport const rgbToHex = (rgb: RGBColor) => {\n const [r, g, b] = rgb;\n return '#' + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);\n};\n\nexport const hexToRgb = (hex: string) : RGBColor | null => {\n\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const _hex = hex.replace(shorthandRegex, (_m, r, g, b) => {\n return r + r + g + g + b + b;\n });\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(_hex);\n if(!result) return null;\n\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n\n return [r, g, b];\n};\n\nexport const rgbToLab = (rgb: RGBColor, decimalPlaces = Infinity) : LABColor => {\n\n let r = rgb[0] / 255;\n let g = rgb[1] / 255;\n let b = rgb[2] / 255;\n\n r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n let x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;\n let y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;\n let z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;\n\n x = (x > 0.008856) ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;\n y = (y > 0.008856) ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;\n z = (z > 0.008856) ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;\n\n return [\n setDecimalPlaces((116 * y) - 16, decimalPlaces),\n setDecimalPlaces(500 * (x - y), decimalPlaces),\n setDecimalPlaces(200 * (y - z), decimalPlaces),\n ];\n};\n\nexport const labToRgb = (lab: LABColor, decimalPlaces = Infinity) : RGBColor => {\n let y = (lab[0] + 16) / 116;\n let x = lab[1] / 500 + y;\n let z = y - lab[2] / 200;\n\n x = 0.95047 * ((x * x * x > 0.008856) ? x * x * x : (x - 16/116) / 7.787);\n y = 1.00000 * ((y * y * y > 0.008856) ? y * y * y : (y - 16/116) / 7.787);\n z = 1.08883 * ((z * z * z > 0.008856) ? z * z * z : (z - 16/116) / 7.787);\n\n let r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n let g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n let b = x * 0.0557 + y * -0.2040 + z * 1.0570;\n\n r = (r > 0.0031308) ? (1.055 * Math.pow(r, 1/2.4) - 0.055) : 12.92 * r;\n g = (g > 0.0031308) ? (1.055 * Math.pow(g, 1/2.4) - 0.055) : 12.92 * g;\n b = (b > 0.0031308) ? (1.055 * Math.pow(b, 1/2.4) - 0.055) : 12.92 * b;\n\n return [\n setDecimalPlaces(Math.max(0, Math.min(1, r)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, g)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, b)) * 255, decimalPlaces),\n ];\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n\n// ----------------------- SIMILAR COLORS --------------------------------------\n\n/**\n * Measure the perceptual difference between two RGB colors using the CIE76 color difference formula:\n * delta = Math.sqrt((L2 - L1)^2 + (a2 - a1)^2 + (b2 - b1)^2)\n * https://en.wikipedia.org/wiki/Color_difference\n * https://stackoverflow.com/questions/13586999/color-difference-similarity-between-two-values-with-js\n * <= 1.0 Not perceptible by human eyes.\n * 1 - 2 Perceptible through close observation.\n * 2 - 10 Perceptible at a glance.\n * 11 - 49 Colors are more similar than opposite\n * 100 Colors are exact opposite\n */\nexport const getColorsDelta = (rgbA: RGBColor, rgbB: RGBColor, decimalPlaces = Infinity) => {\n const labA = rgbToLab(rgbA, decimalPlaces);\n const labB = rgbToLab(rgbB, decimalPlaces);\n\n // differences between the LAB components of the two colors\n const deltaL = labA[0] - labB[0];\n const deltaA = labA[1] - labB[1];\n const deltaB = labA[2] - labB[2];\n\n // chroma components\n const c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);\n const c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);\n const deltaC = c1 - c2;\n\n // difference in hue, deltaH, which takes into account both the differences\n // in the a* and b* components of LAB and the differences in chroma.\n let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n\n // It applies weighting factors to the differences in lightness (deltaL),\n // chroma (deltaC), and hue (deltaH).\n const deltaLKlsl = deltaL / (1.0);\n const deltaCkcsc = deltaC / (sc);\n const deltaHkhsh = deltaH / (sh);\n\n // It computes the final color difference using the CIE76 formula:\n // deltaE = sqrt(deltaLKlsl^2 + deltaCkcsc^2 + deltaHkhsh^2),\n // where deltaLKlsl is the weighted lightness difference,\n // deltaCkcsc is the weighted chroma difference,\n // and deltaHkhsh is the weighted hue difference.\n const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n\n // It returns the calculated color difference,\n // optionally rounded to the specified number of decimal places.\n return i < 0 ? 0 : Math.sqrt(i);\n};\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces } from './format';\n\nexport const getCircleCircumference = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * radius, decimalPlaces);\n};\n\nexport const getEllipseCircumference = (radius1: number, radius2: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * Math.sqrt((radius1 ** 2 + radius2 ** 2) / 2), decimalPlaces);\n};\n\nexport const isAngleInCircleArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "/**\n * 1 + 2 + ... + n = n * (n + 1) / 2\n */\nexport const naturalNumbersSequenceSum = (n: number) => {\n return n * (n + 1) / 2;\n};\n\n/**\n * n = the number of terms to be added\n * a = the first term in the sequence\n * d = the constant value between terms\n */\nexport const arithmeticSequenceSum = (n: number, a: number, d: number) => {\n return (n / 2) * (2 * a + (n - 1) * d);\n};", "import { setDecimalPlaces } from './format';\n\n// -------------------- CENTRAL TENDENCY ----------------------------\n\n/**\n * Central tendency: Calculate the Average (mean = \u03BC)\n * Sum of all numbers divided by the array length.\n */\nexport const getArithmeticMean = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const sum = data.reduce((acc, val) => acc + val, 0);\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Frequency map: number ---> it's frequency\n */\nexport const getArithmeticMeanFromFrequency = (frequencyMap: Map, decimalPlaces = Infinity) => {\n\n let mean = 0;\n\n for(const [val, frequency] of frequencyMap) {\n mean += val * frequency;\n }\n\n return setDecimalPlaces(mean, decimalPlaces);\n};\n\n/**\n * Central tendency: What is the central number in the sorted array?\n * Good for lists like [3, 3, 3, 3, 3, 3, 100] - 100 here is called \"Outlier\"\n */\nexport const getMedian = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const copy = [...data].sort((num1, num2) => num1 - num2);\n const mid = Math.floor(copy.length / 2);\n\n if(copy.length % 2 === 0) {\n return setDecimalPlaces((copy[mid] + copy[mid - 1]) / 2, decimalPlaces);\n }\n else {\n return setDecimalPlaces(copy[mid], decimalPlaces);\n }\n};\n\n/**\n * Central tendency: What number is most common in the set.\n * If all numbers have the same frequency, there is no mode.\n */\nexport const getMode = (data: number[]) : number[]|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n // Count frequency of each number in the data array.\n const frequencyMap: Map = new Map();\n for (const num of data) {\n frequencyMap.set(num, (frequencyMap.get(num) || 0) + 1);\n }\n\n let maxFrequency = 0;\n let modes: number[] = [];\n\n // Find the maximum frequency\n for (const [num, frequency] of frequencyMap) {\n if (frequency > maxFrequency) {\n maxFrequency = frequency;\n modes = [num];\n }\n else if (frequency === maxFrequency) {\n modes.push(num);\n }\n }\n\n // If all numbers have the same frequency, there is no mode\n if (modes.length === data.length) {\n return undefined;\n }\n\n // Return the mode(s)\n return modes.length === 1 ? [modes[0]] : modes;\n};\n\n/*\nTODO:\n- geometric mean\n- harmonic mean\n */\n\n// -------------------- DISPERSION ----------------------------\n\n/**\n * Dispersion: the average square distance from the mean.\n * Sum of (x - mean)^2 / N\n */\nexport const getVariance1 = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + ((val - mean) ** 2), 0);\n\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Another formula of dispersion - the average square distance from the mean.\n * (Sum of x^2) / N - (mean ^ 2)\n */\nexport const getVariance = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + (val ** 2), 0);\n\n return setDecimalPlaces((sum / data.length) - (mean ** 2), decimalPlaces);\n};\n\n/**\n * \u03C3\n */\nexport const getStandardDeviation = (data: number[], decimalPlaces = Infinity) => {\n const variance = getVariance(data) ?? 0;\n return setDecimalPlaces(Math.sqrt(variance), decimalPlaces);\n};", "import { setDecimalPlaces } from './format';\nimport { getArithmeticMean, getStandardDeviation } from './statistics';\nimport { IMlNormalizeResult, IMlStandardizeResult } from '../types';\n\n// --------------------- NORMALIZE --------------------------------\n\n/**\n * Changes value to be in the range [0, 1].\n */\nexport const mlNormalizeValue = (value: number, min: number, max: number, decimalPlaces = Infinity) : number => {\n const diff = max - min;\n if(diff === 0) return 0;\n return setDecimalPlaces((value - min) / diff, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [0, 1].\n */\nexport const mlNormalizeArray = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n const copy = [...data];\n\n for(let i=0; i {\n const min = Math.min(...data);\n const max = Math.max(...data);\n const _data = mlNormalizeArray(data, min, max, decimalPlaces);\n\n return {\n min: setDecimalPlaces(min, decimalPlaces),\n max: setDecimalPlaces(max, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlNormalizeUnseenData = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n return mlNormalizeArray(data, min, max, decimalPlaces);\n};\n\n// --------------------- STANDARDIZE --------------------------------\n\n/**\n * Changes value to be in the range [-1, 1].\n */\nexport const mlStandardizeValue = (value: number, mean: number, stdDev: number, decimalPlaces = Infinity) : number => {\n if(stdDev === 0) return 0;\n return setDecimalPlaces((value - mean) / stdDev, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [-1, 1].\n */\nexport const mlStandardizeArray = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity) : number[] => {\n return [...data].map(value => mlStandardizeValue(value, mean, stdDev, decimalPlaces));\n};\n\nexport const mlStandardizeTestData = (data: number[], decimalPlaces = Infinity): IMlStandardizeResult => {\n const mean = getArithmeticMean(data) ?? 0;\n const stdDev = getStandardDeviation(data);\n const _data = mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n\n return {\n mean: setDecimalPlaces(mean, decimalPlaces),\n stdDev: setDecimalPlaces(stdDev, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlStandardizeUnseenData = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity): number[] => {\n return mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n};", "/**\n * Sum of 1 to n numbers:\n * (n * (n + 1)) / 2\n */\nexport const naturalNumbersSum1ToN = (n: number): number => {\n return (n / 2) * (n + 1);\n};\n\n/**\n * Sum of m to n numbers.\n */\nexport const naturalNumbersSumMToN = (m: number, n: number): number => {\n return (n - m + 1) * (m + n) / 2;\n};", "/**\n * The simplest and straightforward method\n * but can become inefficient for extremely large numbers\n * due to growing computational time.\n */\nexport const factorialIterative = (n: number, start = 0): number => {\n\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n let result = 1;\n for (let i = start; i <= n; i++) {\n result *= i;\n }\n return result;\n};\n\n/**\n * A recursive approach is a classic method for calculating factorials\n * but can lead to stack overflow errors\n * for very large inputs because of deep recursion.\n * However, it's a direct translation\n * of the mathematical definition of factorial.\n */\nexport const factorialRecursive = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n // Base case: when n reaches start, return start instead of further reducing\n if (n === start) return start;\n\n // Recursive call\n return n * factorialRecursive(n - 1, start);\n};\n\n/**\n * Memoization (Top-Down Dynamic Programming).\n */\nexport const factorialMemoized = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n const memo = new Map();\n\n const traverse = (num: number, end: number): number => {\n if (num < end) return 1; // Adjust the base case to return 1 if we're below 'end'\n // if (num === 0) return 1;\n\n if (memo.has(num)) return memo.get(num) ?? 1;\n\n if (num === end) {\n memo.set(num, num);\n return num;\n }\n\n const result = num * traverse(num - 1, end);\n\n memo.set(num, result);\n\n return result;\n };\n\n return traverse(n, start);\n};\n\n/**\n * Tabulation (Bottom-Up Dynamic Programming).\n */\nexport const factorial = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === n) {\n return n === 0 ? 1 : n; // If start == n and n == 0, return 1 (0!), otherwise return n\n }\n\n if (start === 0) {\n start = 1;\n }\n\n const table = []; // new Array(n + 1);\n table[0] = 1;\n for (let i = 1; i <= n; i++) {\n table[i] = table[i - 1] * i;\n }\n return table[n] / table[start - 1];\n};", "import { factorial } from './factorial';\n\n/**\n * Permutations with repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - repetition is allowed\n *\n * Formula:\n * --------\n * n^r\n *\n * Intuition:\n * ----------\n * In other words, there are n possibilities for the first choice,\n * THEN there are n possibilities for the second choice, and so on,\n * multiplying each time.\n *\n * A Permutation is an ordered Combination.\n *\n * Example:\n * --------\n * Such as a lock that could be \"333\".\n */\nexport const permutationsWithRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return n ** r;\n};\n\n/**\n * Permutations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - no repetitions\n *\n * Formula:\n * --------\n * P(n,r) = n! / (n \u2212 r)!\n *\n * Intuition:\n * ----------\n * In this case, we have to reduce the number of available choices each time.\n * After choosing, say, number \"14\" we can't choose it again.\n * So, our first choice has 16 possibilities, and our next choice has 15 possibilities,\n * then 14, 13, 12, 11, ... etc.\n *\n * A Permutation is an ordered Combination.\n */\nexport const permutationsWithoutRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return factorial(n, n - r + 1);\n};\n\n/**\n * Order doesn't matter.\n *\n * Example:\n * --------\n * Coins in your pocket (5, 5, 5, 10, 10).\n\nexport const combinationsWithRepetition = () => {\n\n};\n */\n\n/**\n * Combinations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order doesn't matter\n * - no repetitions\n *\n * And is also known as the Binomial Coefficient.\n *\n * Formula:\n * --------\n * C(n, r) = C(n, n - r) = n! / (r! * (n\u2212r)!)\n *\n * Example:\n * --------\n * Such as lottery numbers (2, 14, 15, 27, 30, 33).\n */\nexport const combinationsWithoutRepetition = (n: number, r: number) : number => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n // Initialize a two-dimensional array (or matrix) [n + 1, r + 1].\n // The reason for n + 1 is to ensure that we can access indices directly equal to the value of n\n // without running out of bounds, as array indices start at 0.\n const dp = Array.from({ length: n + 1 }, () => Array(r + 1).fill(0));\n /*\n const dp: number[][] = [];\n for(let i=0; i<=n; i++) {\n dp[i] = [];\n for(let j=0; j<=r; j++) {\n dp[i][j] = 0;\n }\n }*/\n\n // Base cases: C(n, 0) = 1 and C(n, n) = 1 for any n.\n for (let i = 0; i <= n; i++) {\n dp[i][0] = 1;\n if (i <= r) {\n // Only fill this if i <= r to avoid filling non-existent cells\n dp[i][i] = 1;\n }\n }\n\n // Fill the table using the relation C(n, r) = C(n-1, r-1) + C(n-1, r)\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= Math.min(i, r); j++) { // Only compute up to the minimum of i and r\n dp[i][j] = dp[i-1][j-1] + dp[i-1][j];\n }\n }\n\n return dp[n][r];\n};\n\n"], - "mappings": "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", + "sourcesContent": ["export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}\n\nexport const isClockwise = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n return angle2Deg >= angle1Deg;\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const getAnglesDistance = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0, decimalPlaces = Infinity) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n if(isClockwise(angle1Deg, angle2Deg, startAngleDeg)) {\n return setDecimalPlaces((angle2Deg - angle1Deg + 360) % 360, decimalPlaces);\n }\n else{\n return setDecimalPlaces((angle1Deg - angle2Deg + 360) % 360, decimalPlaces);\n }\n};\n\nexport const percentToAngle = (percent: number, startAngleDeg: number, endAngleDeg: number, circleStartAngle = 0) => {\n if(percent < 0) {\n percent = 0;\n }\n\n if(percent > 100) {\n percent = 100;\n }\n\n const distance = getAnglesDistance(startAngleDeg, endAngleDeg, circleStartAngle);\n\n const clockwise = isClockwise(startAngleDeg, endAngleDeg, circleStartAngle);\n if(clockwise) {\n return mod(circleStartAngle + (percent * distance / 100), 360);\n }\n else {\n return mod(circleStartAngle - (percent * distance / 100), 360);\n }\n};", "import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, LABColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to degrees.\n * @param {number} h\n * @return {number} [0, 360] degrees\n */\nconst convertHueToDegrees = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n return h;\n // convert huw to %\n // return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (max === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n const diff = max - min;\n\n let h = 0;\n\n // if red is max\n if(max === r){\n h = (g - b) / diff + (g < b ? 6 : 0);\n }\n\n // if green is max\n if(max === g){\n h = 2 + (b - r) / diff;\n }\n\n // if blue is max\n if(max === b){\n h = 4 + (r - g) / diff;\n }\n\n return convertHueToDegrees(h);\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n/**\n * RGB to HEX\n * rgbToHex([235, 64, 52]) // #eb4034\n */\nexport const rgbToHex = (rgb: RGBColor) => {\n const [r, g, b] = rgb;\n return '#' + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);\n};\n\nexport const hexToRgb = (hex: string) : RGBColor | null => {\n\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const _hex = hex.replace(shorthandRegex, (_m, r, g, b) => {\n return r + r + g + g + b + b;\n });\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(_hex);\n if(!result) return null;\n\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n\n return [r, g, b];\n};\n\nexport const rgbToLab = (rgb: RGBColor, decimalPlaces = Infinity) : LABColor => {\n\n let r = rgb[0] / 255;\n let g = rgb[1] / 255;\n let b = rgb[2] / 255;\n\n r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n let x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;\n let y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;\n let z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;\n\n x = (x > 0.008856) ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;\n y = (y > 0.008856) ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;\n z = (z > 0.008856) ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;\n\n return [\n setDecimalPlaces((116 * y) - 16, decimalPlaces),\n setDecimalPlaces(500 * (x - y), decimalPlaces),\n setDecimalPlaces(200 * (y - z), decimalPlaces),\n ];\n};\n\nexport const labToRgb = (lab: LABColor, decimalPlaces = Infinity) : RGBColor => {\n let y = (lab[0] + 16) / 116;\n let x = lab[1] / 500 + y;\n let z = y - lab[2] / 200;\n\n x = 0.95047 * ((x * x * x > 0.008856) ? x * x * x : (x - 16/116) / 7.787);\n y = 1.00000 * ((y * y * y > 0.008856) ? y * y * y : (y - 16/116) / 7.787);\n z = 1.08883 * ((z * z * z > 0.008856) ? z * z * z : (z - 16/116) / 7.787);\n\n let r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n let g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n let b = x * 0.0557 + y * -0.2040 + z * 1.0570;\n\n r = (r > 0.0031308) ? (1.055 * Math.pow(r, 1/2.4) - 0.055) : 12.92 * r;\n g = (g > 0.0031308) ? (1.055 * Math.pow(g, 1/2.4) - 0.055) : 12.92 * g;\n b = (b > 0.0031308) ? (1.055 * Math.pow(b, 1/2.4) - 0.055) : 12.92 * b;\n\n return [\n setDecimalPlaces(Math.max(0, Math.min(1, r)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, g)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, b)) * 255, decimalPlaces),\n ];\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n\n// ----------------------- SIMILAR COLORS --------------------------------------\n\n/**\n * Measure the perceptual difference between two RGB colors using the CIE76 color difference formula:\n * delta = Math.sqrt((L2 - L1)^2 + (a2 - a1)^2 + (b2 - b1)^2)\n * https://en.wikipedia.org/wiki/Color_difference\n * https://stackoverflow.com/questions/13586999/color-difference-similarity-between-two-values-with-js\n * <= 1.0 Not perceptible by human eyes.\n * 1 - 2 Perceptible through close observation.\n * 2 - 10 Perceptible at a glance.\n * 11 - 49 Colors are more similar than opposite\n * 100 Colors are exact opposite\n */\nexport const getColorsDelta = (rgbA: RGBColor, rgbB: RGBColor, decimalPlaces = Infinity) => {\n const labA = rgbToLab(rgbA, decimalPlaces);\n const labB = rgbToLab(rgbB, decimalPlaces);\n\n // differences between the LAB components of the two colors\n const deltaL = labA[0] - labB[0];\n const deltaA = labA[1] - labB[1];\n const deltaB = labA[2] - labB[2];\n\n // chroma components\n const c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);\n const c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);\n const deltaC = c1 - c2;\n\n // difference in hue, deltaH, which takes into account both the differences\n // in the a* and b* components of LAB and the differences in chroma.\n let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n\n // It applies weighting factors to the differences in lightness (deltaL),\n // chroma (deltaC), and hue (deltaH).\n const deltaLKlsl = deltaL / (1.0);\n const deltaCkcsc = deltaC / (sc);\n const deltaHkhsh = deltaH / (sh);\n\n // It computes the final color difference using the CIE76 formula:\n // deltaE = sqrt(deltaLKlsl^2 + deltaCkcsc^2 + deltaHkhsh^2),\n // where deltaLKlsl is the weighted lightness difference,\n // deltaCkcsc is the weighted chroma difference,\n // and deltaHkhsh is the weighted hue difference.\n const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n\n // It returns the calculated color difference,\n // optionally rounded to the specified number of decimal places.\n return i < 0 ? 0 : Math.sqrt(i);\n};\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces } from './format';\n\nexport const getCircleCircumference = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * radius, decimalPlaces);\n};\n\nexport const getEllipseCircumference = (radius1: number, radius2: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * Math.sqrt((radius1 ** 2 + radius2 ** 2) / 2), decimalPlaces);\n};\n\nexport const isAngleInCircleArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "/**\n * 1 + 2 + ... + n = n * (n + 1) / 2\n */\nexport const naturalNumbersSequenceSum = (n: number) => {\n return n * (n + 1) / 2;\n};\n\n/**\n * n = the number of terms to be added\n * a = the first term in the sequence\n * d = the constant value between terms\n */\nexport const arithmeticSequenceSum = (n: number, a: number, d: number) => {\n return (n / 2) * (2 * a + (n - 1) * d);\n};", "import { setDecimalPlaces } from './format';\n\n// -------------------- CENTRAL TENDENCY ----------------------------\n\n/**\n * Central tendency: Calculate the Average (mean = \u03BC)\n * Sum of all numbers divided by the array length.\n */\nexport const getArithmeticMean = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const sum = data.reduce((acc, val) => acc + val, 0);\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Frequency map: number ---> it's frequency\n */\nexport const getArithmeticMeanFromFrequency = (frequencyMap: Map, decimalPlaces = Infinity) => {\n\n let mean = 0;\n\n for(const [val, frequency] of frequencyMap) {\n mean += val * frequency;\n }\n\n return setDecimalPlaces(mean, decimalPlaces);\n};\n\n/**\n * Central tendency: What is the central number in the sorted array?\n * Good for lists like [3, 3, 3, 3, 3, 3, 100] - 100 here is called \"Outlier\"\n */\nexport const getMedian = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const copy = [...data].sort((num1, num2) => num1 - num2);\n const mid = Math.floor(copy.length / 2);\n\n if(copy.length % 2 === 0) {\n return setDecimalPlaces((copy[mid] + copy[mid - 1]) / 2, decimalPlaces);\n }\n else {\n return setDecimalPlaces(copy[mid], decimalPlaces);\n }\n};\n\n/**\n * Central tendency: What number is most common in the set.\n * If all numbers have the same frequency, there is no mode.\n */\nexport const getMode = (data: number[]) : number[]|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n // Count frequency of each number in the data array.\n const frequencyMap: Map = new Map();\n for (const num of data) {\n frequencyMap.set(num, (frequencyMap.get(num) || 0) + 1);\n }\n\n let maxFrequency = 0;\n let modes: number[] = [];\n\n // Find the maximum frequency\n for (const [num, frequency] of frequencyMap) {\n if (frequency > maxFrequency) {\n maxFrequency = frequency;\n modes = [num];\n }\n else if (frequency === maxFrequency) {\n modes.push(num);\n }\n }\n\n // If all numbers have the same frequency, there is no mode\n if (modes.length === data.length) {\n return undefined;\n }\n\n // Return the mode(s)\n return modes.length === 1 ? [modes[0]] : modes;\n};\n\n/*\nTODO:\n- geometric mean\n- harmonic mean\n */\n\n// -------------------- DISPERSION ----------------------------\n\n/**\n * Dispersion: the average square distance from the mean.\n * Sum of (x - mean)^2 / N\n */\nexport const getVariance1 = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + ((val - mean) ** 2), 0);\n\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Another formula of dispersion - the average square distance from the mean.\n * (Sum of x^2) / N - (mean ^ 2)\n */\nexport const getVariance = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + (val ** 2), 0);\n\n return setDecimalPlaces((sum / data.length) - (mean ** 2), decimalPlaces);\n};\n\n/**\n * \u03C3\n */\nexport const getStandardDeviation = (data: number[], decimalPlaces = Infinity) => {\n const variance = getVariance(data) ?? 0;\n return setDecimalPlaces(Math.sqrt(variance), decimalPlaces);\n};", "import { setDecimalPlaces } from './format';\nimport { getArithmeticMean, getStandardDeviation } from './statistics';\nimport { IMlNormalizeResult, IMlStandardizeResult } from '../types';\n\n// --------------------- NORMALIZE --------------------------------\n\n/**\n * Changes value to be in the range [0, 1].\n */\nexport const mlNormalizeValue = (value: number, min: number, max: number, decimalPlaces = Infinity) : number => {\n const diff = max - min;\n if(diff === 0) return 0;\n return setDecimalPlaces((value - min) / diff, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [0, 1].\n */\nexport const mlNormalizeArray = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n const copy = [...data];\n\n for(let i=0; i {\n const min = Math.min(...data);\n const max = Math.max(...data);\n const _data = mlNormalizeArray(data, min, max, decimalPlaces);\n\n return {\n min: setDecimalPlaces(min, decimalPlaces),\n max: setDecimalPlaces(max, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlNormalizeUnseenData = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n return mlNormalizeArray(data, min, max, decimalPlaces);\n};\n\n// --------------------- STANDARDIZE --------------------------------\n\n/**\n * Changes value to be in the range [-1, 1].\n */\nexport const mlStandardizeValue = (value: number, mean: number, stdDev: number, decimalPlaces = Infinity) : number => {\n if(stdDev === 0) return 0;\n return setDecimalPlaces((value - mean) / stdDev, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [-1, 1].\n */\nexport const mlStandardizeArray = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity) : number[] => {\n return [...data].map(value => mlStandardizeValue(value, mean, stdDev, decimalPlaces));\n};\n\nexport const mlStandardizeTestData = (data: number[], decimalPlaces = Infinity): IMlStandardizeResult => {\n const mean = getArithmeticMean(data) ?? 0;\n const stdDev = getStandardDeviation(data);\n const _data = mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n\n return {\n mean: setDecimalPlaces(mean, decimalPlaces),\n stdDev: setDecimalPlaces(stdDev, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlStandardizeUnseenData = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity): number[] => {\n return mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n};", "/**\n * Sum of 1 to n numbers:\n * (n * (n + 1)) / 2\n */\nexport const naturalNumbersSum1ToN = (n: number): number => {\n return (n / 2) * (n + 1);\n};\n\n/**\n * Sum of m to n numbers.\n */\nexport const naturalNumbersSumMToN = (m: number, n: number): number => {\n return (n - m + 1) * (m + n) / 2;\n};", "/**\n * The simplest and straightforward method\n * but can become inefficient for extremely large numbers\n * due to growing computational time.\n */\nexport const factorialIterative = (n: number, start = 0): number => {\n\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n let result = 1;\n for (let i = start; i <= n; i++) {\n result *= i;\n }\n return result;\n};\n\n/**\n * A recursive approach is a classic method for calculating factorials\n * but can lead to stack overflow errors\n * for very large inputs because of deep recursion.\n * However, it's a direct translation\n * of the mathematical definition of factorial.\n */\nexport const factorialRecursive = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n // Base case: when n reaches start, return start instead of further reducing\n if (n === start) return start;\n\n // Recursive call\n return n * factorialRecursive(n - 1, start);\n};\n\n/**\n * Memoization (Top-Down Dynamic Programming).\n */\nexport const factorialMemoized = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n const memo = new Map();\n\n const traverse = (num: number, end: number): number => {\n if (num < end) return 1; // Adjust the base case to return 1 if we're below 'end'\n // if (num === 0) return 1;\n\n if (memo.has(num)) return memo.get(num) ?? 1;\n\n if (num === end) {\n memo.set(num, num);\n return num;\n }\n\n const result = num * traverse(num - 1, end);\n\n memo.set(num, result);\n\n return result;\n };\n\n return traverse(n, start);\n};\n\n/**\n * Tabulation (Bottom-Up Dynamic Programming).\n */\nexport const factorial = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === n) {\n return n === 0 ? 1 : n; // If start == n and n == 0, return 1 (0!), otherwise return n\n }\n\n if (start === 0) {\n start = 1;\n }\n\n const table = []; // new Array(n + 1);\n table[0] = 1;\n for (let i = 1; i <= n; i++) {\n table[i] = table[i - 1] * i;\n }\n return table[n] / table[start - 1];\n};", "import { factorial } from './factorial';\n\n/**\n * Permutations with repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - repetition is allowed\n *\n * Formula:\n * --------\n * n^r\n *\n * Intuition:\n * ----------\n * In other words, there are n possibilities for the first choice,\n * THEN there are n possibilities for the second choice, and so on,\n * multiplying each time.\n *\n * A Permutation is an ordered Combination.\n *\n * Example:\n * --------\n * Such as a lock that could be \"333\".\n */\nexport const permutationsWithRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return n ** r;\n};\n\n/**\n * Permutations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - no repetitions\n *\n * Formula:\n * --------\n * P(n,r) = n! / (n \u2212 r)!\n *\n * Intuition:\n * ----------\n * In this case, we have to reduce the number of available choices each time.\n * After choosing, say, number \"14\" we can't choose it again.\n * So, our first choice has 16 possibilities, and our next choice has 15 possibilities,\n * then 14, 13, 12, 11, ... etc.\n *\n * A Permutation is an ordered Combination.\n */\nexport const permutationsWithoutRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return factorial(n, n - r + 1);\n};\n\n/**\n * Order doesn't matter.\n *\n * Example:\n * --------\n * Coins in your pocket (5, 5, 5, 10, 10).\n\nexport const combinationsWithRepetition = () => {\n\n};\n */\n\n/**\n * Combinations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order doesn't matter\n * - no repetitions\n *\n * And is also known as the Binomial Coefficient.\n *\n * Formula:\n * --------\n * C(n, r) = C(n, n - r) = n! / (r! * (n\u2212r)!)\n *\n * Example:\n * --------\n * Such as lottery numbers (2, 14, 15, 27, 30, 33).\n *\n * Tabulation (Bottom-Up Dynamic Programming).\n * Time Complexity: \uD835\uDC42(n \u00D7 r)\n * Space Complexity: \uD835\uDC42(n \u00D7 r)\n */\nexport const combinationsWithoutRepetition = (n: number, r: number) : number => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n // Initialize a two-dimensional array (or matrix) [n + 1, r + 1].\n // The reason for n + 1 is to ensure that we can access indices directly equal to the value of n\n // without running out of bounds, as array indices start at 0.\n const dp = Array.from({ length: n + 1 }, () => Array(r + 1).fill(0));\n /*\n const dp: number[][] = [];\n for(let i=0; i<=n; i++) {\n dp[i] = [];\n for(let j=0; j<=r; j++) {\n dp[i][j] = 0;\n }\n }*/\n\n // Base cases: C(n, 0) = 1 and C(n, n) = 1 for any n.\n for (let i = 0; i <= n; i++) {\n dp[i][0] = 1;\n if (i <= r) {\n // Only fill this if i <= r to avoid filling non-existent cells\n dp[i][i] = 1;\n }\n }\n\n // Fill the table using the relation C(n, r) = C(n-1, r-1) + C(n-1, r)\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= Math.min(i, r); j++) { // Only compute up to the minimum of i and r\n dp[i][j] = dp[i-1][j-1] + dp[i-1][j];\n }\n }\n\n return dp[n][r];\n};\n\n"], + "mappings": ";;;;;;;eAAO,IAAMA,EAAmB,CAACC,EAAaC,EAAoC,MAAa,CAC3F,GAAGA,IAAkB,IAAU,OAAOD,EAEnCC,EAAgB,IACfA,EAAgB,GAGpB,IAAMC,EAAcC,EAAA,GAAMF,GAC1B,OAAO,KAAK,MAAMD,EAAME,CAAW,EAAIA,CAC3C,ECNO,IAAME,EAAM,CAACC,EAAWC,KAClBD,EAAIC,EAAKA,GAAKA,EAOdC,EAAe,CAACC,EAAWC,EAAWC,EAAWC,EAAWC,KAC7DA,EAAID,IAAMH,EAAIC,IAAMC,EAAID,GAAKE,EAM5BE,GAAkB,CAACJ,EAAWC,EAAWC,EAAWC,IACtD,KAAK,IAAIH,EAAGE,CAAC,GAAK,KAAK,IAAID,EAAGE,CAAC,EAI7BE,EAAYC,GACd,CAAC,MAAM,WAAWA,CAAK,CAAC,GAAK,SAASA,CAAK,EAMzCC,GAAmB,CAACC,EAAiBC,EAAgBC,EAAoBC,EAAgB,MAAuB,CACzH,GAAM,CAACC,EAAIC,CAAE,EAAIL,EACX,CAACM,EAAIC,CAAE,EAAIN,EAEjB,MAAO,CACHO,EAAiBJ,EAAME,EAAK,KAAK,IAAIJ,CAAU,EAAIC,CAAa,EAChEK,EAAiBH,EAAME,EAAK,KAAK,IAAIL,CAAU,EAAIC,CAAa,CACpE,CACJ,ECjCO,IAAMM,EAAa,CAACC,EAAaC,EAAgB,MAAa,CACjE,IAAMC,EAAQ,KAAK,MAAMF,EAAG,GAAIA,EAAG,EAAE,EACrC,OAAOG,EAAiBD,EAAOD,CAAa,CAChD,EAEaG,GAAsB,CAACJ,EAAaK,EAAgBJ,EAAgB,MAAa,CAC1F,IAAMC,EAAQ,KAAK,MAAMF,EAAG,GAAGK,EAAM,GAAIL,EAAG,GAAGK,EAAM,EAAE,EACvD,OAAOF,EAAiBD,EAAOD,CAAa,CAChD,EAEaK,EAAa,CAACN,EAAaO,EAAqBN,EAAgB,MAAsB,CAC/F,IAAMO,EAASC,EAAST,CAAE,EAC1B,MAAO,CACHG,EAAiB,KAAK,IAAII,CAAW,EAAIC,EAAQP,CAAa,EAC9DE,EAAiB,KAAK,IAAII,CAAW,EAAIC,EAAQP,CAAa,CAClE,CACJ,EAEaS,GAAmB,CAACC,EAAiBV,EAAgB,MAAa,CAC3E,IAAMW,EAAMD,GAAW,IAAM,KAAK,IAClC,OAAOR,EAAiBS,EAAKX,CAAa,CAC9C,EAEaY,GAAmB,CAACC,EAAiBb,EAAgB,MAAa,CAC3E,IAAMW,EAAME,GAAW,KAAK,GAAK,KACjC,OAAOX,EAAiBS,EAAKX,CAAa,CAC9C,EAMac,GAAoB,CAACC,EAAiBC,EAAiBhB,EAAgB,MAAsB,CACtG,IAAMiB,EAAcC,EAAWH,CAAO,EAChCI,EAAcD,EAAWF,CAAO,EAChCI,EAAaC,EAAYJ,EAAaE,CAAW,EACjDlB,EAAQ,KAAK,KAAKmB,CAAU,EAClC,OAAOlB,EAAiBD,EAAOD,CAAa,CAChD,EAEasB,GAAoB,CAACP,EAAkBC,EAAkBhB,EAAgB,MAAsB,CAExG,IAAMuB,EAAOC,EAAKT,EAASC,CAAO,EAC5Bf,EAAQ,KAAK,MAAMsB,EAAK,GAAIA,EAAK,EAAE,EACzC,OAAOrB,EAAiBD,EAAOD,CAAa,CAChD,EAEayB,GAAoB,CAACV,EAAkBC,EAAkBhB,EAAgB,MAC3Ec,GAAkBC,EAASC,EAAShB,CAAa,EAG/C0B,GAAiB,CAACC,EAAsBC,EAA2BC,IAAsC,CAClH,IAAMC,EAAWC,EAAaH,EAAmBC,CAAe,EAC1DG,EAAYD,EAAaH,EAAmBD,CAAY,EACxDM,EAAYF,EAAaF,EAAiBF,CAAY,EACtDO,EAAgBF,EAAYC,EAGlC,OAAO,KAAK,IAAIC,EAAgBJ,CAAQ,GAAK,IACjD,EAEaK,EAAc,CAACC,EAAmBC,EAAmBC,EAAgB,KAC9EF,EAAYA,EAAY,IACxBC,EAAYA,EAAY,IAErBD,EAAYE,IACXF,GAAa,KAGdC,EAAYC,IACXD,GAAa,KAGVA,GAAaD,GAMXL,EAAe,CAACQ,EAAuBC,EAAuBxC,EAAgB,MAAsB,CAC7G,IAAMyC,EAAgB,KAAK,IAAIC,EAAIH,EAAe,GAAG,EAAIG,EAAIF,EAAe,GAAG,CAAC,EAChF,OAAOtC,EAAiBuC,GAAiB,IAAMA,EAAgB,IAAMA,EAAezC,CAAa,CACrG,EAEa2C,GAAoB,CAACP,EAAmBC,EAAmBC,EAAgB,EAAGtC,EAAgB,OACvGoC,EAAYA,EAAY,IACxBC,EAAYA,EAAY,IAErBD,EAAYE,IACXF,GAAa,KAGdC,EAAYC,IACXD,GAAa,KAGdF,EAAYC,EAAWC,EAAWC,CAAa,EACvCpC,GAAkBmC,EAAYD,EAAY,KAAO,IAAKpC,CAAa,EAGnEE,GAAkBkC,EAAYC,EAAY,KAAO,IAAKrC,CAAa,GAIrE4C,GAAiB,CAACC,EAAiBP,EAAuBQ,EAAqBC,EAAmB,IAAM,CAC9GF,EAAU,IACTA,EAAU,GAGXA,EAAU,MACTA,EAAU,KAGd,IAAMf,EAAWa,GAAkBL,EAAeQ,EAAaC,CAAgB,EAG/E,OADkBZ,EAAYG,EAAeQ,EAAaC,CAAgB,EAE/DL,EAAIK,EAAoBF,EAAUf,EAAW,IAAM,GAAG,EAGtDY,EAAIK,EAAoBF,EAAUf,EAAW,IAAM,GAAG,CAErE,ECzHO,IAAMkB,EAAO,CAACC,EAAiBC,EAAiBC,EAAgB,MAAsB,CAEzF,IAAMC,EAAiB,CAAC,EAExB,QAAQC,EAAE,EAAGA,EAAEJ,EAAQ,OAAQI,IAC3BD,EAAO,KAAKE,EAAiBL,EAAQI,GAAKH,EAAQG,GAAIF,CAAa,CAAC,EAGxE,OAAOC,CACX,EAEaG,GAAQ,CAACN,EAAkBC,EAAkBC,EAAgB,MAC/DH,EAAKC,EAASC,EAASC,CAAa,EAGlCK,GAAQ,CAACP,EAAkBC,EAAkBC,EAAgB,MAC/DH,EAAKC,EAASC,EAASC,CAAa,EAKlCM,EAAO,CAACR,EAAiBC,EAAiBC,EAAgB,MAAsB,CAEzF,IAAMC,EAAiB,CAAC,EAExB,QAAQC,EAAE,EAAGA,EAAEJ,EAAQ,OAAQI,IAC3BD,EAAO,KAAKE,EAAiBL,EAAQI,GAAKH,EAAQG,GAAIF,CAAa,CAAC,EAGxE,OAAOC,CACX,EAEaM,EAAQ,CAACT,EAAkBC,EAAkBC,EAAgB,MAC/DM,EAAKR,EAASC,EAASC,CAAa,EAGlCQ,GAAQ,CAACV,EAAkBC,EAAkBC,EAAgB,MAC/DM,EAAKR,EAASC,EAASC,CAAa,EAKlCS,EAAa,CAACC,EAAWC,EAAgBX,EAAgB,MAAqB,CACvF,IAAMC,EAAiB,CAAC,EAExB,QAAQC,EAAE,EAAGA,EAAEQ,EAAE,OAAQR,IACrBD,EAAO,KAAKE,EAAiBO,EAAER,GAAKS,EAAQX,CAAa,CAAC,EAG9D,OAAOC,CACX,EAEaW,GAAc,CAACC,EAAaF,EAAgBX,EAAgB,MAC9DS,EAAWI,EAAIF,EAAQX,CAAa,EAGlCc,EAAc,CAACC,EAAaJ,EAAgBX,EAAgB,MAC9DS,EAAWM,EAAIJ,EAAQX,CAAa,EAKlCgB,EAAgB,CAACN,EAAWC,EAAgBX,EAAgB,MAAqB,CAC1F,GAAGW,IAAW,EACV,MAAM,IAAI,MAAM,yBAAyB,EAG7C,IAAMV,EAAiB,CAAC,EAExB,QAAQC,EAAE,EAAGA,EAAEQ,EAAE,OAAQR,IACrBD,EAAO,KAAKE,EAAiBO,EAAER,GAAKS,EAAQX,CAAa,CAAC,EAG9D,OAAOC,CACX,EAEagB,GAAiB,CAACJ,EAAaF,EAAgBX,EAAgB,MACjEgB,EAAcH,EAAIF,EAAQX,CAAa,EAGrCkB,GAAiB,CAACH,EAAaJ,EAAgBX,EAAgB,MACjEgB,EAAcD,EAAIJ,EAAQX,CAAa,EAKrCmB,EAAU,CAAClB,EAAgBD,EAAgB,MAAa,CACjE,IAAIoB,EAAM,EAEV,QAAQlB,EAAE,EAAGA,EAAED,EAAO,OAAQC,IAC1BkB,GAAOnB,EAAOC,GAAKD,EAAOC,GAG9B,OAAOC,EAAiB,KAAK,KAAKiB,CAAG,EAAGpB,CAAa,CACzD,EAEaqB,EAAW,CAACpB,EAAiBD,EAAgB,MAC/CmB,EAAQlB,EAAQD,CAAa,EAG3BsB,GAAW,CAACrB,EAAiBD,EAAgB,MAC/CmB,EAAQlB,EAAQD,CAAa,EAG3BuB,GAAc,CAACV,EAAaW,EAAmBxB,EAAgB,MAAsB,CAC9F,IAAMyB,EAAQC,EAAWb,CAAE,EAC3B,MAAO,CACHV,EAAiB,KAAK,IAAIsB,CAAK,EAAID,EAAWxB,CAAa,EAC3DG,EAAiB,KAAK,IAAIsB,CAAK,EAAID,EAAWxB,CAAa,CAC/D,CACJ,EAIa2B,GAAY,CAAC7B,EAAiBC,EAAiBC,EAAgB,MAAa,CACrF,IAAM4B,EAAOtB,EAAKR,EAASC,CAAO,EAClC,OAAOoB,EAAQS,EAAM5B,CAAa,CACtC,EAEa6B,GAAa,CAAC/B,EAAkBC,EAAkBC,EAAgB,MAAa,CACxF,IAAM4B,EAAOtB,EAAKR,EAASC,CAAO,EAClC,OAAOoB,EAAQS,EAAM5B,CAAa,CACtC,EAEa8B,GAAa,CAAChC,EAAkBC,EAAkBC,EAAgB,MAAa,CACxF,IAAM4B,EAAOtB,EAAKR,EAASC,CAAO,EAClC,OAAOoB,EAAQS,EAAM5B,CAAa,CACtC,EAOa+B,EAAa,CAACrB,EAAWV,EAAgB,MAAsB,CACxE,IAAMgC,EAASb,EAAQT,CAAC,EAClBuB,EAAqB,CAAC,EAE5B,QAAQ/B,EAAE,EAAGA,EAAEQ,EAAE,OAAQR,IACrB+B,EAAW,KAAKD,IAAW,EAAI,EAAI7B,EAAiBO,EAAER,GAAK8B,EAAQhC,CAAa,CAAC,EAGrF,OAAOiC,CACX,EAEaC,EAAc,CAACrB,EAAab,EAAgB,MAC9C+B,EAAWlB,EAAIb,CAAa,EAG1BmC,EAAc,CAACpB,EAAaf,EAAgB,MAC9C+B,EAAWhB,EAAIf,CAAa,EAK1BoC,EAAc,CAACtC,EAAiBC,EAAiBC,EAAgB,MAAsB,CAChG,IAAIoB,EAAM,EAEV,QAAQlB,EAAE,EAAGA,EAAEJ,EAAQ,OAAQI,IAC3BkB,GAAOtB,EAAQI,GAAKH,EAAQG,GAGhC,OAAOC,EAAiBiB,EAAKpB,CAAa,CAC9C,EAEaqC,GAAe,CAACvC,EAAkBC,EAAkBC,EAAgB,MACtEoC,EAAYtC,EAASC,EAASC,CAAa,EAGzCsC,GAAe,CAACxC,EAAkBC,EAAkBC,EAAgB,MACtEoC,EAAYtC,EAASC,EAASC,CAAa,EASzCuC,GAAiB,CAACzC,EAAkBC,EAAkBC,EAAgB,MACxE,CACHG,EAAiBL,EAAQ,GAAKC,EAAQ,GAAKD,EAAQ,GAAKC,EAAQ,GAAIC,CAAa,EACjFG,EAAiBL,EAAQ,GAAKC,EAAQ,GAAKD,EAAQ,GAAKC,EAAQ,GAAIC,CAAa,EACjFG,EAAiBL,EAAQ,GAAKC,EAAQ,GAAKD,EAAQ,GAAKC,EAAQ,GAAIC,CAAa,CACrF,EAKSa,GAAK,CAAC2B,EAAe,IACvB,CAACA,EAAcA,CAAY,EAGzBzB,GAAK,CAACyB,EAAe,IACvB,CAACA,EAAcA,EAAcA,CAAY,EAGvCC,GAAK,CAACD,EAAe,IACvB,CAACA,EAAcA,EAAcA,EAAcA,CAAY,EAGrDE,GAAK,CAACC,EAAWH,EAAe,IAAc,CAEvD,GAAGG,EAAI,EACH,MAAM,IAAI,MAAM,kCAAkC,EAGtD,IAAM1C,EAAiB,CAAC,EACxB,QAAQC,EAAE,EAAGA,EAAEyC,EAAGzC,IACdD,EAAO,KAAKuC,CAAY,EAE5B,OAAOvC,CACX,EAKa2C,GAAoB,CAACC,EAAkBC,IAA8B,CAC9E,IAAI7C,EAAkB,CAAC,EAAG,CAAC,EAC3B,OAAAA,EAASsB,GAAYtB,EAAQ4C,CAAQ,EAC9BE,EAAW9C,EAAQ6C,CAAQ,CACtC,EAIaE,GAAS,CAAClD,EAAiBC,IAA6B,CACjE,GAAGD,EAAQ,SAAWC,EAAQ,OAAQ,MAAO,GAE7C,QAAQG,EAAE,EAAGA,EAAEJ,EAAQ,OAAQI,IAC3B,GAAGJ,EAAQI,KAAOH,EAAQG,GAAI,MAAO,GAGzC,MAAO,EACX,EAIa+C,GAAc,CAACnD,EAAkBC,EAAkBC,EAAgB,MAAsB,CAClG,IAAMkD,EAAM3C,EAAMR,EAASD,CAAO,EAClC,MAAO,CACH,CAACK,EAAiB+C,EAAI,GAAIlD,CAAa,EACvCG,EAAiB+C,EAAI,GAAIlD,CAAa,CAC1C,CACJ,ECpPO,IAAMmD,GAAO,CAACC,EAAiBC,EAAiBC,EAAgB,MAAqB,CACxF,IAAMC,EAAiB,CAAC,EAExB,QAAQC,EAAE,EAAGA,EAAEJ,EAAQ,OAAQI,IAC3BD,EAAO,KAAKE,EAAKL,EAAQI,GAAIH,EAAQG,GAAIF,CAAa,CAAC,EAG3D,OAAOC,CACX,EAEaG,GAAQ,CAACN,EAAkBC,EAAkBC,EAAgB,MAC/DH,GAAKC,EAASC,EAASC,CAAa,EAGlCK,GAAQ,CAACP,EAAkBC,EAAkBC,EAAgB,MAC/DH,GAAKC,EAASC,EAASC,CAAa,EAKlCM,GAAO,CAACR,EAAiBC,EAAiBC,EAAgB,MAAqB,CACxF,IAAMC,EAAiB,CAAC,EAExB,QAAQC,EAAE,EAAGA,EAAEJ,EAAQ,OAAQI,IAC3BD,EAAO,KAAKM,EAAKT,EAAQI,GAAIH,EAAQG,GAAIF,CAAa,CAAC,EAG3D,OAAOC,CACX,EAEaO,GAAQ,CAACV,EAAkBC,EAAkBC,EAAgB,MAC/DM,GAAKR,EAASC,EAASC,CAAa,EAGlCS,GAAQ,CAACX,EAAkBC,EAAkBC,EAAgB,MAC/DM,GAAKR,EAASC,EAASC,CAAa,EAKlCU,GAAa,CAACC,EAAWC,EAAgBZ,EAAgB,MAAqB,CACvF,IAAMC,EAAiB,CAAC,EAExB,QAAUY,KAAKF,EACXV,EAAO,KAAKa,EAAWD,EAAGD,EAAQZ,CAAa,CAAC,EAGpD,OAAOC,CACX,EAEac,GAAc,CAACC,EAAaJ,EAAgBZ,EAAgB,MAC9DU,GAAWM,EAAIJ,EAAQZ,CAAa,EAGlCiB,GAAc,CAACC,EAAaN,EAAgBZ,EAAgB,MAC9DU,GAAWQ,EAAIN,EAAQZ,CAAa,EAKlCmB,EAAgB,CAACR,EAAWC,EAAgBZ,EAAgB,MAAqB,CAC1F,GAAGY,IAAW,EACV,MAAM,IAAI,MAAM,yBAAyB,EAG7C,IAAMX,EAAiB,CAAC,EAExB,QAAUY,KAAKF,EACXV,EAAO,KAAKmB,EAAcP,EAAGD,EAAQZ,CAAa,CAAC,EAGvD,OAAOC,CACX,EAEaoB,GAAiB,CAACL,EAAaJ,EAAgBZ,EAAgB,MACjEmB,EAAcH,EAAIJ,EAAQZ,CAAa,EAGrCsB,GAAiB,CAACJ,EAAaN,EAAgBZ,EAAgB,MACjEmB,EAAcD,EAAIN,EAAQZ,CAAa,EAMrCuB,EAAcZ,GAAsB,CAE7C,IAAMa,EAAeb,EAAE,OACvB,GAAGa,GAAgB,EAAG,OAAOb,EAE7B,IAAMc,EAAed,EAAE,GAAG,OAC1B,GAAGc,GAAgB,EAAG,OAAOd,EAE7B,IAAMV,EAAiB,CAAC,EACxB,QAAQC,EAAE,EAAGA,EAAEuB,EAAcvB,IACzBD,EAAO,KAAK,CAAC,CAAC,EAGlB,QAAQC,EAAE,EAAGA,EAAEsB,EAActB,IACzB,QAAQwB,EAAE,EAAGA,EAAED,EAAcC,IACzBzB,EAAOyB,GAAG,KAAKf,EAAET,GAAGwB,EAAE,EAI9B,OAAOzB,CACX,EAEa0B,GAAeX,GACjBO,EAAWP,CAAE,EAGXY,GAAeV,GACjBK,EAAWL,CAAE,EAKXW,GAAS,CAAClB,EAAWmB,EAAe,IAAc,CAE3D,GAAGnB,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMoB,EAAc,CAAC,EAErB,QAAQ7B,EAAE,EAAGA,EAAES,EAAE,OAAQT,IAAI,CACzB,IAAM8B,EAAOrB,EAAET,GAAG,OAEZ+B,EAAiB,CAAC,EACxB,QAAQP,EAAE,EAAGA,EAAEM,EAAMN,IACjBO,EAAO,KAAKH,CAAY,EAG5BC,EAAI,KAAKE,CAAM,CACnB,CAEA,OAAOF,CACX,EAEaG,GAAU,CAAClB,EAAac,EAAe,IACzCD,GAAOb,EAAIc,CAAY,EAGrBK,GAAU,CAACjB,EAAaY,EAAe,IACzCD,GAAOX,EAAIY,CAAY,EAKrBM,GAAO,CAACN,EAAe,IACzB,CACH,CAACA,EAAcA,CAAY,EAC3B,CAACA,EAAcA,CAAY,CAC/B,EAGSO,GAAO,CAACP,EAAe,IACzB,CACH,CAACA,EAAcA,EAAcA,CAAY,EACzC,CAACA,EAAcA,EAAcA,CAAY,EACzC,CAACA,EAAcA,EAAcA,CAAY,CAC7C,EAGSQ,GAAO,CAACR,EAAe,IACzB,CACH,CAACA,EAAcA,EAAcA,EAAcA,CAAY,EACvD,CAACA,EAAcA,EAAcA,EAAcA,CAAY,EACvD,CAACA,EAAcA,EAAcA,EAAcA,CAAY,EACvD,CAACA,EAAcA,EAAcA,EAAcA,CAAY,CAC3D,EAGSS,GAAO,CAACC,EAAWC,EAAWX,EAAe,IAAc,CACpE,GAAGU,GAAK,GAAKC,GAAK,EACd,MAAM,IAAI,MAAM,mCAAmC,EAGvD,IAAMxC,EAAiB,CAAC,EAExB,QAAQC,EAAE,EAAGA,EAAEsC,EAAGtC,IACdD,EAAO,KAAKyC,GAAGD,EAAGX,CAAY,CAAC,EAGnC,OAAO7B,CACX,EAEa0C,GAAY,IACd,CACH,CAAC,EAAG,CAAC,EACL,CAAC,EAAG,CAAC,CACT,EAGSC,GAAY,IACd,CACH,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,CACZ,EAGSC,GAAY,IACd,CACH,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAQSC,GAAaN,GAAsB,CAC5C,GAAGA,EAAI,EACH,MAAM,IAAI,MAAM,kCAAkC,EAGtD,GAAGA,IAAM,EAAG,MAAO,CAAC,EAEpB,IAAMvC,EAAiB,CAAC,EAExB,QAAQC,EAAE,EAAGA,EAAEsC,EAAGtC,IAAI,CAClB,IAAM+B,EAAiB,CAAC,EACxB,QAAQP,EAAE,EAAGA,EAAEc,EAAGd,IACdO,EAAO,KAAK/B,IAAMwB,EAAI,EAAI,CAAC,EAE/BzB,EAAO,KAAKgC,CAAM,CACtB,CAEA,OAAOhC,CACX,EAIa8C,EAAapC,GAAsB,CAC5C,IAAMV,EAAiB,CAAC,EAExB,QAAQC,EAAE,EAAGA,EAAES,EAAE,OAAQT,IAAI,CACzB,IAAMW,EAAIF,EAAET,GACN+B,EAAiB,CAAC,EACxB,QAAQP,EAAE,EAAGA,EAAEb,EAAE,OAAQa,IACrBO,EAAO,KAAKpB,EAAEa,EAAE,EAEpBzB,EAAO,KAAKgC,CAAM,CACtB,CAEA,OAAOhC,CACX,EAEa+C,GAAchC,GAChB+B,EAAU/B,CAAE,EAGViC,GAAc/B,GAChB6B,EAAU7B,CAAE,EAKVgC,GAAa,CAACvC,EAAWwC,IAAyB,CAC3D,GAAGxC,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMyC,EAAOL,EAAUpC,CAAC,EACxB,QAAQT,EAAE,EAAGA,EAAEkD,EAAK,OAAQlD,IACxBkD,EAAKlD,GAAG,KAAKiD,EAAIjD,EAAE,EAGvB,OAAOkD,CACX,EAEaC,GAAc,CAAC1C,EAAWwC,IAAyB,CAC5D,GAAGxC,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMyC,EAAOL,EAAUpC,CAAC,EACxB,QAAQT,EAAE,EAAGA,EAAEkD,EAAK,OAAQlD,IACxBkD,EAAKlD,GAAG,QAAQiD,EAAIjD,EAAE,EAG1B,OAAOkD,CACX,EAEaE,GAAa,CAAC3C,EAAW4C,IAAyB,CAC3D,IAAMH,EAAOL,EAAUpC,CAAC,EACxB,OAAAyC,EAAK,KAAKG,CAAG,EACNH,CACX,EAEaI,GAAc,CAACxC,EAAauC,IAA2B,CAChE,IAAMH,EAAOJ,GAAWhC,CAAE,EAC1B,OAAAoC,EAAK,KAAKG,CAAG,EACNH,CACX,EAEaK,GAAc,CAACvC,EAAaqC,IAA2B,CAChE,IAAMH,EAAOH,GAAW/B,CAAE,EAC1B,OAAAkC,EAAK,KAAKG,CAAG,EACNH,CACX,EAEaM,GAAc,CAAC/C,EAAW4C,IAAyB,CAC5D,IAAMH,EAAOL,EAAUpC,CAAC,EACxB,OAAAyC,EAAK,QAAQG,CAAG,EACTH,CACX,EAEaO,GAAe,CAAC3C,EAAauC,IAA2B,CACjE,IAAMH,EAAOJ,GAAWhC,CAAE,EAC1B,OAAAoC,EAAK,QAAQG,CAAG,EACTH,CACX,EAEaQ,GAAe,CAAC1C,EAAaqC,IAA2B,CACjE,IAAMH,EAAOH,GAAW/B,CAAE,EAC1B,OAAAkC,EAAK,QAAQG,CAAG,EACTH,CACX,EAIaS,GAAelD,GAAsB,CAC9C,GAAGA,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMyC,EAAOL,EAAUpC,CAAC,EACxB,OAAAyC,EAAK,IAAI,EACFA,CACX,EAEaU,GAAgBnD,GAAsB,CAC/C,GAAGA,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMyC,EAAOL,EAAUpC,CAAC,EACxB,OAAAyC,EAAK,MAAM,EACJA,CACX,EAEaW,GAAkBpD,GAAsB,CACjD,GAAGA,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMyC,EAAOL,EAAUpC,CAAC,EACxB,QAAQT,EAAE,EAAGA,EAAEkD,EAAK,OAAQlD,IACxBkD,EAAKlD,GAAG,IAAI,EAGhB,OAAOkD,CACX,EAEaY,GAAmBrD,GAAsB,CAClD,GAAGA,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMyC,EAAOL,EAAUpC,CAAC,EACxB,QAAQT,EAAE,EAAGA,EAAEkD,EAAK,OAAQlD,IACxBkD,EAAKlD,GAAG,MAAM,EAGlB,OAAOkD,CACX,EAIaa,GAAmBtD,GAAuB,CACnD,GAAGA,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMsB,EAAiB,CAAC,EACxB,QAAQ/B,EAAE,EAAGA,EAAES,EAAE,OAAQT,IACrB+B,EAAO,KAAKtB,EAAET,GAAG,EAAE,EAEvB,OAAO+B,CACX,EAEaiC,GAAkBvD,GAAuB,CAClD,GAAGA,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMqB,EAAOrB,EAAE,GAAG,OAEZsB,EAAiB,CAAC,EACxB,QAAQ/B,EAAE,EAAGA,EAAES,EAAE,OAAQT,IACrB+B,EAAO,KAAKtB,EAAET,GAAG8B,EAAO,EAAE,EAE9B,OAAOC,CACX,EAEakC,GAAa,CAACxD,EAAWyD,IAA8B,CAChE,GAAGzD,EAAE,QAAU,EAAG,MAAO,CAAC,EAE1B,IAAMsB,EAAiB,CAAC,EACxB,QAAQ/B,EAAE,EAAGA,EAAES,EAAE,OAAQT,IACrB+B,EAAO,KAAKtB,EAAET,GAAGkE,EAAS,EAE9B,OAAOnC,CACX,EAUaoC,EAAO,CAACvE,EAAiBC,EAAiBC,EAAgB,MAAqB,CAExF,IAAMC,EAAiB,CAAC,EACxB,QAAQ,EAAE,EAAG,EAAEH,EAAQ,OAAQ,IAC3BG,EAAO,KAAK,CAAC,CAAC,EAGlB,IAAMqE,EAAa/C,EAAWxB,CAAO,EAErC,GAAGE,EAAO,SAAWqE,EAAW,OAC5B,MAAM,IAAI,MAAM,gGAAgG,EAGpH,QAAQ,EAAE,EAAG,EAAExE,EAAQ,OAAQ,IAAI,CAC/B,IAAMyE,EAAUzE,EAAQ,GAExB,QAAQ4B,EAAE,EAAGA,EAAE4C,EAAW,OAAQ5C,IAAI,CAClC,IAAM8C,EAAUF,EAAW5C,GACrB+C,EAAUC,EAAYH,EAASC,EAASxE,CAAa,EAC3DC,EAAO,GAAG,KAAKwE,CAAO,CAC1B,CACJ,CAEA,OAAOxE,CACX,EAEa0E,EAAa,CAAC1E,EAAgBgC,EAAgBjC,EAAgB,MAAqB,CAE5F,GAAGC,EAAO,OAAS,EAAG,MAAO,CAAC,EAE9B,GAAGA,EAAO,GAAG,SAAWgC,EAAO,OAC3B,MAAM,IAAI,MAAM,gFAAgF,EAGpG,IAAMF,EAAc,CAAC,EAErB,QAAQ7B,EAAE,EAAGA,EAAED,EAAO,OAAQC,IAC1B6B,EAAI7B,GAAKwE,EAAYzE,EAAOC,GAAI+B,EAAQjC,CAAa,EAGzD,OAAO+B,CACX,EAIa6C,GAAS,CAAC9E,EAAiBC,IAA6B,CACjE,GAAGD,EAAQ,SAAWC,EAAQ,OAAQ,MAAO,GAE7C,QAAQG,EAAE,EAAGA,EAAEJ,EAAQ,OAAQI,IAC3B,GAAG,CAAC2E,GAAO/E,EAAQI,GAAIH,EAAQG,EAAE,EAAG,MAAO,GAG/C,MAAO,EACX,EASM4E,GAAe,CAACnE,EAAW4C,EAAaJ,IAAgB,CAC1D,IAAMnB,EAAOrB,EAAE,OAEf,GAAGqB,GAAQ,EACP,MAAM,IAAI,MAAM,iCAAiC,EAGrD,GAAGA,IAASrB,EAAE,GAAG,OACb,MAAM,IAAI,MAAM,4BAA4B,EAGhD,IAAMV,EAAiB,CAAC,EAExB,QAAQ,EAAE,EAAG,EAAE+B,EAAM,IAAI,CACrB,GAAG,IAAMuB,EAAK,SAEd,IAAMtB,EAAiB,CAAC,EAExB,QAAQP,EAAE,EAAGA,EAAEM,EAAMN,IACdA,IAAMyB,GACTlB,EAAO,KAAKtB,EAAE,GAAGe,EAAE,EAGvBzB,EAAO,KAAKgC,CAAM,CACtB,CAEA,OAAOhC,CACX,EAKa8E,GAAS,CAACpE,EAAW4C,EAAaJ,IAAgB,CAC3D,IAAMnB,EAAOrB,EAAE,OAEf,GAAGqB,GAAQ,EACP,MAAM,IAAI,MAAM,iCAAiC,EAGrD,GAAGA,IAASrB,EAAE,GAAG,OACb,MAAM,IAAI,MAAM,4BAA4B,EAIhD,IAAMV,EAAS6E,GAAanE,EAAG4C,EAAKJ,CAAG,EAGvC,OAAO6B,EAAa/E,CAAM,CAC9B,EAMa+E,EAAgB/E,GAA2B,CACpD,IAAM+B,EAAO/B,EAAO,OACpB,GAAG+B,IAAS,EAAG,MAAO,GAEtB,GAAGA,IAAS/B,EAAO,GAAG,OAClB,MAAM,IAAI,MAAM,4BAA4B,EAGhD,GAAG+B,IAAS,EAAG,OAAO/B,EAAO,GAAG,GAChC,GAAG+B,IAAS,EAAG,OAAOiD,GAAchF,CAAiB,EAErD,IAAIiF,EAAI,EAER,QAAQhF,EAAE,EAAGA,EAAE8B,EAAM9B,IAAI,CACrB,IAAMiF,EAAQJ,GAAO9E,EAAQ,EAAGC,CAAC,EAE7BkF,EAAQnF,EAAO,GAAGC,GACnBA,EAAI,IAAM,IACTkF,EAAQ,CAACA,GAGbF,GAAKC,EAAQC,CACjB,CAEA,OAAOF,CACX,EAMaD,GAAiBjE,GAAwB,CAClD,GAAGA,EAAG,SAAWA,EAAG,GAAG,OACnB,MAAM,IAAI,MAAM,4BAA4B,EAGhD,OAAOA,EAAG,GAAG,GAAKA,EAAG,GAAG,GAAKA,EAAG,GAAG,GAAKA,EAAG,GAAG,EAClD,EAMaqE,GAAiBnE,GAAwB,CAClD,GAAGA,EAAG,SAAWA,EAAG,GAAG,OACnB,MAAM,IAAI,MAAM,4BAA4B,EAGhD,OAAO8D,EAAa9D,CAAE,CAC1B,EAIaoE,GAActE,GAA8B,CACrD,GAAGA,EAAG,SAAWA,EAAG,GAAG,OACnB,MAAM,IAAI,MAAM,4BAA4B,EAGhD,MAAO,CACL,CAACA,EAAG,GAAG,GAAI,CAACA,EAAG,GAAG,EAAE,EACpB,CAAC,CAACA,EAAG,GAAG,GAAIA,EAAG,GAAG,EAAE,CACtB,CACJ,EAEauE,GAAcrE,GAChBsE,GAAUtE,CAAE,EAMVsE,GAAa7E,GAA2B,CAEjD,IAAMqB,EAAOrB,EAAE,OACf,GAAGqB,GAAQ,EAAG,OAAO,KAErB,GAAGA,IAASrB,EAAE,GAAG,OACb,MAAM,IAAI,MAAM,4BAA4B,EAGhD,GAAGqB,IAAS,EAAG,OAAOrB,EAEtB,GAAGqB,IAAS,EAAG,OAAOsD,GAAW3E,CAAY,EAG7C,IAAM8E,EAAoB,CAAC,EAE3B,QAAQvF,EAAE,EAAGA,EAAE8B,EAAM9B,IAAI,CACrB,IAAM+B,EAAiB,CAAC,EACxB,QAAQP,EAAE,EAAGA,EAAEM,EAAMN,IAAI,CACrB,IAAMyD,EAAQJ,GAAOpE,EAAGT,EAAGwB,CAAC,EACtBgE,EAAO,KAAK,IAAI,GAAIxF,EAAIwB,CAAC,EAC/BO,EAAO,KAAKyD,EAAOP,CAAK,CAC5B,CACAM,EAAU,KAAKxD,CAAM,CACzB,CAGA,OAAOV,EAAWkE,CAAS,CAC/B,EAMaE,GAAoBhF,GAAc,CAC3C,GAAGA,EAAE,OAAS,GAAKA,EAAE,SAAWA,EAAE,GAAG,OACjC,MAAM,IAAI,MAAM,4BAA4B,EAIhD,OADUqE,EAAarE,CAAC,IACX,CACjB,EAOaiF,GAAY,CAAC5E,EAAahB,EAAgB,MAA+B,CAClF,GAAGgB,EAAG,OAAS,GAAKA,EAAG,SAAWA,EAAG,GAAG,OACpC,MAAM,IAAI,MAAM,4BAA4B,EAGhD,IAAMkE,EAAID,GAAcjE,CAAE,EAC1B,GAAGkE,IAAM,EAAG,OAAO,KAEnB,IAAMW,EAAMP,GAAWtE,CAAE,EACzB,OAAG6E,IAAQ,KAAa,KAEjBxE,GAAewE,EAAKX,EAAGlF,CAAa,CAC/C,EAEa8F,GAAY,CAAC5E,EAAalB,EAAgB,MAC5C+F,EAAS7E,EAAIlB,CAAa,EAGxB+F,EAAW,CAACpF,EAAWX,EAAgB,MAA8B,CAC9E,IAAMgC,EAAOrB,EAAE,OAEf,GAAGqB,EAAO,GAAKA,IAASrB,EAAE,GAAG,OACzB,MAAM,IAAI,MAAM,4BAA4B,EAIhD,IAAMuE,EAAIF,EAAarE,CAAC,EAGlBkF,EAAML,GAAU7E,CAAC,EACvB,OAAGkF,IAAQ,KAAa,KAEjB1E,EAAc0E,EAAKX,EAAGlF,CAAa,CAC9C,EC/oBO,IAAMgG,GAAWC,GAAwB,CAC5C,IAAMC,EAAID,EAAE,GAAG,GACTE,EAAIF,EAAE,GAAG,GACTG,EAAIH,EAAE,GAAG,GACTI,EAAIJ,EAAE,GAAG,GAEf,MAAO,UAAWC,MAAQC,MAAQC,MAAQC,UAC9C,EAMaC,GAAYL,GAAwB,CAC7C,IAAMC,EAAID,EAAE,GAAG,GACTE,EAAIF,EAAE,GAAG,GACTG,EAAIH,EAAE,GAAG,GACTI,EAAIJ,EAAE,GAAG,GACTM,EAAKN,EAAE,GAAG,GACVO,EAAKP,EAAE,GAAG,GAEhB,MAAO,UAAWC,MAAQC,MAAQC,MAAQC,MAAQE,MAASC,IAC/D,EAMaC,GAAcR,GAAwB,CAC/C,IAAMC,EAAID,EAAE,GAAG,GACTE,EAAIF,EAAE,GAAG,GACTG,EAAIH,EAAE,GAAG,GACTI,EAAIJ,EAAE,GAAG,GACTM,EAAKN,EAAE,GAAG,GACVO,EAAKP,EAAE,GAAG,GAEhB,MAAO,YAAaC,MAAQC,YAAcC,MAAQC,wBAA0BE,MAASC,UACzF,EAMaE,GAAcT,GAEhB;AAAA,UACAA,EAAE,GAAG,OAASA,EAAE,GAAG,OAASA,EAAE,GAAG,OAASA,EAAE,GAAG;AAAA,UAC/CA,EAAE,GAAG,OAASA,EAAE,GAAG,OAASA,EAAE,GAAG,OAASA,EAAE,GAAG;AAAA,UAC/CA,EAAE,GAAG,OAASA,EAAE,GAAG,OAASA,EAAE,GAAG,OAASA,EAAE,GAAG;AAAA,UAC/CA,EAAE,GAAG,OAASA,EAAE,GAAG,OAASA,EAAE,GAAG,OAASA,EAAE,GAAG;AAAA,OAM7CU,GAAgB,CAACC,EAAmBC,EAAgB,MAEtD,CACH,CAAC,EAAG,CAAC,EACL,CAAC,EAAG,CAAC,EACL,CAACC,EAAiBF,EAAS,GAAIC,CAAa,EAAGC,EAAiBF,EAAS,GAAIC,CAAa,CAAC,CAC/F,EAGSE,GAAgB,CAACH,EAAmBC,EAAgB,MAEtD,CACH,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,EACR,CACIC,EAAiBF,EAAS,GAAIC,CAAa,EAC3CC,EAAiBF,EAAS,GAAIC,CAAa,EAC3CC,EAAiBF,EAAS,GAAIC,CAAa,CAC/C,CACJ,EAMSG,EAAiB,CAACJ,EAAmBC,EAAgB,MAEvD,CACH,CAAC,EAAG,EAAGC,EAAiBF,EAAS,GAAIC,CAAa,CAAC,EACnD,CAAC,EAAG,EAAGC,EAAiBF,EAAS,GAAIC,CAAa,CAAC,EACnD,CAAC,EAAG,EAAG,CAAC,CACZ,EAMSI,GAAiB,CAACL,EAAmBC,EAAgB,MAEvD,CACH,CAAC,EAAG,EAAG,EAAGC,EAAiBF,EAAS,GAAIC,CAAa,CAAC,EACtD,CAAC,EAAG,EAAG,EAAGC,EAAiBF,EAAS,GAAIC,CAAa,CAAC,EACtD,CAAC,EAAG,EAAG,EAAGC,EAAiBF,EAAS,GAAIC,CAAa,CAAC,EACtD,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAQSK,GAAa,CAACC,EAAkBC,EAAc,GAAMP,EAAgB,MAAsB,CACnG,IAAMQ,EAAMP,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EACxDS,EAAMR,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EAE9D,OAAOO,EAAc,CACjB,CAACC,EAAK,CAACC,CAAG,EACV,CAACA,EAAKD,CAAG,CACb,EACA,CACI,CAACA,EAAKC,CAAG,EACT,CAAC,CAACA,EAAKD,CAAG,CACd,CACJ,EAKaE,GAAc,CAACJ,EAAkBC,EAAc,GAAMP,EAAgB,MAAsB,CACpG,IAAMQ,EAAMP,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EACxDS,EAAMR,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EAE9D,OAAOO,EAAc,CACjB,CAACC,EAAK,CAACC,EAAK,CAAC,EACb,CAACA,EAAKD,EAAK,CAAC,EACZ,CAAC,EAAG,EAAG,CAAC,CACZ,EACA,CACI,CAACA,EAAKC,EAAK,CAAC,EACZ,CAAC,CAACA,EAAKD,EAAK,CAAC,EACb,CAAC,EAAG,EAAG,CAAC,CACZ,CACJ,EAMaG,GAAyB,CAClCL,EACAM,EACAL,EAAc,GACdP,EAAgB,MAAsB,CAEtC,IAAMa,EAAcV,EAAeS,EAAiBZ,CAAa,EAC3Dc,EAAWJ,GAAYJ,EAAUC,EAAaP,CAAa,EAC3De,EAAkBZ,EAAea,EAAYJ,EAAiB,EAAE,EAAGZ,CAAa,EAChFiB,EAAQC,EAAKL,EAAaC,CAAQ,EACxC,OAAOI,EAAKD,EAAOF,CAAe,CACtC,EAEaI,GAAuB,CAChCb,EACAM,EACAb,EACAQ,EAAc,GACdP,EAAgB,MAAsB,CAEtC,IAAMoB,EAAQT,GAAuBL,EAAUM,EAAiBL,EAAaP,CAAa,EAC1F,OAAOqB,EAAWD,EAAOrB,CAAQ,CACrC,EAKauB,GAAW,CAAChB,EAAkBiB,EAAiBhB,EAAc,GAAMP,EAAgB,MAAsB,CAClH,IAAMwB,EAAaC,EAAYF,CAAM,EACrC,OAAOF,EAAWhB,GAAWC,EAAUC,EAAaP,CAAa,EAAGwB,CAAU,CAClF,EAKaE,GAAY,CAACpB,EAAkBiB,EAAiBhB,EAAc,GAAMP,EAAgB,MAAsB,CACnH,IAAMwB,EAAaG,EAAYJ,CAAM,EACrC,OAAOF,EAAWX,GAAYJ,EAAUC,EAAaP,CAAa,EAAGwB,CAAU,CACnF,EAKaI,GAAc,CAACtB,EAAkBC,EAAc,GAAMP,EAAgB,MAAsB,CACpG,IAAMQ,EAAMP,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EACxDS,EAAMR,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EAE9D,OAAOO,EAAc,CACjB,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAGC,EAAK,CAACC,CAAG,EACb,CAAC,EAAGA,EAAKD,CAAG,CAChB,EACA,CACI,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAGA,EAAKC,CAAG,EACZ,CAAC,EAAG,CAACA,EAAKD,CAAG,CACjB,CACJ,EAKaqB,GAAe,CAACvB,EAAkBC,EAAc,GAAMP,EAAgB,MAAsB,CACrG,IAAMQ,EAAMP,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EACxDS,EAAMR,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EAE9D,OAAOO,EAAc,CACb,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAGC,EAAK,CAACC,EAAK,CAAC,EAChB,CAAC,EAAGA,EAAKD,EAAK,CAAC,EACf,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EACA,CACI,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAGA,EAAKC,EAAK,CAAC,EACf,CAAC,EAAG,CAACA,EAAKD,EAAK,CAAC,EAChB,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,CACR,EAEasB,GAAY,CAACxB,EAAkBiB,EAAiBhB,EAAc,GAAMP,EAAgB,MAAsB,CACnH,IAAMwB,EAAaG,EAAYJ,CAAM,EACrC,OAAOF,EAAWO,GAAYtB,EAAUC,EAAaP,CAAa,EAAGwB,CAAU,CACnF,EAKaO,GAAc,CAACzB,EAAkBC,EAAc,GAAMP,EAAgB,MAAsB,CACpG,IAAMQ,EAAMP,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EACxDS,EAAMR,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EAE9D,OAAOO,EAAc,CACjB,CAACC,EAAK,EAAGC,CAAG,EACZ,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,CAACA,EAAK,EAAGD,CAAG,CACjB,EACA,CACI,CAACA,EAAK,EAAG,CAACC,CAAG,EACb,CAAC,EAAG,EAAG,CAAC,EACR,CAACA,EAAK,EAAGD,CAAG,CAChB,CACJ,EAKawB,GAAe,CAAC1B,EAAkBC,EAAc,GAAMP,EAAgB,MAAsB,CACrG,IAAMQ,EAAMP,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EACxDS,EAAMR,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EAE9D,OAAOO,EAAc,CACb,CAACC,EAAK,EAAGC,EAAK,CAAC,EACf,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,CAACA,EAAK,EAAGD,EAAK,CAAC,EAChB,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EACA,CACI,CAACA,EAAK,EAAG,CAACC,EAAK,CAAC,EAChB,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAACA,EAAK,EAAGD,EAAK,CAAC,EACf,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,CACR,EAEayB,GAAY,CAAC3B,EAAkBiB,EAAiBhB,EAAc,GAAMP,EAAgB,MAAsB,CACnH,IAAMwB,EAAaG,EAAYJ,CAAM,EACrC,OAAOF,EAAWU,GAAYzB,EAAUC,EAAaP,CAAa,EAAGwB,CAAU,CACnF,EAKaU,GAAc,CAAC5B,EAAkBC,EAAc,GAAMP,EAAgB,MAAsB,CAEpG,IAAMQ,EAAMP,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EACxDS,EAAMR,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EAE9D,OAAOO,EAAc,CACjB,CAACC,EAAK,CAACC,EAAK,CAAC,EACb,CAACA,EAAKD,EAAK,CAAC,EACZ,CAAC,EAAG,EAAG,CAAC,CACZ,EAAI,CACA,CAACA,EAAKC,EAAK,CAAC,EACZ,CAAC,CAACA,EAAKD,EAAK,CAAC,EACb,CAAC,EAAG,EAAG,CAAC,CACZ,CACJ,EAKa2B,GAAe,CAAC7B,EAAkBC,EAAc,GAAMP,EAAgB,MAAsB,CAErG,IAAMQ,EAAMP,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EACxDS,EAAMR,EAAiB,KAAK,IAAIK,CAAQ,EAAGN,CAAa,EAE9D,OAAOO,EAAc,CACjB,CAACC,EAAK,CAACC,EAAK,EAAG,CAAC,EAChB,CAACA,EAAKD,EAAK,EAAG,CAAC,EACf,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAAI,CACA,CAACA,EAAKC,EAAK,EAAG,CAAC,EACf,CAAC,CAACA,EAAKD,EAAK,EAAG,CAAC,EAChB,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,CACJ,EAEa4B,GAAY,CAAC9B,EAAkBiB,EAAiBhB,EAAc,GAAMP,EAAgB,MAAsB,CACnH,IAAMwB,EAAaG,EAAYJ,CAAM,EACrC,OAAOF,EAAWa,GAAY5B,EAAUC,EAAaP,CAAa,EAAGwB,CAAU,CACnF,EAQaa,GAAwB,CACjCC,EACA1B,EACAZ,EAAgB,MAAsB,CAEtC,IAAMa,EAAcV,EAAeS,EAAiBZ,CAAa,EAC3DuC,EAAQC,GAASF,CAAW,EAC5BvB,EAAkBZ,EAAea,EAAYJ,EAAiB,EAAE,EAAGZ,CAAa,EAChFiB,EAAQC,EAAKL,EAAa0B,CAAK,EACrC,OAAOrB,EAAKD,EAAOF,CAAe,CACtC,EAEa0B,GAAkB,CAC3BH,EACA1B,EACA8B,EACA1C,EAAgB,MAAsB,CAEtC,IAAMoB,EAAQiB,GAAsBC,EAAa1B,EAAiBZ,CAAa,EAC/E,OAAOqB,EAAWD,EAAOsB,CAAK,CAClC,EAEaC,GAAWL,GACb,CACH,CAACA,EAAY,GAAI,CAAC,EAClB,CAAC,EAAGA,EAAY,EAAE,CACtB,EAGSM,GAAU,CAACN,EAAsBf,IACnCF,EAAWsB,GAAQL,CAAW,EAAGf,CAAM,EAMrCiB,GAAYF,GACd,CACH,CAACA,EAAY,GAAI,EAAG,CAAC,EACrB,CAAC,EAAGA,EAAY,GAAI,CAAC,EACrB,CAAC,EAAG,EAAG,CAAC,CACZ,EAGSO,GAAWP,GACb,CACH,CAACA,EAAY,GAAI,EAAG,CAAC,EACrB,CAAC,EAAGA,EAAY,GAAI,CAAC,EACrB,CAAC,EAAG,EAAGA,EAAY,EAAE,CACzB,EAGSQ,GAAYR,GACd,CACH,CAACA,EAAY,GAAI,EAAG,EAAG,CAAC,EACxB,CAAC,EAAGA,EAAY,GAAI,EAAG,CAAC,EACxB,CAAC,EAAG,EAAGA,EAAY,GAAI,CAAC,EACxB,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAGSS,GAAU,CAACT,EAAsBf,IACnCF,EAAWwB,GAAQP,CAAW,EAAGf,CAAM,EAMrCyB,GAAYT,GACd,CACH,CAACA,EAAO,CAAC,EACT,CAAC,EAAG,CAAC,CACT,EAMSU,GAAaV,GACf,CACH,CAACA,EAAO,EAAG,CAAC,EACZ,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,CACZ,EAMSW,GAAYX,GACd,CACH,CAACA,EAAO,EAAG,CAAC,EACZ,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,CACZ,EAMSY,GAAaZ,GACf,CACH,CAACA,EAAO,EAAG,EAAG,CAAC,EACf,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAMSa,GAAYb,GACd,CACH,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAGA,EAAO,CAAC,EACZ,CAAC,EAAG,EAAG,CAAC,CACZ,EAMSc,GAAad,GACf,CACH,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAGA,EAAO,EAAG,CAAC,EACf,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAMSe,GAAYf,GACd,CACH,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAGA,CAAK,CAChB,EAMSgB,GAAahB,GACf,CACH,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAGA,EAAO,CAAC,EACf,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAMSiB,GAAYjB,GACd,CACH,CAAC,EAAG,CAAC,EACL,CAAC,EAAGA,CAAK,CACb,EAMSkB,GAAalB,GACf,CACH,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAGA,EAAO,CAAC,EACZ,CAAC,EAAG,EAAG,CAAC,CACZ,EAQSmB,GAAqB,IAEvB,CACH,CAAC,GAAI,CAAC,EACN,CAAC,EAAG,EAAE,CACV,EAMSC,GAAsB,IAExB,CACH,CAAC,GAAI,EAAG,CAAC,EACT,CAAC,EAAG,GAAI,CAAC,EACT,CAAC,EAAG,EAAG,CAAC,CACZ,EAMSC,GAAqB,IAEvB,CACH,CAAC,GAAI,EAAG,CAAC,EACT,CAAC,EAAG,GAAI,CAAC,EACT,CAAC,EAAG,EAAG,EAAE,CACb,EAMSC,GAAsB,IAExB,CACH,CAAC,GAAI,EAAG,EAAG,CAAC,EACZ,CAAC,EAAG,GAAI,EAAG,CAAC,EACZ,CAAC,EAAG,EAAG,GAAI,CAAC,EACZ,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAMSC,GAAkB,IAEpB,CACH,CAAC,EAAG,EAAE,EACN,CAAC,GAAI,CAAC,CACV,EAMSC,GAAgB,IAElB,CACH,CAAC,EAAG,CAAC,EACL,CAAC,EAAG,EAAE,CACV,EAMSC,GAAiB,IAEnB,CACH,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,GAAI,CAAC,EACT,CAAC,EAAG,EAAG,CAAC,CACZ,EAMSC,GAAgB,IAElB,CACH,CAAC,GAAI,CAAC,EACN,CAAC,EAAG,CAAC,CACT,EAGSC,GAAiB,IAEnB,CACH,CAAC,GAAI,EAAG,CAAC,EACT,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,CACZ,EAMSC,GAAiB,IAEnB,CACH,CAAC,GAAI,EAAG,CAAC,EACT,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,CACZ,EAMSC,GAAkB,IAEpB,CACH,CAAC,GAAI,EAAG,EAAG,CAAC,EACZ,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAMSC,GAAiB,IAEnB,CACH,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,GAAI,CAAC,EACT,CAAC,EAAG,EAAG,CAAC,CACZ,EAMSC,GAAkB,IAEpB,CACH,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,GAAI,EAAG,CAAC,EACZ,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EAMSC,GAAiB,IAEnB,CACH,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,CAAC,EACR,CAAC,EAAG,EAAG,EAAE,CACb,EAMSC,GAAkB,IAEpB,CACH,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,GAAI,CAAC,EACZ,CAAC,EAAG,EAAG,EAAG,CAAC,CACf,EASSC,GAAeC,GAEjB,CACH,CAAC,EAAGA,CAAM,EACV,CAAC,EAAG,CAAC,CACT,EAMSC,GAAeD,GAEjB,CACH,CAAC,EAAG,CAAC,EACL,CAACA,EAAQ,CAAC,CACd,EC7sBG,IAAME,EAAY,CAACC,EAAaC,EAAaC,EAAgB,MACzDC,EAAiB,KAAK,OAAO,GAAKF,EAAMD,GAAOA,EAAKE,CAAa,EAM/DE,GAAe,CAACJ,EAAaC,IAC/B,KAAK,MAAM,KAAK,OAAO,GAAKA,EAAMD,EAAM,GAAKA,CAAG,EAG9CK,GAAmB,IAAM,KAAK,OAAO,EAAI,GAGzCC,GAA0BC,GAAiB,CACpD,IAAMC,EAAcJ,GAAa,EAAGG,EAAM,OAAS,CAAC,EACpD,OAAOA,EAAMC,EACjB,ECtBO,IAAMC,GAAiB,CAACC,EAAqCC,IAA0B,CAA9F,IAAAC,EACI,GAA0BF,GAAU,KAAM,OAAOC,EACjD,IAAME,GAAMD,EAAA,OAAOF,CAAK,IAAZ,KAAAE,EAAiBD,EAC7B,OAAO,MAAME,CAAG,EAAIF,EAAgBE,CACxC,ECcO,IAAMC,GAAe,CAACC,EAAWC,EAAwBC,EAAgB,MAAa,CACzF,IAAIC,EAAM,EAEV,QAAUC,KAAQH,EAAW,CACzB,GAAGG,EAAK,SAAW,EAAG,MAAO,KAE7B,IAAMC,EAAQD,EAAK,GACbE,EAAQF,EAAK,GACnBD,GAAOE,EAAQC,EAAQ,KAAK,IAAIN,EAAGM,EAAQ,CAAC,CAChD,CAEA,OAAOC,EAAiBJ,EAAKD,CAAa,CAC9C,EAQaM,GAA2B,CACpC,EACAC,EACAC,EACAC,EACAT,EAAgB,MACL,CAIX,IAAMU,EAAQ,IAAM,EAAI,GAClBC,EAAQ,EAAI,EAAI,EAChBC,EAAQ,EAAI,EAElB,MAAO,CACHP,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQH,EAAmB,GAAKI,EAAQH,EAAgB,GAAIT,CAAa,EACzHK,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQH,EAAmB,GAAKI,EAAQH,EAAgB,GAAIT,CAAa,CAC7H,CACJ,EAEaa,GAA2B,CACpC,EACAN,EACAC,EACAC,EACAT,EAAgB,MACL,CAEX,IAAMU,EAAQ,IAAM,EAAI,GAClBC,EAAQ,EAAI,EAAI,EAChBC,EAAQ,EAAI,EAElB,MAAO,CACHP,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQH,EAAmB,GAAKI,EAAQH,EAAgB,GAAIT,CAAa,EACzHK,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQH,EAAmB,GAAKI,EAAQH,EAAgB,GAAIT,CAAa,EACzHK,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQH,EAAmB,GAAKI,EAAQH,EAAgB,GAAIT,CAAa,CAC7H,CACJ,EAEac,GAAuB,CAChC,EACAP,EACAQ,EACAC,EACAP,EACAT,EAAgB,MACL,CAEX,IAAMU,EAAQ,GAAK,KAAK,IAAI,EAAI,EAAG,CAAC,EAC9BC,EAAQ,GAAK,EAAI,IAAM,EAAI,EAAI,GAC/BC,EAAQ,EAAI,EAAI,EAAI,EAAI,EACxBK,EAAQ,EAAI,EAAI,EAEtB,MAAO,CACHZ,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQI,EAAoB,GAAKH,EAAQI,EAAoB,GAAKC,EAAQR,EAAgB,GAAIT,CAAa,EAC3JK,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQI,EAAoB,GAAKH,EAAQI,EAAoB,GAAKC,EAAQR,EAAgB,GAAIT,CAAa,CAC/J,CACJ,EAEakB,GAAuB,CAChC,EACAX,EACAQ,EACAC,EACAP,EACAT,EAAgB,MACL,CAEX,IAAMU,EAAQ,GAAK,KAAK,IAAI,EAAI,EAAG,CAAC,EAC9BC,EAAQ,GAAK,EAAI,IAAM,EAAI,EAAI,GAC/BC,EAAQ,EAAI,EAAI,EAAI,EAAI,EACxBK,EAAQ,EAAI,EAAI,EAEtB,MAAO,CACHZ,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQI,EAAoB,GAAKH,EAAQI,EAAoB,GAAKC,EAAQR,EAAgB,GAAIT,CAAa,EAC3JK,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQI,EAAoB,GAAKH,EAAQI,EAAoB,GAAKC,EAAQR,EAAgB,GAAIT,CAAa,EAC3JK,EAAiBK,EAAQH,EAAkB,GAAKI,EAAQI,EAAoB,GAAKH,EAAQI,EAAoB,GAAKC,EAAQR,EAAgB,GAAIT,CAAa,CAC/J,CACJ,EAKamB,GAAQ,CAACrB,EAAWE,EAAgB,MACtCK,EAAiB,KAAK,IAAIP,CAAC,EAAGE,CAAa,EAGzCoB,GAAQ,CAACtB,EAAWE,EAAgB,MACtCK,EAAiB,CAAC,KAAK,IAAIP,CAAC,EAAGE,CAAa,EAG1CqB,GAAQ,CAACvB,EAAWE,EAAgB,MACtCK,EAAiB,EAAKiB,EAAA,KAAK,IAAIxB,CAAC,EAAK,GAAIE,CAAa,EAMpDuB,GAAQ,CAACzB,EAAWE,EAAgB,MACtCK,EAAiB,GAAMiB,EAAA,KAAK,IAAIxB,CAAC,EAAK,GAAIE,CAAa,EAMrDwB,GAAW,CAAC1B,EAAWE,EAAgB,MACzCK,EAAiB,EAAK,KAAK,KAAK,EAAIiB,EAAAxB,EAAK,EAAC,EAAIE,CAAa,EAMzDyB,GAAW,CAAC3B,EAAWE,EAAgB,MACzCK,EAAiB,GAAM,KAAK,KAAK,EAAIiB,EAAAxB,EAAK,EAAC,EAAIE,CAAa,EAG1D0B,GAAW,CAAC5B,EAAWE,EAAgB,MACzCK,EAAiB,GAAK,EAAIiB,EAAAxB,EAAK,IAAIE,CAAa,EAG9C2B,GAAW,CAAC7B,EAAWE,EAAgB,MACzCK,EAAiB,IAAM,EAAIiB,EAAAxB,EAAK,IAAIE,CAAa,ECrJrD,IAAM4B,EAAiB,CAACC,EAAmBC,EAAgB,MAAsB,CACpF,IAAMC,EAAIF,EAAS,GACbG,EAAIH,EAAS,GAGbI,EAFIJ,EAAS,GAEFG,EAEjB,OAAGD,IAAM,GAAKE,IAAS,EAAU,IAC9BF,IAAM,EAAU,IAEZG,EAAiBD,EAAOF,EAAGD,CAAa,CACnD,EASaK,GAAwB,CAACC,EAAoBC,EAAoBP,EAAgB,MAA8B,CACxH,IAAMQ,EAA0B,CAC5B,CAACF,EAAU,GAAIA,EAAU,EAAE,EAC3B,CAACC,EAAU,GAAIA,EAAU,EAAE,CAC/B,EAEME,EAAWC,GAAUF,CAAc,EACzC,GAAGC,IAAa,KAAM,OAAO,KAE7B,IAAME,EAA2B,CAC7BL,EAAU,GACVC,EAAU,EACd,EAEA,OAAOK,EAAWH,EAAUE,EAAiBX,CAAa,CAC9D,EASaa,GAAwB,CACjCP,EACAC,EACAO,EACAd,EAAgB,MAA8B,CAC9C,IAAMQ,EAA0B,CAC5B,CAACF,EAAU,GAAIA,EAAU,GAAIA,EAAU,EAAE,EACzC,CAACC,EAAU,GAAIA,EAAU,GAAIA,EAAU,EAAE,EACzC,CAACO,EAAU,GAAIA,EAAU,GAAIA,EAAU,EAAE,CAC7C,EAEML,EAAWM,GAAUP,CAAc,EACzC,GAAGC,IAAa,KAAM,OAAO,KAE7B,IAAME,EAA2B,CAC7BL,EAAU,GACVC,EAAU,GACVO,EAAU,EACd,EAEA,OAAOF,EAAWH,EAAUE,EAAiBX,CAAa,CAC9D,EAKagB,GAAwB,CAACC,EAAmBjB,EAAgB,MAA6B,CAClG,GAAGiB,EAAU,QAAU,EAAG,OAAO,KAEjC,IAAMT,EAAiBU,GAAeD,CAAS,EAEzCR,EAAWU,EAASX,CAAc,EACxC,GAAGC,IAAa,KAAM,OAAO,KAG7B,IAAME,EAAkBS,GAAeH,CAAS,EAEhD,OAAOL,EAAWH,EAAUE,EAAiBX,CAAa,CAC9D,EAQaqB,GAA6B,CAACC,EAAiBC,IAKvD,CACD,GAAM,CAACC,EAAQC,CAAM,EAAIC,EAAMH,EAAQD,CAAM,EACvC,CAACK,EAAGC,CAAC,EAAIN,EAEf,GAAGE,IAAW,EACV,MAAO,CACH,MAAO,OACP,WAAYG,EACZ,WAAY,OACZ,QAAS,OAAQA,GACrB,EAGJ,IAAME,EAAIJ,EAASD,EACbtB,EAAI0B,EAAIC,EAAIF,EACdG,EAAU,GAEd,OAAGD,IAAM,EACLC,EAAU,OAAQ5B,KAGlB4B,EAAU,OAAQD,IAAM,EAAI,GAAKA,KAE9B3B,IAAM,IACL4B,GAAW,IAAK5B,EAAI,EAAI,IAAM,OAAS,KAAK,IAAIA,CAAC,MAIlD,CACH,MAAO2B,EACP,WAAY,OACZ,WAAY3B,EACZ,QAAA4B,CACJ,CACJ,EClIO,IAAMC,EAAoB,CAACC,EAAkBC,EAAgB,MAAsB,CACtF,IAAMC,EAAIF,EAAS,GACbG,EAAIH,EAAS,GACbI,EAAIJ,EAAS,GACbK,EAAIL,EAAS,GAEnB,GAAGE,IAAM,EAAE,CAEP,IAAMI,EAAMC,EAAe,CAACJ,EAAGC,EAAGC,CAAC,EAAGJ,CAAa,EACnD,OAAGO,EAASF,CAAG,EAAU,CAACA,CAAG,EACtB,CAAC,CACZ,CAEA,IAAMG,EAAOL,EAAIC,EAEXK,EAAeP,EAAIA,EAAK,EAAID,EAAIO,EAEtC,GAAGC,EAAe,EACd,MAAO,CAAC,EAGZ,GAAGA,IAAiB,EAChB,MAAO,CAAEC,EAAiB,CAACR,GAAK,EAAID,GAAID,CAAa,CAAE,EAI3D,IAAMW,EAAK,EAAIV,EACTW,EAAK,KAAK,KAAKH,CAAY,EAEjC,MAAO,CACHC,GAAkB,CAACR,EAAIU,GAAMD,EAAIX,CAAa,EAC9CU,GAAkB,CAACR,EAAIU,GAAMD,EAAIX,CAAa,CAClD,CACJ,EClBO,IAAMa,GAAyB,CAClC,EACAC,EACAC,EACAC,EACAC,EAAgB,MACL,CAEX,IAAMC,EAAQ,KAAK,IAAI,EAAI,EAAG,CAAC,EACzBC,GAAS,EAAI,GAAK,EAAI,EACtBC,EAAQ,EAAI,EAElB,MAAO,CACHC,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQJ,EAAmB,GAAKK,EAAQJ,EAAgB,GAAIC,CAAa,EACzHI,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQJ,EAAmB,GAAKK,EAAQJ,EAAgB,GAAIC,CAAa,CAC7H,CACJ,EAEaK,GAAyB,CAClC,EACAR,EACAC,EACAC,EACAC,EAAgB,MACL,CAEX,IAAMC,EAAQ,KAAK,IAAI,EAAI,EAAG,CAAC,EACzBC,GAAS,EAAI,GAAK,EAAI,EACtBC,EAAQ,EAAI,EAElB,MAAO,CACHC,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQJ,EAAmB,GAAKK,EAAQJ,EAAgB,GAAIC,CAAa,EACzHI,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQJ,EAAmB,GAAKK,EAAQJ,EAAgB,GAAIC,CAAa,EACzHI,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQJ,EAAmB,GAAKK,EAAQJ,EAAgB,GAAIC,CAAa,CAC7H,CACJ,EAKaM,GAAqB,CAC9B,EACAT,EACAU,EACAC,EACAT,EACAC,EAAgB,MACL,CAEX,IAAMC,EAAQ,KAAK,IAAI,EAAI,EAAG,CAAC,EACzBC,EAAQ,KAAK,IAAI,EAAI,EAAG,CAAC,EAAI,EAAI,EACjCC,GAAS,EAAI,GAAK,EAAI,EAAI,EAC1BM,EAAQ,EAAI,EAAI,EAEtB,MAAO,CACHL,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQK,EAAoB,GAAKJ,EAAQK,EAAoB,GAAKC,EAAQV,EAAgB,GAAIC,CAAa,EAC3JI,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQK,EAAoB,GAAKJ,EAAQK,EAAoB,GAAKC,EAAQV,EAAgB,GAAIC,CAAa,CAC/J,CACJ,EAEaU,GAAqB,CAC9B,EACAb,EACAU,EACAC,EACAT,EACAC,EAAgB,MACL,CAEX,IAAMC,EAAQ,KAAK,IAAI,EAAI,EAAG,CAAC,EACzBC,EAAQ,KAAK,IAAI,EAAI,EAAG,CAAC,EAAI,EAAI,EACjCC,GAAS,EAAI,GAAK,EAAI,EAAI,EAC1BM,EAAQ,EAAI,EAAI,EAEtB,MAAO,CACHL,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQK,EAAoB,GAAKJ,EAAQK,EAAoB,GAAKC,EAAQV,EAAgB,GAAIC,CAAa,EAC3JI,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQK,EAAoB,GAAKJ,EAAQK,EAAoB,GAAKC,EAAQV,EAAgB,GAAIC,CAAa,EAC3JI,EAAiBH,EAAQJ,EAAkB,GAAKK,EAAQK,EAAoB,GAAKJ,EAAQK,EAAoB,GAAKC,EAAQV,EAAgB,GAAIC,CAAa,CAC/J,CACJ,EAQaW,GAAgC,CACzC,EACAd,EACAC,EACAC,EACAC,EAAgB,MACL,CACX,IAAMY,EAAWC,GAAyB,EAAGhB,EAAmBC,EAAoBC,CAAe,EACnG,OAAOe,EAAYF,EAAUZ,CAAa,CAC9C,EAEae,GAAgC,CACzC,EACAlB,EACAC,EACAC,EACAC,EAAgB,MACL,CACX,IAAMY,EAAWI,GAAyB,EAAGnB,EAAmBC,EAAoBC,CAAe,EACnG,OAAOkB,EAAYL,EAAUZ,CAAa,CAC9C,EAEakB,GAA4B,CACrC,EACArB,EACAU,EACAC,EACAT,EACAC,EAAgB,MACL,CACX,IAAMY,EAAWO,GAAqB,EAAGtB,EAAmBU,EAAqBC,EAAqBT,CAAe,EACrH,OAAOe,EAAYF,EAAUZ,CAAa,CAC9C,EAEaoB,GAA4B,CACrC,EACAvB,EACAU,EACAC,EACAT,EACAC,EAAgB,MACL,CACX,IAAMY,EAAWS,GAAqB,EAAGxB,EAAmBU,EAAqBC,EAAqBT,CAAe,EACrH,OAAOkB,EAAYL,EAAUZ,CAAa,CAC9C,EAQasB,GAA+B,CACxC,EACAzB,EACAC,EACAC,EACAC,EAAgB,MACL,CAEX,IAAMuB,EAAUZ,GAA8B,EAAGd,EAAmBC,EAAoBC,EAAiBC,CAAa,EACtH,MAAO,CAAC,CAACuB,EAAQ,GAAIA,EAAQ,EAAE,CACnC,EAEaC,GAA2B,CACpC,EACA3B,EACAU,EACAC,EACAT,EACAC,EAAgB,MACL,CAEX,IAAMuB,EAAUL,GAA0B,EAAGrB,EAAmBU,EAAqBC,EAAqBT,EAAiBC,CAAa,EACxI,MAAO,CAAC,CAACuB,EAAQ,GAAIA,EAAQ,EAAE,CACnC,EAQaE,GAAgC,CACzC5B,EACAC,EACAC,EACAC,EAAgB,MACN,CAQV,IAAM0B,EAAK,EAAK7B,EAAkB,GAAK,EAAIC,EAAmB,GAAK,EAAIC,EAAgB,GACjF4B,EAAK,GAAK9B,EAAkB,GAAK,EAAIC,EAAmB,GAExD8B,EAAOC,EADc,CAACH,EAAIC,EAAI,CAAC,EACE3B,CAAa,EAE9C8B,EAAK,EAAKjC,EAAkB,GAAK,EAAIC,EAAmB,GAAK,EAAIC,EAAgB,GACjFgC,EAAK,GAAKlC,EAAkB,GAAK,EAAIC,EAAmB,GAExDkC,EAAOH,EADc,CAACC,EAAIC,EAAI,CAAC,EACE/B,CAAa,EAE9CiC,EAAc,CAAC,EAErB,OAAGC,EAASN,CAAI,GACZK,EAAI,KAAKL,CAAI,EAGdM,EAASF,CAAI,GACZC,EAAI,KAAKD,CAAI,EAGVC,CACX,EAMaE,GAA4B,CACrCtC,EACAU,EACAC,EACAT,EACAC,EAAgB,MACA,CAEhB,IAAM0B,EAAK,GAAM7B,EAAkB,GAAK,EAAIU,EAAoB,GAAK,EAAIC,EAAoB,GAAK,EAAIT,EAAgB,GAChH4B,EAAK,EAAK9B,EAAkB,GAAK,GAAKU,EAAoB,GAAK,EAAIC,EAAoB,GACvF4B,EAAK,GAAMvC,EAAkB,GAAK,EAAIU,EAAoB,GAC1D8B,EAAoB,CAACX,EAAIC,EAAIS,EAAI,CAAC,EAElCN,EAAK,GAAMjC,EAAkB,GAAK,EAAIU,EAAoB,GAAK,EAAIC,EAAoB,GAAK,EAAIT,EAAgB,GAChHgC,EAAK,EAAKlC,EAAkB,GAAK,GAAKU,EAAoB,GAAK,EAAIC,EAAoB,GACvF8B,EAAK,GAAMzC,EAAkB,GAAK,EAAIU,EAAoB,GAC1DgC,EAAoB,CAACT,EAAIC,EAAIO,EAAI,CAAC,EAGlCV,EAAOY,EAAkBH,EAAWrC,CAAa,EAAE,OAAOyC,GAAOA,GAAO,GAAKA,GAAO,CAAC,EACrFT,EAAOQ,EAAkBD,EAAWvC,CAAa,EAAE,OAAOyC,GAAOA,GAAO,GAAKA,GAAO,CAAC,EAG3F,MADY,CAAC,GAAGb,EAAM,GAAGI,CAAI,EACtB,SAAW,EACP,CAAC,GAAGJ,EAAM,GAAGI,CAAI,EAGrB,IACX,EAIaU,GAAwB,CACjC7C,EACAC,EACAC,EACAC,EAAgB,MACP,CAET,IAAM2C,EAAUlB,GAA8B5B,EAAmBC,EAAoBC,CAAe,EAEhG6C,EAAO,IACPC,EAAO,IACPC,EAAO,KACPC,EAAO,KAEX,QAAUC,KAAWL,EAAQ,CACzB,IAAMM,EAAQrD,GAAuBoD,EAASnD,EAAmBC,EAAoBC,CAAe,EAE9FmD,EAAID,EAAM,GACVE,EAAIF,EAAM,GAEhBL,EAAO,KAAK,IAAIA,EAAMM,CAAC,EACvBJ,EAAO,KAAK,IAAIA,EAAMI,CAAC,EAEvBL,EAAO,KAAK,IAAIA,EAAMM,CAAC,EACvBJ,EAAO,KAAK,IAAIA,EAAMI,CAAC,CAC3B,CAEA,OAAAP,EAAOxC,EAAiB,KAAK,IAAIwC,EAAM/C,EAAkB,GAAIE,EAAgB,EAAE,EAAGC,CAAa,EAC/F8C,EAAO1C,EAAiB,KAAK,IAAI0C,EAAMjD,EAAkB,GAAIE,EAAgB,EAAE,EAAGC,CAAa,EAC/F6C,EAAOzC,EAAiB,KAAK,IAAIyC,EAAMhD,EAAkB,GAAIE,EAAgB,EAAE,EAAGC,CAAa,EAC/F+C,EAAO3C,EAAiB,KAAK,IAAI2C,EAAMlD,EAAkB,GAAIE,EAAgB,EAAE,EAAGC,CAAa,EAExF,CACH,EAAG4C,EACH,EAAGC,EACH,EAAG,KAAK,IAAIC,EAAOF,CAAI,EACvB,EAAG,KAAK,IAAIG,EAAOF,CAAI,EACvB,GAAIC,EACJ,GAAIC,CACR,CACJ,EAEaK,GAAoB,CAC7BvD,EACAU,EACAC,EACAT,EACAC,EAAgB,MACP,CAET,IAAM2C,EAAUR,GAA0BtC,EAAmBU,EAAqBC,EAAqBT,CAAe,GAAK,CAAC,EAExH6C,EAAO,IACPC,EAAO,IACPC,EAAO,KACPC,EAAO,KAEX,QAAUC,KAAWL,EAAQ,CACzB,IAAMM,EAAQ3C,GAAmB0C,EAASnD,EAAmBU,EAAqBC,EAAqBT,CAAe,EAEhHmD,EAAID,EAAM,GACVE,EAAIF,EAAM,GAEhBL,EAAO,KAAK,IAAIA,EAAMM,GAAA,KAAAA,EAAK,GAAQ,EACnCJ,EAAO,KAAK,IAAIA,EAAMI,GAAA,KAAAA,EAAK,IAAS,EAEpCL,EAAO,KAAK,IAAIA,EAAMM,GAAA,KAAAA,EAAK,GAAQ,EACnCJ,EAAO,KAAK,IAAIA,EAAMI,GAAA,KAAAA,EAAK,IAAS,CACxC,CAEA,OAAAP,EAAOxC,EAAiB,KAAK,IAAIwC,EAAM/C,EAAkB,GAAIE,EAAgB,EAAE,EAAGC,CAAa,EAC/F8C,EAAO1C,EAAiB,KAAK,IAAI0C,EAAMjD,EAAkB,GAAIE,EAAgB,EAAE,EAAGC,CAAa,EAC/F6C,EAAOzC,EAAiB,KAAK,IAAIyC,EAAMhD,EAAkB,GAAIE,EAAgB,EAAE,EAAGC,CAAa,EAC/F+C,EAAO3C,EAAiB,KAAK,IAAI2C,EAAMlD,EAAkB,GAAIE,EAAgB,EAAE,EAAGC,CAAa,EAExF,CACH,EAAG4C,EACH,EAAGC,EACH,EAAG,KAAK,IAAIC,EAAOF,CAAI,EACvB,EAAG,KAAK,IAAIG,EAAOF,CAAI,EACvB,GAAIC,EACJ,GAAIC,CACR,CACJ,EC7UO,IAAMM,GAAiB,CAACC,EAAiBC,EAAeC,KAC3DD,EAAQA,EAAQ,KAAK,GAAK,EAEnB,CACHD,EAAO,GAAK,KAAK,IAAIC,CAAK,EAAIC,EAC9BF,EAAO,GAAK,KAAK,IAAIC,CAAK,EAAIC,CAClC,GAWSC,GAA2B,CACpCC,EACAJ,EACAE,IACU,CAEV,IAAMG,EAASC,EAAMF,EAAOJ,CAAM,EAE9BC,EAAQM,EAAWF,CAAM,EAG7B,OAAAJ,EAAQO,EAAaP,EAAO,EAAG,KAAK,GAAG,EAAG,EAAG,KAAK,EAAE,EAE7CF,GAAeC,EAAQC,EAAOC,CAAM,CAC/C,EAaaO,GAAkB,CAACT,EAAiBC,EAAeS,EAAiBC,KAC7EV,EAAQA,EAAQ,KAAK,GAAK,EAEnB,CACHD,EAAO,GAAK,KAAK,IAAIC,CAAK,EAAIS,EAC9BV,EAAO,GAAK,KAAK,IAAIC,CAAK,EAAIU,CAClC,GAWSC,GAA4B,CACrCR,EACAJ,EACAa,IACU,CAEV,IAAMR,EAASC,EAAMF,EAAOJ,CAAM,EAE9BC,EAAQM,EAAWF,CAAM,EAG7B,OAAAJ,EAAQO,EAAaP,EAAO,EAAG,KAAK,GAAG,EAAG,EAAG,KAAK,EAAE,EAE7CQ,GAAgBT,EAAQC,EAAOY,EAAM,GAAIA,EAAM,EAAE,CAC5D,EAWaC,GAAmB,CAACC,EAAWC,EAAmBC,EAAmBC,IAA4B,CAQ1G,IAAMC,EAAIH,EAAY,KAAK,IAAI,EAAI,KAAK,GAAKC,EAAYF,EAAIG,CAAK,EAElE,MAAO,CAACH,EAAGI,CAAC,CAChB,EAoBaC,GAAiB,CAC1BC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IAEO,CACHN,EAAQ,KAAK,IAAIG,EAAID,EAAIG,CAAC,EAC1BJ,EAAS,KAAK,IAAIG,EAAIF,EAAII,CAAC,CAC/B,EC1IG,IAAMC,GAAoB,IAAiB,CAC9C,IAAMC,EAAWC,GAAkB,EACnC,OAAOC,GAASF,CAAQ,CAC5B,EAEaG,GAAoB,IAAe,CAC5C,IAAMH,EAAWC,GAAkB,EACnC,OAAOG,GAASJ,CAAQ,CAC5B,EAEaC,GAAoB,IAAiB,CAC9C,IAAMI,EAAIC,EAAU,EAAG,GAAG,EACpBC,EAAID,EAAU,EAAG,GAAG,EACpBE,EAAIF,EAAU,EAAG,GAAG,EAC1B,MAAO,CAACD,EAAGE,EAAGC,CAAC,CACnB,EAKaC,GAA4BJ,GAAyB,CAC9D,IAAME,EAAID,EAAU,EAAG,GAAG,EACpBE,EAAIF,EAAU,EAAG,GAAG,EAC1B,MAAO,CAACD,EAAGE,EAAGC,CAAC,CACnB,EAKaE,GAAmCH,GAAyB,CACrE,IAAMF,EAAIC,EAAU,EAAG,GAAG,EACpBE,EAAIF,EAAU,EAAG,GAAG,EAC1B,MAAO,CAACD,EAAGE,EAAGC,CAAC,CACnB,EAKaG,GAAkCH,GAAyB,CACpE,IAAMH,EAAIC,EAAU,EAAG,GAAG,EACpBC,EAAID,EAAU,EAAG,GAAG,EAC1B,MAAO,CAACD,EAAGE,EAAGC,CAAC,CACnB,EAEaI,GAA6B,IAE/B,CAAC,EAAG,EADDN,EAAU,EAAG,GAAG,CACX,EAGNO,GAAgC,CACzCC,EAAW,EAAGC,EAAS,IACvBC,EAAkB,EAAGC,EAAgB,IACrCC,EAAa,EAAGC,EAAW,MACf,CACZ,IAAMd,EAAIC,EAAUQ,EAAUC,CAAM,EAC9BR,EAAID,EAAUU,EAAiBC,CAAa,EAC5CT,EAAIF,EAAUY,EAAYC,CAAQ,EACxC,MAAO,CAACd,EAAGE,EAAGC,CAAC,CACnB,EASMY,GAAuBf,IAGzBA,GAAK,GAGFA,EAAI,IACHA,GAAK,KAGFA,GAcLgB,GAAS,CAACC,EAAYC,EAAYC,EAAYC,EAA2B,OAAWC,EAA2B,SAAuB,CAOxI,GAJAD,EAAOA,IAAQ,OAAa,KAAK,IAAIH,EAAGC,EAAGC,CAAC,EAAIC,EAChDC,EAAOA,IAAQ,OAAa,KAAK,IAAIJ,EAAGC,EAAGC,CAAC,EAAIE,EAG7CD,IAAQC,EAAK,MAAO,GAEvB,IAAMC,EAAOD,EAAMD,EAEfpB,EAAI,EAGR,OAAGqB,IAAQJ,IACPjB,GAAKkB,EAAIC,GAAKG,GAAQJ,EAAIC,EAAI,EAAI,IAInCE,IAAQH,IACPlB,EAAI,GAAKmB,EAAIF,GAAKK,GAInBD,IAAQF,IACPnB,EAAI,GAAKiB,EAAIC,GAAKI,GAGfP,GAAoBf,CAAC,CAChC,EAWMuB,GAAe,CACjBN,EACAC,EACAC,EACAC,EAA2B,OAC3BC,EAA2B,UAG3BD,EAAOA,IAAQ,OAAa,KAAK,IAAIH,EAAGC,EAAGC,CAAC,EAAIC,EAChDC,EAAOD,IAAQ,OAAa,KAAK,IAAIH,EAAGC,EAAGC,CAAC,EAAIE,GAIrCD,EAAMC,GAAO,EAGb,KAaTG,GAAgB,CAClBP,EACAC,EACAC,EACAC,EAA2B,OAC3BC,EAA2B,OAC3BlB,EAAyB,UAGzBiB,EAAOA,IAAQ,OAAa,KAAK,IAAIH,EAAGC,EAAGC,CAAC,EAAIC,EAChDC,EAAOD,IAAQ,OAAa,KAAK,IAAIH,EAAGC,EAAGC,CAAC,EAAIE,EAG7CD,IAAQC,EAAY,GAGvBlB,EAAKA,IAAM,OAAaoB,GAAaN,EAAGC,EAAGC,CAAC,EAAIhB,GAGrCA,GAAK,IAEVkB,EAAMD,IAAQC,EAAMD,IAErBC,EAAMD,IAAQ,EAAMC,EAAMD,IAGpB,MAGFK,GAAW,CAACC,EAAeC,EAAgB,MAAuB,CAG3E,IAAMV,EAAIS,EAAI,GAAK,IACbR,EAAIQ,EAAI,GAAK,IACbP,EAAIO,EAAI,GAAK,IAGbN,EAAM,KAAK,IAAIH,EAAGC,EAAGC,CAAC,EACtBE,EAAM,KAAK,IAAIJ,EAAGC,EAAGC,CAAC,EAGtBhB,EAAIoB,GAAaN,EAAGC,EAAGC,EAAGC,EAAKC,CAAG,EAGlCnB,EAAIsB,GAAcP,EAAGC,EAAGC,EAAGC,EAAKC,EAAKlB,CAAC,EAGtCH,EAAIgB,GAAOC,EAAGC,EAAGC,EAAGC,EAAKC,CAAG,EAElC,OAAGrB,EAAI,KAAOE,EAAI,KAAOC,EAAI,IAClB,CAAC,EAAG,EAAG,GAAG,EAGlBH,EAAI,GAAKE,EAAI,GAAKC,EAAI,EACd,CAAC,EAAG,EAAG,CAAC,EAGZ,CACHyB,EAAiB5B,EAAG2B,CAAa,EACjCC,EAAiB1B,EAAGyB,CAAa,EACjCC,EAAiBzB,EAAGwB,CAAa,CACrC,CACJ,EAKME,EAAiB,CAACC,EAAkBC,EAAkBC,KAIrDA,EAAc,IAAGA,GAAe,GAGhCA,EAAc,IAAGA,GAAe,GAEhCA,EAAc,EAAI,EAAUD,GAAWD,EAAUC,GAAW,EAAIC,EAEhEA,EAAc,EAAI,EAAUF,EAE5BE,EAAc,EAAI,EACVD,GAAWD,EAAUC,IAAY,KAAQC,GAAe,EAGxDD,GAIFlC,GAAW,CAACoC,EAAeN,EAAgB,MAAuB,CAG3E,IAAM3B,EAAIiC,EAAI,GAAK,IACb/B,EAAI+B,EAAI,GAAK,IACb9B,EAAI8B,EAAI,GAAK,IAGnB,GAAG/B,IAAM,EAAE,CAEP,IAAMgC,EAAO/B,EAAI,IACjB,MAAO,CAAC+B,EAAMA,EAAMA,CAAI,CAC5B,CAGA,IAAMJ,EAAW3B,EAAI,GAChBA,GAAK,EAAMD,GACXC,EAAID,EAAIC,EAAID,EAEX6B,EAAU,EAAI5B,EAAI2B,EAElBK,EAAUnC,EAAI,KACdoC,EAAUpC,EACVqC,EAAUrC,EAAI,KAEhBiB,EAAIY,EAAeC,EAASC,EAASI,CAAO,EAC5CjB,EAAIW,EAAeC,EAASC,EAASK,CAAO,EAC5CjB,EAAIU,EAAeC,EAASC,EAASM,CAAO,EAOhD,OAJApB,GAAK,IACLC,GAAK,IACLC,GAAK,IAEFF,EAAI,KAAOC,EAAI,KAAOC,EAAI,IAClB,CAAC,IAAK,IAAK,GAAG,EAGtBF,EAAI,GAAKC,EAAI,GAAKC,EAAI,EACd,CAAC,EAAG,EAAG,CAAC,EAGZ,CACHS,EAAiBX,EAAGU,CAAa,EACjCC,EAAiBV,EAAGS,CAAa,EACjCC,EAAiBT,EAAGQ,CAAa,CACrC,CACJ,EAMa5B,GAAYkC,GAAkB,CAEvC,GAAGA,EAAI,GAAK,KAAOA,EAAI,GAAK,KAAOA,EAAI,GAAK,IACxC,MAAO,UAGX,GAAGA,EAAI,GAAK,GAAKA,EAAI,GAAK,GAAKA,EAAI,GAAK,EACpC,MAAO,UAGX,IAAMjC,EAAIiC,EAAI,GAAK,IACb/B,EAAI+B,EAAI,GAAK,IACb9B,EAAI8B,EAAI,GAAK,IAEfhB,EAAGC,EAAGC,EACV,GAAIjB,IAAM,EACNe,EAAIC,EAAIC,EAAIhB,MACT,CACH,IAAMmC,EAAU,CAAC,EAAWC,EAAWC,KAC/BA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,mBAAc,GAAKD,EAAI,GAAK,EAAIC,EACpCA,EAAI,GAAcD,EAClBC,EAAI,kBAAc,GAAKD,EAAI,IAAM,kBAAQC,GAAK,EAC3C,GAELD,EAAIpC,EAAI,GAAMA,GAAK,EAAID,GAAKC,EAAID,EAAIC,EAAID,EACxCuC,EAAI,EAAItC,EAAIoC,EAClBtB,EAAIqB,EAAQG,EAAGF,EAAGvC,EAAI,EAAI,CAAC,EAC3BkB,EAAIoB,EAAQG,EAAGF,EAAGvC,CAAC,EACnBmB,EAAImB,EAAQG,EAAGF,EAAGvC,EAAI,EAAI,CAAC,CAC/B,CACA,IAAM0C,EAAS,GAAc,CACzB,IAAMC,EAAM,KAAK,MAAM,EAAI,GAAG,EAAE,SAAS,EAAE,EAC3C,OAAOA,EAAI,SAAW,EAAI,IAAMA,EAAMA,CAC1C,EAEA,MAAO,IAAID,EAAMzB,CAAC,IAAIyB,EAAMxB,CAAC,IAAIwB,EAAMvB,CAAC,GAC5C,EAMayB,GAAYlB,GAAkB,CACvC,GAAM,CAAC,EAAGR,EAAGC,CAAC,EAAIO,EAClB,MAAO,KAAO,GAAK,GAAK,GAAK,GAAKR,GAAK,EAAIC,GAAG,SAAS,EAAE,EAAE,MAAM,CAAC,CACtE,EAEa0B,GAAYF,GAAkC,CAEvD,IAAMG,EAAiB,mCACjBC,EAAOJ,EAAI,QAAQG,EAAgB,CAACE,EAAI/B,EAAGC,EAAGC,IACzCF,EAAIA,EAAIC,EAAIA,EAAIC,EAAIA,CAC9B,EAEK8B,EAAS,4CAA4C,KAAKF,CAAI,EACpE,GAAG,CAACE,EAAQ,OAAO,KAEnB,IAAMhC,EAAI,SAASgC,EAAO,GAAI,EAAE,EAC1B/B,EAAI,SAAS+B,EAAO,GAAI,EAAE,EAC1B9B,EAAI,SAAS8B,EAAO,GAAI,EAAE,EAEhC,MAAO,CAAChC,EAAGC,EAAGC,CAAC,CACnB,EAEa+B,GAAW,CAACxB,EAAeC,EAAgB,MAAwB,CAE5E,IAAIV,EAAIS,EAAI,GAAK,IACbR,EAAIQ,EAAI,GAAK,IACbP,EAAIO,EAAI,GAAK,IAEjBT,EAAKA,EAAI,OAAW,KAAK,KAAKA,EAAI,MAAS,MAAO,GAAG,EAAIA,EAAI,MAC7DC,EAAKA,EAAI,OAAW,KAAK,KAAKA,EAAI,MAAS,MAAO,GAAG,EAAIA,EAAI,MAC7DC,EAAKA,EAAI,OAAW,KAAK,KAAKA,EAAI,MAAS,MAAO,GAAG,EAAIA,EAAI,MAE7D,IAAIgC,GAAKlC,EAAI,MAASC,EAAI,MAASC,EAAI,OAAU,OAC7CiC,GAAKnC,EAAI,MAASC,EAAI,MAASC,EAAI,OAAU,EAC7CkC,GAAKpC,EAAI,MAASC,EAAI,MAASC,EAAI,OAAU,QAEjD,OAAAgC,EAAKA,EAAI,QAAY,KAAK,IAAIA,EAAG,EAAE,CAAC,EAAK,MAAQA,EAAK,GAAG,IACzDC,EAAKA,EAAI,QAAY,KAAK,IAAIA,EAAG,EAAE,CAAC,EAAK,MAAQA,EAAK,GAAG,IACzDC,EAAKA,EAAI,QAAY,KAAK,IAAIA,EAAG,EAAE,CAAC,EAAK,MAAQA,EAAK,GAAG,IAElD,CACHzB,EAAkB,IAAMwB,EAAK,GAAIzB,CAAa,EAC9CC,EAAiB,KAAOuB,EAAIC,GAAIzB,CAAa,EAC7CC,EAAiB,KAAOwB,EAAIC,GAAI1B,CAAa,CACjD,CACJ,EAEa2B,GAAW,CAACC,EAAe5B,EAAgB,MAAwB,CAC5E,IAAIyB,GAAKG,EAAI,GAAK,IAAM,IACpBJ,EAAII,EAAI,GAAK,IAAMH,EACnBC,EAAID,EAAIG,EAAI,GAAK,IAErBJ,EAAI,QAAYA,EAAIA,EAAIA,EAAI,QAAYA,EAAIA,EAAIA,GAAKA,EAAI,GAAG,KAAO,OACnEC,EAAI,GAAYA,EAAIA,EAAIA,EAAI,QAAYA,EAAIA,EAAIA,GAAKA,EAAI,GAAG,KAAO,OACnEC,EAAI,SAAYA,EAAIA,EAAIA,EAAI,QAAYA,EAAIA,EAAIA,GAAKA,EAAI,GAAG,KAAO,OAEnE,IAAIpC,EAAIkC,EAAK,OAASC,EAAI,QAAUC,EAAI,OACpCnC,EAAIiC,EAAI,OAAUC,EAAK,OAASC,EAAK,MACrClC,EAAIgC,EAAK,MAASC,EAAI,MAAUC,EAAK,MAEzC,OAAApC,EAAKA,EAAI,SAAc,MAAQ,KAAK,IAAIA,EAAG,EAAE,GAAG,EAAI,KAAS,MAAQA,EACrEC,EAAKA,EAAI,SAAc,MAAQ,KAAK,IAAIA,EAAG,EAAE,GAAG,EAAI,KAAS,MAAQA,EACrEC,EAAKA,EAAI,SAAc,MAAQ,KAAK,IAAIA,EAAG,EAAE,GAAG,EAAI,KAAS,MAAQA,EAE9D,CACHS,EAAiB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGX,CAAC,CAAC,EAAI,IAAKU,CAAa,EACjEC,EAAiB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGV,CAAC,CAAC,EAAI,IAAKS,CAAa,EACjEC,EAAiB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGT,CAAC,CAAC,EAAI,IAAKQ,CAAa,CACrE,CACJ,EAIa6B,GAAgB,CAACC,EAAiBC,EAAQ,MAAmB,CACtE,IAAIC,EAAMF,EAAM,GAChB,OAAAE,GAAOD,GAEHC,EAAM,KAAOA,EAAM,KACnBA,EAAMC,EAAID,EAAK,GAAG,GAGf,CAACA,EAAKF,EAAM,GAAIA,EAAM,EAAE,CACnC,EAEaI,GAAsB,CAACJ,EAAiBC,EAAQ,KAAkB,CAC3E,IAAII,EAAYL,EAAM,GACtB,OAAAK,GAAaJ,GAETI,EAAY,KAAOA,EAAY,KAC/BA,EAAYF,EAAIE,EAAW,GAAG,GAG3B,CAACL,EAAM,GAAIA,EAAM,GAAIK,CAAS,CACzC,EAEaC,GAAuB,CAACN,EAAiBC,EAAQ,KAAkB,CAC5E,IAAIM,EAAaP,EAAM,GACvB,OAAAO,GAAcN,EAEVM,EAAa,MACbA,GAAc,KAGfA,EAAa,IACZA,GAAc,KAGX,CAACP,EAAM,GAAIO,EAAYP,EAAM,EAAE,CAC1C,EAeaQ,GAAiB,CAACC,EAAgBC,EAAgBxC,EAAgB,MAAa,CACxF,IAAMyC,EAAOlB,GAASgB,EAAMvC,CAAa,EACnC0C,EAAOnB,GAASiB,EAAMxC,CAAa,EAGnC2C,EAASF,EAAK,GAAKC,EAAK,GACxBE,EAASH,EAAK,GAAKC,EAAK,GACxBG,EAASJ,EAAK,GAAKC,EAAK,GAGxBI,EAAK,KAAK,KAAKL,EAAK,GAAKA,EAAK,GAAKA,EAAK,GAAKA,EAAK,EAAE,EACpDM,EAAK,KAAK,KAAKL,EAAK,GAAKA,EAAK,GAAKA,EAAK,GAAKA,EAAK,EAAE,EACpDM,EAASF,EAAKC,EAIhBE,EAASL,EAASA,EAASC,EAASA,EAASG,EAASA,EAC1DC,EAASA,EAAS,EAAI,EAAI,KAAK,KAAKA,CAAM,EAE1C,IAAMC,EAAK,EAAM,KAAQJ,EACnBK,EAAK,EAAM,KAAQL,EAInBM,EAAaT,EAAU,EACvBU,EAAaL,EAAUE,EACvBI,EAAaL,EAAUE,EAOvBI,EAAIH,EAAaA,EAAaC,EAAaA,EAAaC,EAAaA,EAI3E,OAAOC,EAAI,EAAI,EAAI,KAAK,KAAKA,CAAC,CAClC,EC9fO,IAAMC,GAAO,IACT,uCAAuC,QAAQ,QAAWC,GAAM,CACnE,IAAM,EAAI,KAAK,OAAO,EAAI,GAAK,EAC/B,OAAQA,GAAK,IAAM,EAAI,EAAI,EAAM,GAAK,SAAS,EAAE,CACrD,CAAC,EAMQC,GAAQ,IACZ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC,EAAK,IAAI,KAAK,EAAG,QAAQ,EAAE,SAAS,EAAE,ECH9E,IAAMC,GAAc,CAACC,EAAcC,IAC/BD,EAAM,GAAKC,EAAM,EAAIA,EAAM,GAC1BD,EAAM,EAAIA,EAAM,GAAKC,EAAM,GAC3BD,EAAM,GAAKC,EAAM,EAAIA,EAAM,GAC3BD,EAAM,EAAIA,EAAM,GAAKC,EAAM,EAU1BC,GAAgB,CAACC,EAAkBC,IAAqB,CACjE,IAAMC,EAAK,KAAK,IAAIF,EAAQ,GAAKC,EAAQ,EAAE,EACrCE,EAAK,KAAK,IAAIH,EAAQ,GAAKC,EAAQ,EAAE,EAE3C,OADiB,KAAK,KAAKC,EAAKA,EAAKC,EAAKA,CAAE,GACzBH,EAAQ,EAAIC,EAAQ,CAC3C,EAIMG,GAAYC,GAA+B,CAC7C,IAAMC,EAAmB,CAAC,EAE1B,QAAQC,EAAG,EAAGA,EAAEF,EAAK,OAAQE,IAAI,CAC7B,IAAMC,EAAYC,EAAIF,EAAI,EAAGF,EAAK,MAAM,EAClCK,EAAgB,CAACL,EAAKE,GAAIF,EAAKG,EAAU,EAC/CF,EAAM,KAAKI,CAAI,CACnB,CAEA,OAAOJ,CACX,EAEaK,GAAwB,CAACC,EAAiBC,IAA6B,CAChF,IAAMP,EAAmB,CAAC,EAG1BA,EAAM,KAAK,GAAGF,GAASQ,CAAK,CAAC,EAC7BN,EAAM,KAAK,GAAGF,GAASS,CAAK,CAAC,EAG7B,QAAWH,KAAQJ,EAAO,CACtB,IAAMQ,EAASC,GAAYL,EAAK,GAAIA,EAAK,EAAE,EACrCM,EAASC,GAAeL,EAAOE,CAAM,EACrCI,EAASD,GAAeJ,EAAOC,CAAM,EAM3C,GAAI,EAHcE,EAAO,KAAOE,EAAO,KAAOA,EAAO,KAAOF,EAAO,KAGnD,MAAO,EAC3B,CAGA,MAAO,EACX,EAMMC,GAAiB,CAACE,EAAmBL,IAAkD,CACzF,IAAIM,EAAM,IACNC,EAAM,KAGV,QAAWC,KAAUH,EAAS,CAC1B,IAAMI,EAAaC,GAAaF,EAAQR,CAAM,EAC9CM,EAAM,KAAK,IAAIA,EAAKG,CAAU,EAC9BF,EAAM,KAAK,IAAIA,EAAKE,CAAU,CAClC,CAEA,MAAO,CAAE,IAAAH,EAAK,IAAAC,CAAI,CACtB,EClEO,IAAMI,GAAWC,GAA8C,CAElE,IAAMC,EAAYD,EAAM,WAAa,OAAYA,EAAM,SAAW,IAE9DE,EACAC,EAGAC,EACAC,EAEAC,EAAY,GACZC,EAIEC,EAAO,IAAM,CACfN,EAAY,OACZE,EAAU,OACVC,EAAoB,OACpBC,EAAY,GAOTH,IAAgB,QACnB,OAAO,qBAAqBA,CAAW,CAC3C,EAEMM,EAAU,IAAM,CAClBD,EAAK,EACLE,EAAM,CACV,EAEMC,EAAQ,IAAM,CAChBL,EAAY,EAChB,EAEMM,EAAS,IAAM,CACjBN,EAAY,EAChB,EAMMO,EAAQC,GAAmC,CAEzCZ,IAAc,SACdA,EAAYY,GAIhBV,EAAUU,EAAYZ,EAElBI,GAAaD,IAAsBS,GAAa,OAAOd,EAAM,UAAa,YAG1EA,EAAM,SAASe,EAAU,CAAC,EAG3BX,GAAWH,GACVI,EAAoBS,EACpBX,EAAc,OAAO,sBAAsBU,CAAI,GAG/CL,EAAK,CAEb,EAEMQ,EAAkB,CAACC,EAAiCC,KAA8B,CACpFT,EAAQ,EAEL,OAAOT,EAAM,gBAAmB,YAC/BA,EAAM,eAAeiB,EAAUC,EAAS,CAEhD,EAEMR,EAAQ,IAAM,CAChBR,EAAY,OACZE,EAAU,OACVC,EAAoB,OACpBC,EAAY,GAETN,EAAM,iBAAmB,OAAO,gBAAkBO,IAAa,QAC9DA,EAAW,IAAI,eAAeS,CAAe,EAC7CT,EAAS,QAAQ,SAAS,KAAM,CAAE,IAAK,YAAa,CAAC,GAGrDJ,EAAc,OAAO,sBAAsBU,CAAI,CAEvD,EAOMM,EAAiB,IACZf,EAGLgB,EAAc,IACTd,EAGLe,EAAe,IACVnB,EAGLoB,GAAa,IAAM,CACrB,GAAG,EAAArB,IAAc,KAAYG,IAAY,QACzC,OAAOA,EAAU,IAAMH,CAC3B,EAEMsB,GAAoB,IACjBhB,EAGHQ,EAAY,KACP,CAGH,MAAAL,EACA,KAAAF,EACA,MAAAG,EACA,OAAAC,EACA,QAAAH,EAGA,YAAAW,EACA,eAAAD,EACA,aAAAE,EACA,WAAAC,GACA,kBAAAC,EACJ,GAGJ,OAAOR,EAAU,CACrB,EC/JO,IAAMS,GAAyB,CAACC,EAAgBC,EAAgB,MAC5DC,EAAiB,EAAI,KAAK,GAAKF,EAAQC,CAAa,EAGlDE,GAA0B,CAACC,EAAiBC,EAAiBJ,EAAgB,MAC/EC,EAAiB,EAAI,KAAK,GAAK,KAAK,MAAMI,EAAAF,EAAW,GAAIE,EAAAD,EAAW,IAAK,CAAC,EAAGJ,CAAa,EAGxFM,GAAqB,CAACC,EAAuBC,EAAqBC,KAExEF,EAAgBC,IACfA,GAAe,KAGZC,GAAkBF,GAAiBE,GAAkBD,GACvDC,EAAiB,KAAQF,GAAkBE,EAAiB,KAAQD,GAMhEE,GAAwB,CAACX,EAAgBC,EAAgB,MAC3DC,EAAiBF,EAAS,EAAI,KAAK,KAAK,CAAC,EAAGC,CAAa,ECrB7D,IAAMW,GAA6BC,GAC/BA,GAAKA,EAAI,GAAK,EAQZC,GAAwB,CAACD,EAAWE,EAAWC,IAChDH,EAAI,GAAM,EAAIE,GAAKF,EAAI,GAAKG,GCLjC,IAAMC,EAAoB,CAACC,EAAgBC,EAAgB,MAAgC,CAC9F,GAAG,CAACD,GAAQA,EAAK,QAAU,EAAG,OAE9B,IAAME,EAAMF,EAAK,OAAO,CAACG,EAAKC,IAAQD,EAAMC,EAAK,CAAC,EAClD,OAAOC,EAAiBH,EAAMF,EAAK,OAAQC,CAAa,CAC5D,EAKaK,GAAiC,CAACC,EAAmCN,EAAgB,MAAa,CAE3G,IAAIO,EAAO,EAEX,OAAU,CAACJ,EAAKK,CAAS,IAAKF,EAC1BC,GAAQJ,EAAMK,EAGlB,OAAOJ,EAAiBG,EAAMP,CAAa,CAC/C,EAMaS,GAAY,CAACV,EAAgBC,EAAgB,MAAgC,CACtF,GAAG,CAACD,GAAQA,EAAK,QAAU,EAAG,OAE9B,IAAMW,EAAO,CAAC,GAAGX,CAAI,EAAE,KAAK,CAACY,EAAMC,IAASD,EAAOC,CAAI,EACjDC,EAAM,KAAK,MAAMH,EAAK,OAAS,CAAC,EAEtC,OAAGA,EAAK,OAAS,IAAM,EACZN,GAAkBM,EAAKG,GAAOH,EAAKG,EAAM,IAAM,EAAGb,CAAa,EAG/DI,EAAiBM,EAAKG,GAAMb,CAAa,CAExD,EAMac,GAAWf,GAAwC,CAC5D,GAAG,CAACA,GAAQA,EAAK,QAAU,EAAG,OAG9B,IAAMO,EAAoC,IAAI,IAC9C,QAAWS,KAAOhB,EACdO,EAAa,IAAIS,GAAMT,EAAa,IAAIS,CAAG,GAAK,GAAK,CAAC,EAG1D,IAAIC,EAAe,EACfC,EAAkB,CAAC,EAGvB,OAAW,CAACF,EAAKP,CAAS,IAAKF,EACvBE,EAAYQ,GACZA,EAAeR,EACfS,EAAQ,CAACF,CAAG,GAEPP,IAAcQ,GACnBC,EAAM,KAAKF,CAAG,EAKtB,GAAIE,EAAM,SAAWlB,EAAK,OAK1B,OAAOkB,EAAM,SAAW,EAAI,CAACA,EAAM,EAAE,EAAIA,CAC7C,EAcaC,GAAe,CAACnB,EAAgBC,EAAgB,MAAgC,CACzF,GAAG,CAACD,GAAQA,EAAK,QAAU,EAAG,OAE9B,IAAMQ,EAAOT,EAAkBC,CAAI,EACnC,GAAGQ,IAAS,OAAW,OAEvB,IAAMN,EAAMF,EAAK,OAAO,CAACG,EAAKC,IAAQD,EAAQiB,EAAAhB,EAAMI,EAAS,GAAI,CAAC,EAElE,OAAOH,EAAiBH,EAAMF,EAAK,OAAQC,CAAa,CAC5D,EAMaoB,GAAc,CAACrB,EAAgBC,EAAgB,MAAgC,CACxF,GAAG,CAACD,GAAQA,EAAK,QAAU,EAAG,OAE9B,IAAMQ,EAAOT,EAAkBC,CAAI,EACnC,GAAGQ,IAAS,OAAW,OAEvB,IAAMN,EAAMF,EAAK,OAAO,CAACG,EAAKC,IAAQD,EAAOiB,EAAAhB,EAAO,GAAI,CAAC,EAEzD,OAAOC,EAAkBH,EAAMF,EAAK,OAAWoB,EAAAZ,EAAQ,GAAIP,CAAa,CAC5E,EAKaqB,GAAuB,CAACtB,EAAgBC,EAAgB,MAAa,CA5HlF,IAAAsB,EA6HI,IAAMC,GAAWD,EAAAF,GAAYrB,CAAI,IAAhB,KAAAuB,EAAqB,EACtC,OAAOlB,EAAiB,KAAK,KAAKmB,CAAQ,EAAGvB,CAAa,CAC9D,ECtHO,IAAMwB,GAAmB,CAACC,EAAeC,EAAaC,EAAaC,EAAgB,MAAsB,CAC5G,IAAMC,EAAOF,EAAMD,EACnB,OAAGG,IAAS,EAAU,EACfC,GAAkBL,EAAQC,GAAOG,EAAMD,CAAa,CAC/D,EAKaG,GAAmB,CAACC,EAAgBN,EAAaC,EAAaC,EAAgB,MAAuB,CAC9G,IAAMK,EAAO,CAAC,GAAGD,CAAI,EAErB,QAAQ,EAAE,EAAG,EAAEC,EAAK,OAAQ,IACxBA,EAAK,GAAKT,GAAiBS,EAAK,GAAIP,EAAKC,EAAKC,CAAa,EAG/D,OAAOK,CACX,EAEaC,GAAsB,CAACF,EAAgBJ,EAAgB,MAAiC,CACjG,IAAMF,EAAM,KAAK,IAAI,GAAGM,CAAI,EACtBL,EAAM,KAAK,IAAI,GAAGK,CAAI,EACtBG,EAAQJ,GAAiBC,EAAMN,EAAKC,EAAKC,CAAa,EAE5D,MAAO,CACH,IAAKE,EAAiBJ,EAAKE,CAAa,EACxC,IAAKE,EAAiBH,EAAKC,CAAa,EACxC,KAAMO,CACV,CACJ,EAKaC,GAAwB,CAACJ,EAAgBN,EAAaC,EAAaC,EAAgB,MACrFG,GAAiBC,EAAMN,EAAKC,EAAKC,CAAa,EAQ5CS,GAAqB,CAACZ,EAAea,EAAcC,EAAgBX,EAAgB,MACzFW,IAAW,EAAU,EACjBT,GAAkBL,EAAQa,GAAQC,EAAQX,CAAa,EAMrDY,GAAqB,CAACR,EAAgBM,EAAcC,EAAgBX,EAAgB,MACtF,CAAC,GAAGI,CAAI,EAAE,IAAIP,GAASY,GAAmBZ,EAAOa,EAAMC,EAAQX,CAAa,CAAC,EAG3Ea,GAAwB,CAACT,EAAgBJ,EAAgB,MAAmC,CAhEzG,IAAAc,EAiEI,IAAMJ,GAAOI,EAAAC,EAAkBX,CAAI,IAAtB,KAAAU,EAA2B,EAClCH,EAASK,GAAqBZ,CAAI,EAClCG,EAAQK,GAAmBR,EAAMM,EAAMC,EAAQX,CAAa,EAElE,MAAO,CACH,KAAME,EAAiBQ,EAAMV,CAAa,EAC1C,OAAQE,EAAiBS,EAAQX,CAAa,EAC9C,KAAMO,CACV,CACJ,EAKaU,GAA0B,CAACb,EAAgBM,EAAcC,EAAgBX,EAAgB,MAC3FY,GAAmBR,EAAMM,EAAMC,EAAQX,CAAa,EC5ExD,IAAMkB,GAAyBC,GAC1BA,EAAI,GAAMA,EAAI,GAMbC,GAAwB,CAACC,EAAWF,KACrCA,EAAIE,EAAI,IAAMA,EAAIF,GAAK,ECP5B,IAAMG,GAAqB,CAACC,EAAWC,EAAQ,IAAc,CAEhE,GAAID,EAAI,EACJ,MAAM,IAAI,MAAM,gDAAgD,EAGpE,GAAIC,EAAQD,EACR,MAAM,IAAI,MAAM,iCAAiC,EAGrD,GAAIC,EAAQ,EACR,MAAM,IAAI,MAAM,6BAA6B,EAGjD,GAAIA,IAAU,EAAG,CACb,GAAID,IAAM,EACN,MAAO,GAGPC,EAAQ,CAEhB,CAEA,IAAIC,EAAS,EACb,QAASC,EAAIF,EAAOE,GAAKH,EAAGG,IACxBD,GAAUC,EAEd,OAAOD,CACX,EASaE,GAAqB,CAACJ,EAAWC,EAAQ,IAAc,CAChE,GAAID,EAAI,EACJ,MAAM,IAAI,MAAM,gDAAgD,EAGpE,GAAIC,EAAQD,EACR,MAAM,IAAI,MAAM,iCAAiC,EAGrD,GAAIC,EAAQ,EACR,MAAM,IAAI,MAAM,6BAA6B,EAGjD,GAAIA,IAAU,EAAG,CACb,GAAID,IAAM,EACN,MAAO,GAGPC,EAAQ,CAEhB,CAGA,OAAID,IAAMC,EAAcA,EAGjBD,EAAII,GAAmBJ,EAAI,EAAGC,CAAK,CAC9C,EAKaI,GAAoB,CAACL,EAAWC,EAAQ,IAAc,CAC/D,GAAID,EAAI,EACJ,MAAM,IAAI,MAAM,gDAAgD,EAGpE,GAAIC,EAAQD,EACR,MAAM,IAAI,MAAM,iCAAiC,EAGrD,GAAIC,EAAQ,EACR,MAAM,IAAI,MAAM,6BAA6B,EAGjD,GAAIA,IAAU,EAAG,CACb,GAAID,IAAM,EACN,MAAO,GAGPC,EAAQ,CAEhB,CAEA,IAAMK,EAAO,IAAI,IAEXC,EAAW,CAACC,EAAaC,IAAwB,CAlG3D,IAAAC,EAmGQ,GAAIF,EAAMC,EAAK,MAAO,GAGtB,GAAIH,EAAK,IAAIE,CAAG,EAAG,OAAOE,EAAAJ,EAAK,IAAIE,CAAG,IAAZ,KAAAE,EAAiB,EAE3C,GAAIF,IAAQC,EACR,OAAAH,EAAK,IAAIE,EAAKA,CAAG,EACVA,EAGX,IAAMN,EAASM,EAAMD,EAASC,EAAM,EAAGC,CAAG,EAE1C,OAAAH,EAAK,IAAIE,EAAKN,CAAM,EAEbA,CACX,EAEA,OAAOK,EAASP,EAAGC,CAAK,CAC5B,EAKaU,GAAY,CAACX,EAAWC,EAAQ,IAAc,CACvD,GAAID,EAAI,EACJ,MAAM,IAAI,MAAM,gDAAgD,EAGpE,GAAIC,EAAQD,EACR,MAAM,IAAI,MAAM,iCAAiC,EAGrD,GAAIC,EAAQ,EACR,MAAM,IAAI,MAAM,6BAA6B,EAGjD,GAAIA,IAAUD,EACV,OAAOA,IAAM,EAAI,EAAIA,EAGrBC,IAAU,IACVA,EAAQ,GAGZ,IAAMW,EAAQ,CAAC,EACfA,EAAM,GAAK,EACX,QAAST,EAAI,EAAGA,GAAKH,EAAGG,IACpBS,EAAMT,GAAKS,EAAMT,EAAI,GAAKA,EAE9B,OAAOS,EAAMZ,GAAKY,EAAMX,EAAQ,EACpC,EC5HO,IAAMY,GAA6B,CAACC,EAAW,IAAc,CAChE,GAAIA,EAAI,GAAK,EAAI,EACb,MAAM,IAAI,MAAM,+CAA+C,EAEnE,GAAI,CAAC,OAAO,UAAUA,CAAC,GAAK,CAAC,OAAO,UAAU,CAAC,EAC3C,MAAM,IAAI,MAAM,kCAAkC,EAGtD,OAAOC,EAAAD,EAAK,EAChB,EAsBaE,GAAgC,CAACF,EAAW,IAAc,CACnE,GAAIA,EAAI,GAAK,EAAI,EACb,MAAM,IAAI,MAAM,+CAA+C,EAEnE,GAAI,CAAC,OAAO,UAAUA,CAAC,GAAK,CAAC,OAAO,UAAU,CAAC,EAC3C,MAAM,IAAI,MAAM,kCAAkC,EAGtD,OAAOG,GAAUH,EAAGA,EAAI,EAAI,CAAC,CACjC,EAmCaI,GAAgC,CAACJ,EAAW,IAAuB,CAC5E,GAAIA,EAAI,GAAK,EAAI,EACb,MAAM,IAAI,MAAM,+CAA+C,EAEnE,GAAI,CAAC,OAAO,UAAUA,CAAC,GAAK,CAAC,OAAO,UAAU,CAAC,EAC3C,MAAM,IAAI,MAAM,kCAAkC,EAMtD,IAAMK,EAAK,MAAM,KAAK,CAAE,OAAQL,EAAI,CAAE,EAAG,IAAM,MAAM,EAAI,CAAC,EAAE,KAAK,CAAC,CAAC,EAWnE,QAASM,EAAI,EAAGA,GAAKN,EAAGM,IACpBD,EAAGC,GAAG,GAAK,EACPA,GAAK,IAELD,EAAGC,GAAGA,GAAK,GAKnB,QAASA,EAAI,EAAGA,GAAKN,EAAGM,IACpB,QAASC,EAAI,EAAGA,GAAK,KAAK,IAAID,EAAG,CAAC,EAAGC,IACjCF,EAAGC,GAAGC,GAAKF,EAAGC,EAAE,GAAGC,EAAE,GAAKF,EAAGC,EAAE,GAAGC,GAI1C,OAAOF,EAAGL,GAAG,EACjB", "names": ["setDecimalPlaces", "num", "decimalPlaces", "coefficient", "__pow", "mod", "n", "m", "convertRange", "x", "a", "b", "c", "d", "doRangesOverlap", "isNumber", "value", "polarToCartesian", "center", "radii", "angleInRad", "decimalPlaces", "cx", "cy", "rx", "ry", "setDecimalPlaces", "getV2Angle", "v2", "decimalPlaces", "angle", "setDecimalPlaces", "getV2AngleInEllipse", "radii", "setV2Angle", "newAngleRad", "length", "v2Length", "radiansToDegrees", "radians", "res", "degreesToRadians", "degrees", "getVNAngleBetween", "vector1", "vector2", "unitVector1", "vNormalize", "unitVector2", "dotProduct", "vDotProduct", "getV2AngleBetween", "diff", "vSub", "getV3AngleBetween", "isAngleBetween", "angleDegrees", "startAngleDegrees", "endAngleDegrees", "distance", "getAnglesSub", "distance1", "distance2", "totalDistance", "isClockwise", "angle1Deg", "angle2Deg", "startAngleDeg", "angleDegrees1", "angleDegrees2", "angleDistance", "mod", "getAnglesDistance", "percentToAngle", "percent", "endAngleDeg", "circleStartAngle", "vSum", "vector1", "vector2", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2Sum", "v3Sum", "vSub", "v2Sub", "v3Sub", "vMulScalar", "v", "scalar", "v2MulScalar", "v2", "v3MulScalar", "v3", "vDivideScalar", "v2DivideScalar", "v3DivideScalar", "vLength", "sum", "v2Length", "v3Length", "v2SetLength", "newLength", "angle", "getV2Angle", "vDistance", "diff", "v2Distance", "v3Distance", "vNormalize", "length", "unitVector", "v2Normalize", "v3Normalize", "vDotProduct", "v2DotProduct", "v3DotProduct", "v3CrossProduct", "defaultValue", "v4", "vN", "N", "v2FromPolarCoords", "distance", "angleRad", "setV2Angle", "vEqual", "v2GetNormal", "sub", "mSum", "matrix1", "matrix2", "decimalPlaces", "matrix", "i", "vSum", "m2Sum", "m3Sum", "mSub", "vSub", "m2Sub", "m3Sub", "mMulScalar", "m", "scalar", "v", "vMulScalar", "m2MulScalar", "m2", "m3MulScalar", "m3", "mDivideScalar", "vDivideScalar", "m2DivideScalar", "m3DivideScalar", "mTranspose", "vectorsCount", "vectorLength", "j", "m2Transpose", "m3Transpose", "mReset", "defaultValue", "res", "size", "vector", "m2Reset", "m3Reset", "m2x2", "m3x3", "m4x4", "mNxM", "N", "M", "vN", "identity2", "identity3", "identity4", "identityN", "mDeepCopy", "m2DeepCopy", "m3DeepCopy", "mAppendCol", "col", "copy", "mPrependCol", "mAppendRow", "row", "m2AppendRow", "m3AppendRow", "mPrependRow", "m2PrependRow", "m3PrependRow", "mDelLastRow", "mDelFirstRow", "mDelLastColumn", "mDelFirstColumn", "mGetFirstColumn", "mGetLastColumn", "mGetColumn", "colIndex", "mMul", "transposed", "vector1", "vector2", "product", "vDotProduct", "mMulVector", "mEqual", "vEqual", "mMinorHelper", "mMinor", "mDeterminant", "m2Determinant", "d", "minor", "param", "m3Determinant", "m2Adjugate", "m3Adjugate", "mAdjugate", "cofactors", "sign", "isSingularMatrix", "m2Inverse", "adj", "m3Inverse", "mInverse", "m2ToCSS", "m", "a", "b", "c", "d", "m2hToCSS", "tx", "ty", "m2hToCSS3d", "m3hToCSS3d", "m2Translation", "position", "decimalPlaces", "setDecimalPlaces", "m3Translation", "m2TranslationH", "m3TranslationH", "m2Rotation", "angleRad", "isClockwise", "cos", "sin", "m2RotationH", "m2RotationAroundPointH", "transformOrigin", "translation", "rotation", "translationBack", "v3MulScalar", "temp1", "mMul", "m2RotateAroundPointH", "mat3h", "mMulVector", "v2Rotate", "vector", "unitVector", "v2Normalize", "v2RotateH", "v3Normalize", "m3RotationX", "m3RotationXH", "v3RotateX", "m3RotationY", "m3RotationYH", "v3RotateY", "m3RotationZ", "m3RotationZH", "v3RotateZ", "m2ScaleAtPointHMatrix", "scaleVector", "scale", "m2ScaleH", "m2ScaleAtPointH", "point", "m2Scale", "v2Scale", "m3Scale", "m3ScaleH", "v3Scale", "m2ScaleX", "m2ScaleXH", "m3ScaleX", "m3ScaleXH", "m3ScaleY", "m3ScaleYH", "m3ScaleZ", "m3ScaleZH", "m2ScaleY", "m2ScaleYH", "m2ReflectionOrigin", "m2ReflectionOriginH", "m3ReflectionOrigin", "m3ReflectionOriginH", "m2ReflectionYmX", "m2ReflectionX", "m2ReflectionXH", "m2ReflectionY", "m2ReflectionYH", "m3ReflectionYZ", "m3ReflectionYZH", "m3ReflectionXZ", "m3ReflectionXZH", "m3ReflectionXY", "m3ReflectionXYH", "m2ShearingY", "factor", "m2ShearingX", "getRandom", "min", "max", "decimalPlaces", "setDecimalPlaces", "getRandomInt", "getRandomBoolean", "getRandomItemFromArray", "array", "randomIndex", "stringToNumber", "value", "defaultNumber", "_a", "res", "dxPolynomial", "x", "polynomial", "decimalPlaces", "res", "part", "coeff", "power", "setDecimalPlaces", "dxV2QuadraticBezierCurve", "startControlPoint", "centerControlPoint", "endControlPoint", "temp1", "temp2", "temp3", "dxV3QuadraticBezierCurve", "dxV2CubicBezierCurve", "center1ControlPoint", "center2ControlPoint", "temp4", "dxV3CubicBezierCurve", "dxSin", "dxCos", "dxTan", "__pow", "dxCot", "dxArcSin", "dxArcCos", "dxArcTan", "dxArcCot", "linearEquation", "equation", "decimalPlaces", "a", "b", "diff", "setDecimalPlaces", "linearEquationSystem2", "equation1", "equation2", "equationParams", "inversed", "m2Inverse", "equationResults", "mMulVector", "linearEquationSystem3", "equation3", "m3Inverse", "linearEquationSystemN", "equations", "mDelLastColumn", "mInverse", "mGetLastColumn", "getLinearEquationBy2Points", "point1", "point2", "deltaX", "deltaY", "v2Sub", "x", "y", "m", "formula", "quadraticEquation", "equation", "decimalPlaces", "a", "b", "c", "d", "res", "linearEquation", "isNumber", "diff", "discriminant", "setDecimalPlaces", "t1", "t2", "v2QuadraticBezierCurve", "startControlPoint", "centerControlPoint", "endControlPoint", "decimalPlaces", "temp1", "temp2", "temp3", "setDecimalPlaces", "v3QuadraticBezierCurve", "v2CubicBezierCurve", "center1ControlPoint", "center2ControlPoint", "temp4", "v3CubicBezierCurve", "v2QuadraticBezierCurveTangent", "dxVector", "dxV2QuadraticBezierCurve", "v2Normalize", "v3QuadraticBezierCurveTangent", "dxV3QuadraticBezierCurve", "v3Normalize", "v2CubicBezierCurveTangent", "dxV2CubicBezierCurve", "v3CubicBezierCurveTangent", "dxV3CubicBezierCurve", "v2QuadraticBezierCurveNormal", "tangent", "v2CubicBezierCurveNormal", "v2QuadraticBezierCurveExtrema", "a1", "b1", "res1", "linearEquation", "a2", "b2", "res2", "res", "isNumber", "v2CubicBezierCurveExtrema", "c1", "equation1", "c2", "equation2", "quadraticEquation", "num", "v2QuadraticBezierBBox", "extrema", "minX", "minY", "maxX", "maxY", "percent", "point", "x", "y", "v2CubicBezierBBox", "circleMovement", "center", "angle", "radius", "circleMovementAfterMouse", "mouse", "vector", "v2Sub", "getV2Angle", "convertRange", "ellipseMovement", "radius1", "radius2", "ellipseMovementAfterMouse", "radii", "sineWaveMovement", "x", "amplitude", "frequency", "phase", "y", "lissajousCurve", "width", "height", "t", "k", "n", "m", "p", "getRandomRGBColor", "hslColor", "getRandomHSLColor", "hslToRgb", "getRandomHexColor", "hslToHex", "h", "getRandom", "s", "l", "getRandomHSLColorWithHue", "getRandomHSLColorWithSaturation", "getRandomHSLColorWithLightness", "getRandomGrayscaleHSLColor", "getRandomHSLColorWithinRanges", "hueStart", "hueEnd", "saturationStart", "saturationEnd", "lightStart", "lightEnd", "convertHueToDegrees", "getHue", "r", "g", "b", "min", "max", "diff", "getLuminance", "getSaturation", "rgbToHsl", "rgb", "decimalPlaces", "setDecimalPlaces", "hslToRgbHelper", "helper1", "helper2", "colorHelper", "hsl", "gray", "rHelper", "gHelper", "bHelper", "hue2rgb", "q", "t", "p", "toHex", "hex", "rgbToHex", "hexToRgb", "shorthandRegex", "_hex", "_m", "result", "rgbToLab", "x", "y", "z", "labToRgb", "lab", "getShiftedHue", "color", "shift", "hue", "mod", "getShiftedLightness", "lightness", "getShiftedSaturation", "saturation", "getColorsDelta", "rgbA", "rgbB", "labA", "labB", "deltaL", "deltaA", "deltaB", "c1", "c2", "deltaC", "deltaH", "sc", "sh", "deltaLKlsl", "deltaCkcsc", "deltaHkhsh", "i", "guid", "c", "newId", "rectCollide", "rect1", "rect2", "circleCollide", "circle1", "circle2", "dx", "dy", "getEdges", "poly", "edges", "i", "nextIndex", "mod", "edge", "convexPolygonsCollide", "poly1", "poly2", "normal", "v2GetNormal", "p1Proj", "projectPolygon", "p2Proj", "polygon", "min", "max", "vertex", "projection", "v2DotProduct", "animate", "props", "_duration", "startTime", "animationId", "elapsed", "previousTimeStamp", "animating", "observer", "stop", "restart", "start", "pause", "resume", "step", "timeStamp", "getResult", "observerHandler", "_entries", "_observer", "getElapsedTime", "isAnimating", "getStartTime", "getPercent", "getResizeObserver", "getCircleCircumference", "radius", "decimalPlaces", "setDecimalPlaces", "getEllipseCircumference", "radius1", "radius2", "__pow", "isAngleInCircleArc", "startAngleDeg", "endAngleDeg", "currentDegrees", "getSquareInCircleSide", "naturalNumbersSequenceSum", "n", "arithmeticSequenceSum", "a", "d", "getArithmeticMean", "data", "decimalPlaces", "sum", "acc", "val", "setDecimalPlaces", "getArithmeticMeanFromFrequency", "frequencyMap", "mean", "frequency", "getMedian", "copy", "num1", "num2", "mid", "getMode", "num", "maxFrequency", "modes", "getVariance1", "__pow", "getVariance", "getStandardDeviation", "_a", "variance", "mlNormalizeValue", "value", "min", "max", "decimalPlaces", "diff", "setDecimalPlaces", "mlNormalizeArray", "data", "copy", "mlNormalizeTestData", "_data", "mlNormalizeUnseenData", "mlStandardizeValue", "mean", "stdDev", "mlStandardizeArray", "mlStandardizeTestData", "_a", "getArithmeticMean", "getStandardDeviation", "mlStandardizeUnseenData", "naturalNumbersSum1ToN", "n", "naturalNumbersSumMToN", "m", "factorialIterative", "n", "start", "result", "i", "factorialRecursive", "factorialMemoized", "memo", "traverse", "num", "end", "_a", "factorial", "table", "permutationsWithRepetition", "n", "__pow", "permutationsWithoutRepetition", "factorial", "combinationsWithoutRepetition", "dp", "i", "j"] } diff --git a/dist/mz-math.min.js.map b/dist/mz-math.min.js.map index 05029a6..dfbaa4d 100644 --- a/dist/mz-math.min.js.map +++ b/dist/mz-math.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/main/linear-algebra/vector.ts", "../src/main/format.ts", "../src/main/angle.ts", "../src/main/other.ts", "../src/main/linear-algebra/matrix.ts", "../src/main/linear-algebra/matrix-transformations.ts", "../src/main/random.ts", "../src/main/convert.ts", "../src/main/bezier-curves/bezier-curve.ts", "../src/main/derivative.ts", "../src/main/equations/linear-equations.ts", "../src/main/equations/quadratic-equations.ts", "../src/main/path-movement.ts", "../src/main/color.ts", "../src/main/physics.ts", "../src/main/id.ts", "../src/main/collision-detection.ts", "../src/main/animation.ts", "../src/main/circle-ellipse.ts", "../src/main/sequence.ts", "../src/main/statistics.ts", "../src/main/ml.ts", "../src/main/series.ts", "../src/main/combinatorics/factorial.ts", "../src/main/combinatorics/combinatorics.ts", "../src/index.ts"], - "sourcesContent": ["import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}\n\nexport const isClockwise = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n return angle2Deg >= angle1Deg;\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const getAnglesDistance = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0, decimalPlaces = Infinity) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n if(isClockwise(angle1Deg, angle2Deg, startAngleDeg)) {\n return setDecimalPlaces((angle2Deg - angle1Deg + 360) % 360, decimalPlaces);\n }\n else{\n return setDecimalPlaces((angle1Deg - angle2Deg + 360) % 360, decimalPlaces);\n }\n};\n\nexport const percentToAngle = (percent: number, startAngleDeg: number, endAngleDeg: number, circleStartAngle = 0) => {\n if(percent < 0) {\n percent = 0;\n }\n\n if(percent > 100) {\n percent = 100;\n }\n\n const distance = getAnglesDistance(startAngleDeg, endAngleDeg, circleStartAngle);\n\n const clockwise = isClockwise(startAngleDeg, endAngleDeg, circleStartAngle);\n if(clockwise) {\n return mod(circleStartAngle + (percent * distance / 100), 360);\n }\n else {\n return mod(circleStartAngle - (percent * distance / 100), 360);\n }\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, LABColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to degrees.\n * @param {number} h\n * @return {number} [0, 360] degrees\n */\nconst convertHueToDegrees = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n return h;\n // convert huw to %\n // return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (max === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n const diff = max - min;\n\n let h = 0;\n\n // if red is max\n if(max === r){\n h = (g - b) / diff + (g < b ? 6 : 0);\n }\n\n // if green is max\n if(max === g){\n h = 2 + (b - r) / diff;\n }\n\n // if blue is max\n if(max === b){\n h = 4 + (r - g) / diff;\n }\n\n return convertHueToDegrees(h);\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n/**\n * RGB to HEX\n * rgbToHex([235, 64, 52]) // #eb4034\n */\nexport const rgbToHex = (rgb: RGBColor) => {\n const [r, g, b] = rgb;\n return '#' + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);\n};\n\nexport const hexToRgb = (hex: string) : RGBColor | null => {\n\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const _hex = hex.replace(shorthandRegex, (_m, r, g, b) => {\n return r + r + g + g + b + b;\n });\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(_hex);\n if(!result) return null;\n\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n\n return [r, g, b];\n};\n\nexport const rgbToLab = (rgb: RGBColor, decimalPlaces = Infinity) : LABColor => {\n\n let r = rgb[0] / 255;\n let g = rgb[1] / 255;\n let b = rgb[2] / 255;\n\n r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n let x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;\n let y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;\n let z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;\n\n x = (x > 0.008856) ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;\n y = (y > 0.008856) ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;\n z = (z > 0.008856) ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;\n\n return [\n setDecimalPlaces((116 * y) - 16, decimalPlaces),\n setDecimalPlaces(500 * (x - y), decimalPlaces),\n setDecimalPlaces(200 * (y - z), decimalPlaces),\n ];\n};\n\nexport const labToRgb = (lab: LABColor, decimalPlaces = Infinity) : RGBColor => {\n let y = (lab[0] + 16) / 116;\n let x = lab[1] / 500 + y;\n let z = y - lab[2] / 200;\n\n x = 0.95047 * ((x * x * x > 0.008856) ? x * x * x : (x - 16/116) / 7.787);\n y = 1.00000 * ((y * y * y > 0.008856) ? y * y * y : (y - 16/116) / 7.787);\n z = 1.08883 * ((z * z * z > 0.008856) ? z * z * z : (z - 16/116) / 7.787);\n\n let r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n let g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n let b = x * 0.0557 + y * -0.2040 + z * 1.0570;\n\n r = (r > 0.0031308) ? (1.055 * Math.pow(r, 1/2.4) - 0.055) : 12.92 * r;\n g = (g > 0.0031308) ? (1.055 * Math.pow(g, 1/2.4) - 0.055) : 12.92 * g;\n b = (b > 0.0031308) ? (1.055 * Math.pow(b, 1/2.4) - 0.055) : 12.92 * b;\n\n return [\n setDecimalPlaces(Math.max(0, Math.min(1, r)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, g)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, b)) * 255, decimalPlaces),\n ];\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n\n// ----------------------- SIMILAR COLORS --------------------------------------\n\n/**\n * Measure the perceptual difference between two RGB colors using the CIE76 color difference formula:\n * delta = Math.sqrt((L2 - L1)^2 + (a2 - a1)^2 + (b2 - b1)^2)\n * https://en.wikipedia.org/wiki/Color_difference\n * https://stackoverflow.com/questions/13586999/color-difference-similarity-between-two-values-with-js\n * <= 1.0 Not perceptible by human eyes.\n * 1 - 2 Perceptible through close observation.\n * 2 - 10 Perceptible at a glance.\n * 11 - 49 Colors are more similar than opposite\n * 100 Colors are exact opposite\n */\nexport const getColorsDelta = (rgbA: RGBColor, rgbB: RGBColor, decimalPlaces = Infinity) => {\n const labA = rgbToLab(rgbA, decimalPlaces);\n const labB = rgbToLab(rgbB, decimalPlaces);\n\n // differences between the LAB components of the two colors\n const deltaL = labA[0] - labB[0];\n const deltaA = labA[1] - labB[1];\n const deltaB = labA[2] - labB[2];\n\n // chroma components\n const c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);\n const c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);\n const deltaC = c1 - c2;\n\n // difference in hue, deltaH, which takes into account both the differences\n // in the a* and b* components of LAB and the differences in chroma.\n let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n\n // It applies weighting factors to the differences in lightness (deltaL),\n // chroma (deltaC), and hue (deltaH).\n const deltaLKlsl = deltaL / (1.0);\n const deltaCkcsc = deltaC / (sc);\n const deltaHkhsh = deltaH / (sh);\n\n // It computes the final color difference using the CIE76 formula:\n // deltaE = sqrt(deltaLKlsl^2 + deltaCkcsc^2 + deltaHkhsh^2),\n // where deltaLKlsl is the weighted lightness difference,\n // deltaCkcsc is the weighted chroma difference,\n // and deltaHkhsh is the weighted hue difference.\n const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n\n // It returns the calculated color difference,\n // optionally rounded to the specified number of decimal places.\n return i < 0 ? 0 : Math.sqrt(i);\n};\n", "import { Vector2 } from '../types';\n\n/**\n * Speed = how far something moves in a given amount of time.\n * Speed is also a vector:\n * magnitude = distance\n * direction = time\n */\nexport type Speed = Vector2;\n\n/**\n * Velocity is a measure of how fast an object is moving in a particular direction.\n * Velocity = Distance traveled / Time taken\n * It has a magnitude and direction, and can be represented as a vector.\n */\nexport type Velocity = Vector2;\n\n/**\n * Acceleration is a measure of how quickly an object's velocity changes over time.\n * Acceleration = (Final velocity - Initial velocity) / Time taken\n * a = (vf - v0)/t.\n * Distance = Initial velocity * time + (acceleration * time^2) / 2\n * It also has a magnitude and direction, and can be represented as a vector.\n * When the direction is negative ----> it's a \"slowdown\" movement\n */\nexport type Acceleration = Vector2;\n\n/**\n * Gravity is the force that attracts two objects with mass toward each other.\n * Newton's law of universal gravitation formula:\n * Gravitational force = (Gravitational constant * Mass of object 1 * Mass of object 2) / Distance between objects^2\n * It also has a magnitude and direction, and can be represented as a vector.\n * magnitude = the strength of the gravitational force\n * direction = the direction in which the force is acting (the direction of the gravitational force is always toward the center of mass of the objects involved)\n */\nexport type Gravity = Vector2;\n\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces } from './format';\n\nexport const getCircleCircumference = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * radius, decimalPlaces);\n};\n\nexport const getEllipseCircumference = (radius1: number, radius2: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * Math.sqrt((radius1 ** 2 + radius2 ** 2) / 2), decimalPlaces);\n};\n\nexport const isAngleInCircleArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "/**\n * 1 + 2 + ... + n = n * (n + 1) / 2\n */\nexport const naturalNumbersSequenceSum = (n: number) => {\n return n * (n + 1) / 2;\n};\n\n/**\n * n = the number of terms to be added\n * a = the first term in the sequence\n * d = the constant value between terms\n */\nexport const arithmeticSequenceSum = (n: number, a: number, d: number) => {\n return (n / 2) * (2 * a + (n - 1) * d);\n};", "import { setDecimalPlaces } from './format';\n\n// -------------------- CENTRAL TENDENCY ----------------------------\n\n/**\n * Central tendency: Calculate the Average (mean = \u03BC)\n * Sum of all numbers divided by the array length.\n */\nexport const getArithmeticMean = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const sum = data.reduce((acc, val) => acc + val, 0);\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Frequency map: number ---> it's frequency\n */\nexport const getArithmeticMeanFromFrequency = (frequencyMap: Map, decimalPlaces = Infinity) => {\n\n let mean = 0;\n\n for(const [val, frequency] of frequencyMap) {\n mean += val * frequency;\n }\n\n return setDecimalPlaces(mean, decimalPlaces);\n};\n\n/**\n * Central tendency: What is the central number in the sorted array?\n * Good for lists like [3, 3, 3, 3, 3, 3, 100] - 100 here is called \"Outlier\"\n */\nexport const getMedian = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const copy = [...data].sort((num1, num2) => num1 - num2);\n const mid = Math.floor(copy.length / 2);\n\n if(copy.length % 2 === 0) {\n return setDecimalPlaces((copy[mid] + copy[mid - 1]) / 2, decimalPlaces);\n }\n else {\n return setDecimalPlaces(copy[mid], decimalPlaces);\n }\n};\n\n/**\n * Central tendency: What number is most common in the set.\n * If all numbers have the same frequency, there is no mode.\n */\nexport const getMode = (data: number[]) : number[]|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n // Count frequency of each number in the data array.\n const frequencyMap: Map = new Map();\n for (const num of data) {\n frequencyMap.set(num, (frequencyMap.get(num) || 0) + 1);\n }\n\n let maxFrequency = 0;\n let modes: number[] = [];\n\n // Find the maximum frequency\n for (const [num, frequency] of frequencyMap) {\n if (frequency > maxFrequency) {\n maxFrequency = frequency;\n modes = [num];\n }\n else if (frequency === maxFrequency) {\n modes.push(num);\n }\n }\n\n // If all numbers have the same frequency, there is no mode\n if (modes.length === data.length) {\n return undefined;\n }\n\n // Return the mode(s)\n return modes.length === 1 ? [modes[0]] : modes;\n};\n\n/*\nTODO:\n- geometric mean\n- harmonic mean\n */\n\n// -------------------- DISPERSION ----------------------------\n\n/**\n * Dispersion: the average square distance from the mean.\n * Sum of (x - mean)^2 / N\n */\nexport const getVariance1 = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + ((val - mean) ** 2), 0);\n\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Another formula of dispersion - the average square distance from the mean.\n * (Sum of x^2) / N - (mean ^ 2)\n */\nexport const getVariance = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + (val ** 2), 0);\n\n return setDecimalPlaces((sum / data.length) - (mean ** 2), decimalPlaces);\n};\n\n/**\n * \u03C3\n */\nexport const getStandardDeviation = (data: number[], decimalPlaces = Infinity) => {\n const variance = getVariance(data) ?? 0;\n return setDecimalPlaces(Math.sqrt(variance), decimalPlaces);\n};", "import { setDecimalPlaces } from './format';\nimport { getArithmeticMean, getStandardDeviation } from './statistics';\nimport { IMlNormalizeResult, IMlStandardizeResult } from '../types';\n\n// --------------------- NORMALIZE --------------------------------\n\n/**\n * Changes value to be in the range [0, 1].\n */\nexport const mlNormalizeValue = (value: number, min: number, max: number, decimalPlaces = Infinity) : number => {\n const diff = max - min;\n if(diff === 0) return 0;\n return setDecimalPlaces((value - min) / diff, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [0, 1].\n */\nexport const mlNormalizeArray = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n const copy = [...data];\n\n for(let i=0; i {\n const min = Math.min(...data);\n const max = Math.max(...data);\n const _data = mlNormalizeArray(data, min, max, decimalPlaces);\n\n return {\n min: setDecimalPlaces(min, decimalPlaces),\n max: setDecimalPlaces(max, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlNormalizeUnseenData = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n return mlNormalizeArray(data, min, max, decimalPlaces);\n};\n\n// --------------------- STANDARDIZE --------------------------------\n\n/**\n * Changes value to be in the range [-1, 1].\n */\nexport const mlStandardizeValue = (value: number, mean: number, stdDev: number, decimalPlaces = Infinity) : number => {\n if(stdDev === 0) return 0;\n return setDecimalPlaces((value - mean) / stdDev, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [-1, 1].\n */\nexport const mlStandardizeArray = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity) : number[] => {\n return [...data].map(value => mlStandardizeValue(value, mean, stdDev, decimalPlaces));\n};\n\nexport const mlStandardizeTestData = (data: number[], decimalPlaces = Infinity): IMlStandardizeResult => {\n const mean = getArithmeticMean(data) ?? 0;\n const stdDev = getStandardDeviation(data);\n const _data = mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n\n return {\n mean: setDecimalPlaces(mean, decimalPlaces),\n stdDev: setDecimalPlaces(stdDev, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlStandardizeUnseenData = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity): number[] => {\n return mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n};", "/**\n * Sum of 1 to n numbers:\n * (n * (n + 1)) / 2\n */\nexport const naturalNumbersSum1ToN = (n: number): number => {\n return (n / 2) * (n + 1);\n};\n\n/**\n * Sum of m to n numbers.\n */\nexport const naturalNumbersSumMToN = (m: number, n: number): number => {\n return (n - m + 1) * (m + n) / 2;\n};", "/**\n * The simplest and straightforward method\n * but can become inefficient for extremely large numbers\n * due to growing computational time.\n */\nexport const factorialIterative = (n: number, start = 0): number => {\n\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n let result = 1;\n for (let i = start; i <= n; i++) {\n result *= i;\n }\n return result;\n};\n\n/**\n * A recursive approach is a classic method for calculating factorials\n * but can lead to stack overflow errors\n * for very large inputs because of deep recursion.\n * However, it's a direct translation\n * of the mathematical definition of factorial.\n */\nexport const factorialRecursive = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n // Base case: when n reaches start, return start instead of further reducing\n if (n === start) return start;\n\n // Recursive call\n return n * factorialRecursive(n - 1, start);\n};\n\n/**\n * Memoization (Top-Down Dynamic Programming).\n */\nexport const factorialMemoized = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n const memo = new Map();\n\n const traverse = (num: number, end: number): number => {\n if (num < end) return 1; // Adjust the base case to return 1 if we're below 'end'\n // if (num === 0) return 1;\n\n if (memo.has(num)) return memo.get(num) ?? 1;\n\n if (num === end) {\n memo.set(num, num);\n return num;\n }\n\n const result = num * traverse(num - 1, end);\n\n memo.set(num, result);\n\n return result;\n };\n\n return traverse(n, start);\n};\n\n/**\n * Tabulation (Bottom-Up Dynamic Programming).\n */\nexport const factorial = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === n) {\n return n === 0 ? 1 : n; // If start == n and n == 0, return 1 (0!), otherwise return n\n }\n\n if (start === 0) {\n start = 1;\n }\n\n const table = []; // new Array(n + 1);\n table[0] = 1;\n for (let i = 1; i <= n; i++) {\n table[i] = table[i - 1] * i;\n }\n return table[n] / table[start - 1];\n};", "import { factorial } from './factorial';\n\n/**\n * Permutations with repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - repetition is allowed\n *\n * Formula:\n * --------\n * n^r\n *\n * Intuition:\n * ----------\n * In other words, there are n possibilities for the first choice,\n * THEN there are n possibilities for the second choice, and so on,\n * multiplying each time.\n *\n * A Permutation is an ordered Combination.\n *\n * Example:\n * --------\n * Such as a lock that could be \"333\".\n */\nexport const permutationsWithRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return n ** r;\n};\n\n/**\n * Permutations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - no repetitions\n *\n * Formula:\n * --------\n * P(n,r) = n! / (n \u2212 r)!\n *\n * Intuition:\n * ----------\n * In this case, we have to reduce the number of available choices each time.\n * After choosing, say, number \"14\" we can't choose it again.\n * So, our first choice has 16 possibilities, and our next choice has 15 possibilities,\n * then 14, 13, 12, 11, ... etc.\n *\n * A Permutation is an ordered Combination.\n */\nexport const permutationsWithoutRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return factorial(n, n - r + 1);\n};\n\n/**\n * Order doesn't matter.\n *\n * Example:\n * --------\n * Coins in your pocket (5, 5, 5, 10, 10).\n\nexport const combinationsWithRepetition = () => {\n\n};\n */\n\n/**\n * Combinations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order doesn't matter\n * - no repetitions\n *\n * And is also known as the Binomial Coefficient.\n *\n * Formula:\n * --------\n * C(n, r) = C(n, n - r) = n! / (r! * (n\u2212r)!)\n *\n * Example:\n * --------\n * Such as lottery numbers (2, 14, 15, 27, 30, 33).\n */\nexport const combinationsWithoutRepetition = (n: number, r: number) : number => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n // Initialize a two-dimensional array (or matrix) [n + 1, r + 1].\n // The reason for n + 1 is to ensure that we can access indices directly equal to the value of n\n // without running out of bounds, as array indices start at 0.\n const dp = Array.from({ length: n + 1 }, () => Array(r + 1).fill(0));\n /*\n const dp: number[][] = [];\n for(let i=0; i<=n; i++) {\n dp[i] = [];\n for(let j=0; j<=r; j++) {\n dp[i][j] = 0;\n }\n }*/\n\n // Base cases: C(n, 0) = 1 and C(n, n) = 1 for any n.\n for (let i = 0; i <= n; i++) {\n dp[i][0] = 1;\n if (i <= r) {\n // Only fill this if i <= r to avoid filling non-existent cells\n dp[i][i] = 1;\n }\n }\n\n // Fill the table using the relation C(n, r) = C(n-1, r-1) + C(n-1, r)\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= Math.min(i, r); j++) { // Only compute up to the minimum of i and r\n dp[i][j] = dp[i-1][j-1] + dp[i-1][j];\n }\n }\n\n return dp[n][r];\n};\n\n", "import * as vector from './main/linear-algebra/vector';\nimport * as matrix from './main/linear-algebra/matrix';\nimport * as matrixTransformations from './main/linear-algebra/matrix-transformations';\nimport * as format from './main/format';\nimport * as angle from './main/angle';\nimport * as random from './main/random';\nimport * as other from './main/other';\nimport * as convert from './main/convert';\nimport * as bezierCurve from './main/bezier-curves/bezier-curve';\nimport * as equations from './main/equations/linear-equations';\nimport * as pathMovement from './main/path-movement';\nimport * as color from './main/color';\nimport * as physics from './main/physics';\nimport * as id from './main/id';\nimport * as derivative from './main/derivative';\nimport * as collisions from './main/collision-detection';\nimport * as animation from './main/animation';\nimport * as circleEllipse from './main/circle-ellipse';\nimport * as sequence from './main/sequence';\nimport * as statistics from './main/statistics';\nimport * as ml from './main/ml';\nimport * as series from './main/series';\nimport * as factorial from './main/combinatorics/factorial';\nimport * as combinatorics from './main/combinatorics/combinatorics';\n\nconst api = {\n ...vector,\n ...matrix,\n ...matrixTransformations,\n ...format,\n ...angle,\n ...random,\n ...other,\n ...convert,\n ...bezierCurve,\n ...equations,\n ...pathMovement,\n ...color,\n ...physics,\n ...id,\n ...derivative,\n ...collisions,\n ...animation,\n ...circleEllipse,\n ...sequence,\n ...statistics,\n ...ml,\n ...series,\n ...factorial,\n ...combinatorics,\n};\n\ndeclare global {\n interface Window {\n mzMath: typeof api,\n }\n}\n\nwindow.mzMath = window.mzMath || api;\n\nexport * from './main/linear-algebra/vector';\nexport * from './main/linear-algebra/matrix';\nexport * from './main/linear-algebra/matrix-transformations';\nexport * from './main/format';\nexport * from './main/angle';\nexport * from './main/random';\nexport * from './main/other';\nexport * from './main/convert';\nexport * from './main/bezier-curves/bezier-curve';\nexport * from './main/equations/linear-equations';\nexport * from './main/path-movement';\nexport * from './main/color';\nexport * from './main/physics';\nexport * from './main/id';\nexport * from './main/derivative';\nexport * from './main/collision-detection';\nexport * from './main/animation';\nexport * from './main/circle-ellipse';\nexport * from './main/sequence';\nexport * from './main/statistics';\nexport * from './main/ml';\nexport * from './main/series';\nexport * from './main/combinatorics/factorial';\nexport * from './main/combinatorics/combinatorics';"], - "mappings": "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", + "sourcesContent": ["import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}\n\nexport const isClockwise = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n return angle2Deg >= angle1Deg;\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const getAnglesDistance = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0, decimalPlaces = Infinity) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n if(isClockwise(angle1Deg, angle2Deg, startAngleDeg)) {\n return setDecimalPlaces((angle2Deg - angle1Deg + 360) % 360, decimalPlaces);\n }\n else{\n return setDecimalPlaces((angle1Deg - angle2Deg + 360) % 360, decimalPlaces);\n }\n};\n\nexport const percentToAngle = (percent: number, startAngleDeg: number, endAngleDeg: number, circleStartAngle = 0) => {\n if(percent < 0) {\n percent = 0;\n }\n\n if(percent > 100) {\n percent = 100;\n }\n\n const distance = getAnglesDistance(startAngleDeg, endAngleDeg, circleStartAngle);\n\n const clockwise = isClockwise(startAngleDeg, endAngleDeg, circleStartAngle);\n if(clockwise) {\n return mod(circleStartAngle + (percent * distance / 100), 360);\n }\n else {\n return mod(circleStartAngle - (percent * distance / 100), 360);\n }\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, LABColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to degrees.\n * @param {number} h\n * @return {number} [0, 360] degrees\n */\nconst convertHueToDegrees = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n return h;\n // convert huw to %\n // return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (max === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n const diff = max - min;\n\n let h = 0;\n\n // if red is max\n if(max === r){\n h = (g - b) / diff + (g < b ? 6 : 0);\n }\n\n // if green is max\n if(max === g){\n h = 2 + (b - r) / diff;\n }\n\n // if blue is max\n if(max === b){\n h = 4 + (r - g) / diff;\n }\n\n return convertHueToDegrees(h);\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n/**\n * RGB to HEX\n * rgbToHex([235, 64, 52]) // #eb4034\n */\nexport const rgbToHex = (rgb: RGBColor) => {\n const [r, g, b] = rgb;\n return '#' + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);\n};\n\nexport const hexToRgb = (hex: string) : RGBColor | null => {\n\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const _hex = hex.replace(shorthandRegex, (_m, r, g, b) => {\n return r + r + g + g + b + b;\n });\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(_hex);\n if(!result) return null;\n\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n\n return [r, g, b];\n};\n\nexport const rgbToLab = (rgb: RGBColor, decimalPlaces = Infinity) : LABColor => {\n\n let r = rgb[0] / 255;\n let g = rgb[1] / 255;\n let b = rgb[2] / 255;\n\n r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n let x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;\n let y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;\n let z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;\n\n x = (x > 0.008856) ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;\n y = (y > 0.008856) ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;\n z = (z > 0.008856) ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;\n\n return [\n setDecimalPlaces((116 * y) - 16, decimalPlaces),\n setDecimalPlaces(500 * (x - y), decimalPlaces),\n setDecimalPlaces(200 * (y - z), decimalPlaces),\n ];\n};\n\nexport const labToRgb = (lab: LABColor, decimalPlaces = Infinity) : RGBColor => {\n let y = (lab[0] + 16) / 116;\n let x = lab[1] / 500 + y;\n let z = y - lab[2] / 200;\n\n x = 0.95047 * ((x * x * x > 0.008856) ? x * x * x : (x - 16/116) / 7.787);\n y = 1.00000 * ((y * y * y > 0.008856) ? y * y * y : (y - 16/116) / 7.787);\n z = 1.08883 * ((z * z * z > 0.008856) ? z * z * z : (z - 16/116) / 7.787);\n\n let r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n let g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n let b = x * 0.0557 + y * -0.2040 + z * 1.0570;\n\n r = (r > 0.0031308) ? (1.055 * Math.pow(r, 1/2.4) - 0.055) : 12.92 * r;\n g = (g > 0.0031308) ? (1.055 * Math.pow(g, 1/2.4) - 0.055) : 12.92 * g;\n b = (b > 0.0031308) ? (1.055 * Math.pow(b, 1/2.4) - 0.055) : 12.92 * b;\n\n return [\n setDecimalPlaces(Math.max(0, Math.min(1, r)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, g)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, b)) * 255, decimalPlaces),\n ];\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n\n// ----------------------- SIMILAR COLORS --------------------------------------\n\n/**\n * Measure the perceptual difference between two RGB colors using the CIE76 color difference formula:\n * delta = Math.sqrt((L2 - L1)^2 + (a2 - a1)^2 + (b2 - b1)^2)\n * https://en.wikipedia.org/wiki/Color_difference\n * https://stackoverflow.com/questions/13586999/color-difference-similarity-between-two-values-with-js\n * <= 1.0 Not perceptible by human eyes.\n * 1 - 2 Perceptible through close observation.\n * 2 - 10 Perceptible at a glance.\n * 11 - 49 Colors are more similar than opposite\n * 100 Colors are exact opposite\n */\nexport const getColorsDelta = (rgbA: RGBColor, rgbB: RGBColor, decimalPlaces = Infinity) => {\n const labA = rgbToLab(rgbA, decimalPlaces);\n const labB = rgbToLab(rgbB, decimalPlaces);\n\n // differences between the LAB components of the two colors\n const deltaL = labA[0] - labB[0];\n const deltaA = labA[1] - labB[1];\n const deltaB = labA[2] - labB[2];\n\n // chroma components\n const c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);\n const c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);\n const deltaC = c1 - c2;\n\n // difference in hue, deltaH, which takes into account both the differences\n // in the a* and b* components of LAB and the differences in chroma.\n let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n\n // It applies weighting factors to the differences in lightness (deltaL),\n // chroma (deltaC), and hue (deltaH).\n const deltaLKlsl = deltaL / (1.0);\n const deltaCkcsc = deltaC / (sc);\n const deltaHkhsh = deltaH / (sh);\n\n // It computes the final color difference using the CIE76 formula:\n // deltaE = sqrt(deltaLKlsl^2 + deltaCkcsc^2 + deltaHkhsh^2),\n // where deltaLKlsl is the weighted lightness difference,\n // deltaCkcsc is the weighted chroma difference,\n // and deltaHkhsh is the weighted hue difference.\n const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n\n // It returns the calculated color difference,\n // optionally rounded to the specified number of decimal places.\n return i < 0 ? 0 : Math.sqrt(i);\n};\n", "import { Vector2 } from '../types';\n\n/**\n * Speed = how far something moves in a given amount of time.\n * Speed is also a vector:\n * magnitude = distance\n * direction = time\n */\nexport type Speed = Vector2;\n\n/**\n * Velocity is a measure of how fast an object is moving in a particular direction.\n * Velocity = Distance traveled / Time taken\n * It has a magnitude and direction, and can be represented as a vector.\n */\nexport type Velocity = Vector2;\n\n/**\n * Acceleration is a measure of how quickly an object's velocity changes over time.\n * Acceleration = (Final velocity - Initial velocity) / Time taken\n * a = (vf - v0)/t.\n * Distance = Initial velocity * time + (acceleration * time^2) / 2\n * It also has a magnitude and direction, and can be represented as a vector.\n * When the direction is negative ----> it's a \"slowdown\" movement\n */\nexport type Acceleration = Vector2;\n\n/**\n * Gravity is the force that attracts two objects with mass toward each other.\n * Newton's law of universal gravitation formula:\n * Gravitational force = (Gravitational constant * Mass of object 1 * Mass of object 2) / Distance between objects^2\n * It also has a magnitude and direction, and can be represented as a vector.\n * magnitude = the strength of the gravitational force\n * direction = the direction in which the force is acting (the direction of the gravitational force is always toward the center of mass of the objects involved)\n */\nexport type Gravity = Vector2;\n\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces } from './format';\n\nexport const getCircleCircumference = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * radius, decimalPlaces);\n};\n\nexport const getEllipseCircumference = (radius1: number, radius2: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * Math.sqrt((radius1 ** 2 + radius2 ** 2) / 2), decimalPlaces);\n};\n\nexport const isAngleInCircleArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "/**\n * 1 + 2 + ... + n = n * (n + 1) / 2\n */\nexport const naturalNumbersSequenceSum = (n: number) => {\n return n * (n + 1) / 2;\n};\n\n/**\n * n = the number of terms to be added\n * a = the first term in the sequence\n * d = the constant value between terms\n */\nexport const arithmeticSequenceSum = (n: number, a: number, d: number) => {\n return (n / 2) * (2 * a + (n - 1) * d);\n};", "import { setDecimalPlaces } from './format';\n\n// -------------------- CENTRAL TENDENCY ----------------------------\n\n/**\n * Central tendency: Calculate the Average (mean = \u03BC)\n * Sum of all numbers divided by the array length.\n */\nexport const getArithmeticMean = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const sum = data.reduce((acc, val) => acc + val, 0);\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Frequency map: number ---> it's frequency\n */\nexport const getArithmeticMeanFromFrequency = (frequencyMap: Map, decimalPlaces = Infinity) => {\n\n let mean = 0;\n\n for(const [val, frequency] of frequencyMap) {\n mean += val * frequency;\n }\n\n return setDecimalPlaces(mean, decimalPlaces);\n};\n\n/**\n * Central tendency: What is the central number in the sorted array?\n * Good for lists like [3, 3, 3, 3, 3, 3, 100] - 100 here is called \"Outlier\"\n */\nexport const getMedian = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const copy = [...data].sort((num1, num2) => num1 - num2);\n const mid = Math.floor(copy.length / 2);\n\n if(copy.length % 2 === 0) {\n return setDecimalPlaces((copy[mid] + copy[mid - 1]) / 2, decimalPlaces);\n }\n else {\n return setDecimalPlaces(copy[mid], decimalPlaces);\n }\n};\n\n/**\n * Central tendency: What number is most common in the set.\n * If all numbers have the same frequency, there is no mode.\n */\nexport const getMode = (data: number[]) : number[]|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n // Count frequency of each number in the data array.\n const frequencyMap: Map = new Map();\n for (const num of data) {\n frequencyMap.set(num, (frequencyMap.get(num) || 0) + 1);\n }\n\n let maxFrequency = 0;\n let modes: number[] = [];\n\n // Find the maximum frequency\n for (const [num, frequency] of frequencyMap) {\n if (frequency > maxFrequency) {\n maxFrequency = frequency;\n modes = [num];\n }\n else if (frequency === maxFrequency) {\n modes.push(num);\n }\n }\n\n // If all numbers have the same frequency, there is no mode\n if (modes.length === data.length) {\n return undefined;\n }\n\n // Return the mode(s)\n return modes.length === 1 ? [modes[0]] : modes;\n};\n\n/*\nTODO:\n- geometric mean\n- harmonic mean\n */\n\n// -------------------- DISPERSION ----------------------------\n\n/**\n * Dispersion: the average square distance from the mean.\n * Sum of (x - mean)^2 / N\n */\nexport const getVariance1 = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + ((val - mean) ** 2), 0);\n\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Another formula of dispersion - the average square distance from the mean.\n * (Sum of x^2) / N - (mean ^ 2)\n */\nexport const getVariance = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + (val ** 2), 0);\n\n return setDecimalPlaces((sum / data.length) - (mean ** 2), decimalPlaces);\n};\n\n/**\n * \u03C3\n */\nexport const getStandardDeviation = (data: number[], decimalPlaces = Infinity) => {\n const variance = getVariance(data) ?? 0;\n return setDecimalPlaces(Math.sqrt(variance), decimalPlaces);\n};", "import { setDecimalPlaces } from './format';\nimport { getArithmeticMean, getStandardDeviation } from './statistics';\nimport { IMlNormalizeResult, IMlStandardizeResult } from '../types';\n\n// --------------------- NORMALIZE --------------------------------\n\n/**\n * Changes value to be in the range [0, 1].\n */\nexport const mlNormalizeValue = (value: number, min: number, max: number, decimalPlaces = Infinity) : number => {\n const diff = max - min;\n if(diff === 0) return 0;\n return setDecimalPlaces((value - min) / diff, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [0, 1].\n */\nexport const mlNormalizeArray = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n const copy = [...data];\n\n for(let i=0; i {\n const min = Math.min(...data);\n const max = Math.max(...data);\n const _data = mlNormalizeArray(data, min, max, decimalPlaces);\n\n return {\n min: setDecimalPlaces(min, decimalPlaces),\n max: setDecimalPlaces(max, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlNormalizeUnseenData = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n return mlNormalizeArray(data, min, max, decimalPlaces);\n};\n\n// --------------------- STANDARDIZE --------------------------------\n\n/**\n * Changes value to be in the range [-1, 1].\n */\nexport const mlStandardizeValue = (value: number, mean: number, stdDev: number, decimalPlaces = Infinity) : number => {\n if(stdDev === 0) return 0;\n return setDecimalPlaces((value - mean) / stdDev, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [-1, 1].\n */\nexport const mlStandardizeArray = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity) : number[] => {\n return [...data].map(value => mlStandardizeValue(value, mean, stdDev, decimalPlaces));\n};\n\nexport const mlStandardizeTestData = (data: number[], decimalPlaces = Infinity): IMlStandardizeResult => {\n const mean = getArithmeticMean(data) ?? 0;\n const stdDev = getStandardDeviation(data);\n const _data = mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n\n return {\n mean: setDecimalPlaces(mean, decimalPlaces),\n stdDev: setDecimalPlaces(stdDev, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlStandardizeUnseenData = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity): number[] => {\n return mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n};", "/**\n * Sum of 1 to n numbers:\n * (n * (n + 1)) / 2\n */\nexport const naturalNumbersSum1ToN = (n: number): number => {\n return (n / 2) * (n + 1);\n};\n\n/**\n * Sum of m to n numbers.\n */\nexport const naturalNumbersSumMToN = (m: number, n: number): number => {\n return (n - m + 1) * (m + n) / 2;\n};", "/**\n * The simplest and straightforward method\n * but can become inefficient for extremely large numbers\n * due to growing computational time.\n */\nexport const factorialIterative = (n: number, start = 0): number => {\n\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n let result = 1;\n for (let i = start; i <= n; i++) {\n result *= i;\n }\n return result;\n};\n\n/**\n * A recursive approach is a classic method for calculating factorials\n * but can lead to stack overflow errors\n * for very large inputs because of deep recursion.\n * However, it's a direct translation\n * of the mathematical definition of factorial.\n */\nexport const factorialRecursive = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n // Base case: when n reaches start, return start instead of further reducing\n if (n === start) return start;\n\n // Recursive call\n return n * factorialRecursive(n - 1, start);\n};\n\n/**\n * Memoization (Top-Down Dynamic Programming).\n */\nexport const factorialMemoized = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n const memo = new Map();\n\n const traverse = (num: number, end: number): number => {\n if (num < end) return 1; // Adjust the base case to return 1 if we're below 'end'\n // if (num === 0) return 1;\n\n if (memo.has(num)) return memo.get(num) ?? 1;\n\n if (num === end) {\n memo.set(num, num);\n return num;\n }\n\n const result = num * traverse(num - 1, end);\n\n memo.set(num, result);\n\n return result;\n };\n\n return traverse(n, start);\n};\n\n/**\n * Tabulation (Bottom-Up Dynamic Programming).\n */\nexport const factorial = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === n) {\n return n === 0 ? 1 : n; // If start == n and n == 0, return 1 (0!), otherwise return n\n }\n\n if (start === 0) {\n start = 1;\n }\n\n const table = []; // new Array(n + 1);\n table[0] = 1;\n for (let i = 1; i <= n; i++) {\n table[i] = table[i - 1] * i;\n }\n return table[n] / table[start - 1];\n};", "import { factorial } from './factorial';\n\n/**\n * Permutations with repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - repetition is allowed\n *\n * Formula:\n * --------\n * n^r\n *\n * Intuition:\n * ----------\n * In other words, there are n possibilities for the first choice,\n * THEN there are n possibilities for the second choice, and so on,\n * multiplying each time.\n *\n * A Permutation is an ordered Combination.\n *\n * Example:\n * --------\n * Such as a lock that could be \"333\".\n */\nexport const permutationsWithRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return n ** r;\n};\n\n/**\n * Permutations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - no repetitions\n *\n * Formula:\n * --------\n * P(n,r) = n! / (n \u2212 r)!\n *\n * Intuition:\n * ----------\n * In this case, we have to reduce the number of available choices each time.\n * After choosing, say, number \"14\" we can't choose it again.\n * So, our first choice has 16 possibilities, and our next choice has 15 possibilities,\n * then 14, 13, 12, 11, ... etc.\n *\n * A Permutation is an ordered Combination.\n */\nexport const permutationsWithoutRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return factorial(n, n - r + 1);\n};\n\n/**\n * Order doesn't matter.\n *\n * Example:\n * --------\n * Coins in your pocket (5, 5, 5, 10, 10).\n\nexport const combinationsWithRepetition = () => {\n\n};\n */\n\n/**\n * Combinations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order doesn't matter\n * - no repetitions\n *\n * And is also known as the Binomial Coefficient.\n *\n * Formula:\n * --------\n * C(n, r) = C(n, n - r) = n! / (r! * (n\u2212r)!)\n *\n * Example:\n * --------\n * Such as lottery numbers (2, 14, 15, 27, 30, 33).\n *\n * Tabulation (Bottom-Up Dynamic Programming).\n * Time Complexity: \uD835\uDC42(n \u00D7 r)\n * Space Complexity: \uD835\uDC42(n \u00D7 r)\n */\nexport const combinationsWithoutRepetition = (n: number, r: number) : number => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n // Initialize a two-dimensional array (or matrix) [n + 1, r + 1].\n // The reason for n + 1 is to ensure that we can access indices directly equal to the value of n\n // without running out of bounds, as array indices start at 0.\n const dp = Array.from({ length: n + 1 }, () => Array(r + 1).fill(0));\n /*\n const dp: number[][] = [];\n for(let i=0; i<=n; i++) {\n dp[i] = [];\n for(let j=0; j<=r; j++) {\n dp[i][j] = 0;\n }\n }*/\n\n // Base cases: C(n, 0) = 1 and C(n, n) = 1 for any n.\n for (let i = 0; i <= n; i++) {\n dp[i][0] = 1;\n if (i <= r) {\n // Only fill this if i <= r to avoid filling non-existent cells\n dp[i][i] = 1;\n }\n }\n\n // Fill the table using the relation C(n, r) = C(n-1, r-1) + C(n-1, r)\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= Math.min(i, r); j++) { // Only compute up to the minimum of i and r\n dp[i][j] = dp[i-1][j-1] + dp[i-1][j];\n }\n }\n\n return dp[n][r];\n};\n\n", "import * as vector from './main/linear-algebra/vector';\nimport * as matrix from './main/linear-algebra/matrix';\nimport * as matrixTransformations from './main/linear-algebra/matrix-transformations';\nimport * as format from './main/format';\nimport * as angle from './main/angle';\nimport * as random from './main/random';\nimport * as other from './main/other';\nimport * as convert from './main/convert';\nimport * as bezierCurve from './main/bezier-curves/bezier-curve';\nimport * as equations from './main/equations/linear-equations';\nimport * as pathMovement from './main/path-movement';\nimport * as color from './main/color';\nimport * as physics from './main/physics';\nimport * as id from './main/id';\nimport * as derivative from './main/derivative';\nimport * as collisions from './main/collision-detection';\nimport * as animation from './main/animation';\nimport * as circleEllipse from './main/circle-ellipse';\nimport * as sequence from './main/sequence';\nimport * as statistics from './main/statistics';\nimport * as ml from './main/ml';\nimport * as series from './main/series';\nimport * as factorial from './main/combinatorics/factorial';\nimport * as combinatorics from './main/combinatorics/combinatorics';\n\nconst api = {\n ...vector,\n ...matrix,\n ...matrixTransformations,\n ...format,\n ...angle,\n ...random,\n ...other,\n ...convert,\n ...bezierCurve,\n ...equations,\n ...pathMovement,\n ...color,\n ...physics,\n ...id,\n ...derivative,\n ...collisions,\n ...animation,\n ...circleEllipse,\n ...sequence,\n ...statistics,\n ...ml,\n ...series,\n ...factorial,\n ...combinatorics,\n};\n\ndeclare global {\n interface Window {\n mzMath: typeof api,\n }\n}\n\nwindow.mzMath = window.mzMath || api;\n\nexport * from './main/linear-algebra/vector';\nexport * from './main/linear-algebra/matrix';\nexport * from './main/linear-algebra/matrix-transformations';\nexport * from './main/format';\nexport * from './main/angle';\nexport * from './main/random';\nexport * from './main/other';\nexport * from './main/convert';\nexport * from './main/bezier-curves/bezier-curve';\nexport * from './main/equations/linear-equations';\nexport * from './main/path-movement';\nexport * from './main/color';\nexport * from './main/physics';\nexport * from './main/id';\nexport * from './main/derivative';\nexport * from './main/collision-detection';\nexport * from './main/animation';\nexport * from './main/circle-ellipse';\nexport * from './main/sequence';\nexport * from './main/statistics';\nexport * from './main/ml';\nexport * from './main/series';\nexport * from './main/combinatorics/factorial';\nexport * from './main/combinatorics/combinatorics';"], + "mappings": "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", "names": ["vector_exports", "__export", "v2", "v2Distance", "v2DivideScalar", "v2DotProduct", "v2FromPolarCoords", "v2GetNormal", "v2Length", "v2MulScalar", "v2Normalize", "v2SetLength", "v2Sub", "v2Sum", "v3", "v3CrossProduct", "v3Distance", "v3DivideScalar", "v3DotProduct", "v3Length", "v3MulScalar", "v3Normalize", "v3Sub", "v3Sum", "v4", "vDistance", "vDivideScalar", "vDotProduct", "vEqual", "vLength", "vMulScalar", "vN", "vNormalize", "vSub", "vSum", "format_exports", "__export", "setDecimalPlaces", "setDecimalPlaces", "num", "decimalPlaces", "coefficient", "__pow", "angle_exports", "__export", "degreesToRadians", "getAnglesDistance", "getAnglesSub", "getV2Angle", "getV2AngleBetween", "getV2AngleInEllipse", "getV3AngleBetween", "getVNAngleBetween", "isAngleBetween", "isClockwise", "percentToAngle", "radiansToDegrees", "setV2Angle", "other_exports", "__export", "convertRange", "doRangesOverlap", "isNumber", "mod", "polarToCartesian", "mod", "n", "m", "convertRange", "x", "a", "b", "c", "d", "doRangesOverlap", "isNumber", "value", "polarToCartesian", "center", "radii", "angleInRad", "decimalPlaces", "cx", "cy", "rx", "ry", "setDecimalPlaces", "getV2Angle", "v2", "decimalPlaces", "angle", "setDecimalPlaces", "getV2AngleInEllipse", "radii", "setV2Angle", "newAngleRad", "length", "v2Length", "radiansToDegrees", "radians", "res", "degreesToRadians", "degrees", "getVNAngleBetween", "vector1", "vector2", "unitVector1", "vNormalize", "unitVector2", "dotProduct", "vDotProduct", "getV2AngleBetween", "diff", "vSub", "getV3AngleBetween", "isAngleBetween", "angleDegrees", "startAngleDegrees", "endAngleDegrees", "distance", "getAnglesSub", "distance1", "distance2", "totalDistance", "isClockwise", "angle1Deg", "angle2Deg", "startAngleDeg", "angleDegrees1", "angleDegrees2", "angleDistance", "mod", "getAnglesDistance", "percentToAngle", "percent", "endAngleDeg", "circleStartAngle", "vSum", "vector1", "vector2", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2Sum", "v3Sum", "vSub", "v2Sub", "v3Sub", "vMulScalar", "v", "scalar", "v2MulScalar", "v2", "v3MulScalar", "v3", "vDivideScalar", "v2DivideScalar", "v3DivideScalar", "vLength", "sum", "v2Length", "v3Length", "v2SetLength", "newLength", "angle", "getV2Angle", "vDistance", "diff", "v2Distance", "v3Distance", "vNormalize", "length", "unitVector", "v2Normalize", "v3Normalize", "vDotProduct", "v2DotProduct", "v3DotProduct", "v3CrossProduct", "defaultValue", "v4", "vN", "N", "v2FromPolarCoords", "distance", "angleRad", "setV2Angle", "vEqual", "v2GetNormal", "sub", "matrix_exports", "__export", "identity2", "identity3", "identity4", "identityN", "isSingularMatrix", "m2Adjugate", "m2AppendRow", "m2DeepCopy", "m2Determinant", "m2DivideScalar", "m2Inverse", "m2MulScalar", "m2PrependRow", "m2Reset", "m2Sub", "m2Sum", "m2Transpose", "m2x2", "m3Adjugate", "m3AppendRow", "m3DeepCopy", "m3Determinant", "m3DivideScalar", "m3Inverse", "m3MulScalar", "m3PrependRow", "m3Reset", "m3Sub", "m3Sum", "m3Transpose", "m3x3", "m4x4", "mAdjugate", "mAppendCol", "mAppendRow", "mDeepCopy", "mDelFirstColumn", "mDelFirstRow", "mDelLastColumn", "mDelLastRow", "mDeterminant", "mDivideScalar", "mEqual", "mGetColumn", "mGetFirstColumn", "mGetLastColumn", "mInverse", "mMinor", "mMul", "mMulScalar", "mMulVector", "mNxM", "mPrependCol", "mPrependRow", "mReset", "mSub", "mSum", "mTranspose", "mSum", "matrix1", "matrix2", "decimalPlaces", "matrix", "i", "vSum", "m2Sum", "m3Sum", "mSub", "vSub", "m2Sub", "m3Sub", "mMulScalar", "m", "scalar", "v", "vMulScalar", "m2MulScalar", "m2", "m3MulScalar", "m3", "mDivideScalar", "vDivideScalar", "m2DivideScalar", "m3DivideScalar", "mTranspose", "vectorsCount", "vectorLength", "j", "m2Transpose", "m3Transpose", "mReset", "defaultValue", "res", "size", "vector", "m2Reset", "m3Reset", "m2x2", "m3x3", "m4x4", "mNxM", "N", "M", "vN", "identity2", "identity3", "identity4", "identityN", "mDeepCopy", "m2DeepCopy", "m3DeepCopy", "mAppendCol", "col", "copy", "mPrependCol", "mAppendRow", "row", "m2AppendRow", "m3AppendRow", "mPrependRow", "m2PrependRow", "m3PrependRow", "mDelLastRow", "mDelFirstRow", "mDelLastColumn", "mDelFirstColumn", "mGetFirstColumn", "mGetLastColumn", "mGetColumn", "colIndex", "mMul", "transposed", "vector1", "vector2", "product", "vDotProduct", "mMulVector", "mEqual", "vEqual", "mMinorHelper", "mMinor", "mDeterminant", "m2Determinant", "d", "minor", "param", "m3Determinant", "m2Adjugate", "m3Adjugate", "mAdjugate", "cofactors", "sign", "isSingularMatrix", "m2Inverse", "adj", "m3Inverse", "mInverse", "matrix_transformations_exports", "__export", "m2ReflectionOrigin", "m2ReflectionOriginH", "m2ReflectionX", "m2ReflectionXH", "m2ReflectionY", "m2ReflectionYH", "m2ReflectionYmX", "m2RotateAroundPointH", "m2Rotation", "m2RotationAroundPointH", "m2RotationH", "m2Scale", "m2ScaleAtPointH", "m2ScaleAtPointHMatrix", "m2ScaleH", "m2ScaleX", "m2ScaleXH", "m2ScaleY", "m2ScaleYH", "m2ShearingX", "m2ShearingY", "m2ToCSS", "m2Translation", "m2TranslationH", "m2hToCSS", "m2hToCSS3d", "m3ReflectionOrigin", "m3ReflectionOriginH", "m3ReflectionXY", "m3ReflectionXYH", "m3ReflectionXZ", "m3ReflectionXZH", "m3ReflectionYZ", "m3ReflectionYZH", "m3RotationX", "m3RotationXH", "m3RotationY", "m3RotationYH", "m3RotationZ", "m3RotationZH", "m3Scale", "m3ScaleH", "m3ScaleX", "m3ScaleXH", "m3ScaleY", "m3ScaleYH", "m3ScaleZ", "m3ScaleZH", "m3Translation", "m3TranslationH", "m3hToCSS3d", "v2Rotate", "v2RotateH", "v2Scale", "v3RotateX", "v3RotateY", "v3RotateZ", "v3Scale", "m2ToCSS", "m", "a", "b", "c", "d", "m2hToCSS", "tx", "ty", "m2hToCSS3d", "m3hToCSS3d", "m2Translation", "position", "decimalPlaces", "setDecimalPlaces", "m3Translation", "m2TranslationH", "m3TranslationH", "m2Rotation", "angleRad", "isClockwise", "cos", "sin", "m2RotationH", "m2RotationAroundPointH", "transformOrigin", "translation", "rotation", "translationBack", "v3MulScalar", "temp1", "mMul", "m2RotateAroundPointH", "mat3h", "mMulVector", "v2Rotate", "vector", "unitVector", "v2Normalize", "v2RotateH", "v3Normalize", "m3RotationX", "m3RotationXH", "v3RotateX", "m3RotationY", "m3RotationYH", "v3RotateY", "m3RotationZ", "m3RotationZH", "v3RotateZ", "m2ScaleAtPointHMatrix", "scaleVector", "scale", "m2ScaleH", "m2ScaleAtPointH", "point", "m2Scale", "v2Scale", "m3Scale", "m3ScaleH", "v3Scale", "m2ScaleX", "m2ScaleXH", "m3ScaleX", "m3ScaleXH", "m3ScaleY", "m3ScaleYH", "m3ScaleZ", "m3ScaleZH", "m2ScaleY", "m2ScaleYH", "m2ReflectionOrigin", "m2ReflectionOriginH", "m3ReflectionOrigin", "m3ReflectionOriginH", "m2ReflectionYmX", "m2ReflectionX", "m2ReflectionXH", "m2ReflectionY", "m2ReflectionYH", "m3ReflectionYZ", "m3ReflectionYZH", "m3ReflectionXZ", "m3ReflectionXZH", "m3ReflectionXY", "m3ReflectionXYH", "m2ShearingY", "factor", "m2ShearingX", "random_exports", "__export", "getRandom", "getRandomBoolean", "getRandomInt", "getRandomItemFromArray", "getRandom", "min", "max", "decimalPlaces", "setDecimalPlaces", "getRandomInt", "getRandomBoolean", "getRandomItemFromArray", "array", "randomIndex", "convert_exports", "__export", "stringToNumber", "value", "defaultNumber", "_a", "res", "bezier_curve_exports", "__export", "v2CubicBezierBBox", "v2CubicBezierCurve", "v2CubicBezierCurveExtrema", "v2CubicBezierCurveNormal", "v2CubicBezierCurveTangent", "v2QuadraticBezierBBox", "v2QuadraticBezierCurve", "v2QuadraticBezierCurveExtrema", "v2QuadraticBezierCurveNormal", "v2QuadraticBezierCurveTangent", "v3CubicBezierCurve", "v3CubicBezierCurveTangent", "v3QuadraticBezierCurve", "v3QuadraticBezierCurveTangent", "derivative_exports", "__export", "dxArcCos", "dxArcCot", "dxArcSin", "dxArcTan", "dxCos", "dxCot", "dxPolynomial", "dxSin", "dxTan", "dxV2CubicBezierCurve", "dxV2QuadraticBezierCurve", "dxV3CubicBezierCurve", "dxV3QuadraticBezierCurve", "dxPolynomial", "x", "polynomial", "decimalPlaces", "res", "part", "coeff", "power", "setDecimalPlaces", "dxV2QuadraticBezierCurve", "startControlPoint", "centerControlPoint", "endControlPoint", "temp1", "temp2", "temp3", "dxV3QuadraticBezierCurve", "dxV2CubicBezierCurve", "center1ControlPoint", "center2ControlPoint", "temp4", "dxV3CubicBezierCurve", "dxSin", "dxCos", "dxTan", "__pow", "dxCot", "dxArcSin", "dxArcCos", "dxArcTan", "dxArcCot", "linear_equations_exports", "__export", "getLinearEquationBy2Points", "linearEquation", "linearEquationSystem2", "linearEquationSystem3", "linearEquationSystemN", "linearEquation", "equation", "decimalPlaces", "a", "b", "diff", "setDecimalPlaces", "linearEquationSystem2", "equation1", "equation2", "equationParams", "inversed", "m2Inverse", "equationResults", "mMulVector", "linearEquationSystem3", "equation3", "m3Inverse", "linearEquationSystemN", "equations", "mDelLastColumn", "mInverse", "mGetLastColumn", "getLinearEquationBy2Points", "point1", "point2", "deltaX", "deltaY", "v2Sub", "x", "y", "m", "formula", "quadraticEquation", "equation", "decimalPlaces", "a", "b", "c", "d", "res", "linearEquation", "isNumber", "diff", "discriminant", "setDecimalPlaces", "t1", "t2", "v2QuadraticBezierCurve", "startControlPoint", "centerControlPoint", "endControlPoint", "decimalPlaces", "temp1", "temp2", "temp3", "setDecimalPlaces", "v3QuadraticBezierCurve", "v2CubicBezierCurve", "center1ControlPoint", "center2ControlPoint", "temp4", "v3CubicBezierCurve", "v2QuadraticBezierCurveTangent", "dxVector", "dxV2QuadraticBezierCurve", "v2Normalize", "v3QuadraticBezierCurveTangent", "dxV3QuadraticBezierCurve", "v3Normalize", "v2CubicBezierCurveTangent", "dxV2CubicBezierCurve", "v3CubicBezierCurveTangent", "dxV3CubicBezierCurve", "v2QuadraticBezierCurveNormal", "tangent", "v2CubicBezierCurveNormal", "v2QuadraticBezierCurveExtrema", "a1", "b1", "res1", "linearEquation", "a2", "b2", "res2", "res", "isNumber", "v2CubicBezierCurveExtrema", "c1", "equation1", "c2", "equation2", "quadraticEquation", "num", "v2QuadraticBezierBBox", "extrema", "minX", "minY", "maxX", "maxY", "percent", "point", "x", "y", "v2CubicBezierBBox", "path_movement_exports", "__export", "circleMovement", "circleMovementAfterMouse", "ellipseMovement", "ellipseMovementAfterMouse", "lissajousCurve", "sineWaveMovement", "circleMovement", "center", "angle", "radius", "circleMovementAfterMouse", "mouse", "vector", "v2Sub", "getV2Angle", "convertRange", "ellipseMovement", "radius1", "radius2", "ellipseMovementAfterMouse", "radii", "sineWaveMovement", "x", "amplitude", "frequency", "phase", "y", "lissajousCurve", "width", "height", "t", "k", "n", "m", "p", "color_exports", "__export", "getColorsDelta", "getRandomGrayscaleHSLColor", "getRandomHSLColor", "getRandomHSLColorWithHue", "getRandomHSLColorWithLightness", "getRandomHSLColorWithSaturation", "getRandomHSLColorWithinRanges", "getRandomHexColor", "getRandomRGBColor", "getShiftedHue", "getShiftedLightness", "getShiftedSaturation", "hexToRgb", "hslToHex", "hslToRgb", "labToRgb", "rgbToHex", "rgbToHsl", "rgbToLab", "getRandomRGBColor", "hslColor", "getRandomHSLColor", "hslToRgb", "getRandomHexColor", "hslToHex", "h", "getRandom", "s", "l", "getRandomHSLColorWithHue", "getRandomHSLColorWithSaturation", "getRandomHSLColorWithLightness", "getRandomGrayscaleHSLColor", "getRandomHSLColorWithinRanges", "hueStart", "hueEnd", "saturationStart", "saturationEnd", "lightStart", "lightEnd", "convertHueToDegrees", "getHue", "r", "g", "b", "min", "max", "diff", "getLuminance", "getSaturation", "rgbToHsl", "rgb", "decimalPlaces", "setDecimalPlaces", "hslToRgbHelper", "helper1", "helper2", "colorHelper", "hsl", "gray", "rHelper", "gHelper", "bHelper", "hue2rgb", "q", "t", "p", "toHex", "x", "hex", "rgbToHex", "hexToRgb", "shorthandRegex", "_hex", "_m", "result", "rgbToLab", "y", "z", "labToRgb", "lab", "getShiftedHue", "color", "shift", "hue", "mod", "getShiftedLightness", "lightness", "getShiftedSaturation", "saturation", "getColorsDelta", "rgbA", "rgbB", "labA", "labB", "deltaL", "deltaA", "deltaB", "c1", "c2", "deltaC", "deltaH", "sc", "sh", "deltaLKlsl", "deltaCkcsc", "deltaHkhsh", "i", "physics_exports", "id_exports", "__export", "guid", "newId", "c", "collision_detection_exports", "__export", "circleCollide", "convexPolygonsCollide", "rectCollide", "rectCollide", "rect1", "rect2", "circleCollide", "circle1", "circle2", "dx", "dy", "getEdges", "poly", "edges", "i", "nextIndex", "mod", "edge", "convexPolygonsCollide", "poly1", "poly2", "normal", "v2GetNormal", "p1Proj", "projectPolygon", "p2Proj", "polygon", "min", "max", "vertex", "projection", "v2DotProduct", "animation_exports", "__export", "animate", "props", "_duration", "startTime", "animationId", "elapsed", "previousTimeStamp", "animating", "observer", "stop", "restart", "start", "pause", "resume", "step", "timeStamp", "getResult", "observerHandler", "_entries", "_observer", "getElapsedTime", "isAnimating", "getStartTime", "getPercent", "getResizeObserver", "circle_ellipse_exports", "__export", "getCircleCircumference", "getEllipseCircumference", "getSquareInCircleSide", "isAngleInCircleArc", "getCircleCircumference", "radius", "decimalPlaces", "setDecimalPlaces", "getEllipseCircumference", "radius1", "radius2", "__pow", "isAngleInCircleArc", "startAngleDeg", "endAngleDeg", "currentDegrees", "getSquareInCircleSide", "sequence_exports", "__export", "arithmeticSequenceSum", "naturalNumbersSequenceSum", "n", "a", "d", "statistics_exports", "__export", "getArithmeticMean", "getArithmeticMeanFromFrequency", "getMedian", "getMode", "getStandardDeviation", "getVariance", "getVariance1", "getArithmeticMean", "data", "decimalPlaces", "sum", "acc", "val", "setDecimalPlaces", "getArithmeticMeanFromFrequency", "frequencyMap", "mean", "frequency", "getMedian", "copy", "num1", "num2", "mid", "getMode", "num", "maxFrequency", "modes", "getVariance1", "__pow", "getVariance", "getStandardDeviation", "_a", "variance", "ml_exports", "__export", "mlNormalizeArray", "mlNormalizeTestData", "mlNormalizeUnseenData", "mlNormalizeValue", "mlStandardizeArray", "mlStandardizeTestData", "mlStandardizeUnseenData", "mlStandardizeValue", "mlNormalizeValue", "value", "min", "max", "decimalPlaces", "diff", "setDecimalPlaces", "mlNormalizeArray", "data", "copy", "mlNormalizeTestData", "_data", "mlNormalizeUnseenData", "mlStandardizeValue", "mean", "stdDev", "mlStandardizeArray", "mlStandardizeTestData", "_a", "getArithmeticMean", "getStandardDeviation", "mlStandardizeUnseenData", "series_exports", "__export", "naturalNumbersSum1ToN", "naturalNumbersSumMToN", "n", "m", "factorial_exports", "__export", "factorial", "factorialIterative", "factorialMemoized", "factorialRecursive", "n", "start", "result", "i", "memo", "traverse", "num", "end", "_a", "table", "combinatorics_exports", "__export", "combinationsWithoutRepetition", "permutationsWithRepetition", "permutationsWithoutRepetition", "permutationsWithRepetition", "n", "__pow", "permutationsWithoutRepetition", "factorial", "combinationsWithoutRepetition", "dp", "i", "j", "api", "__spreadValues", "vector_exports", "matrix_exports", "matrix_transformations_exports", "format_exports", "angle_exports", "random_exports", "other_exports", "convert_exports", "bezier_curve_exports", "linear_equations_exports", "path_movement_exports", "color_exports", "physics_exports", "id_exports", "derivative_exports", "collision_detection_exports", "animation_exports", "circle_ellipse_exports", "sequence_exports", "statistics_exports", "ml_exports", "series_exports", "factorial_exports", "combinatorics_exports"] } diff --git a/dist/mz-math.node.cjs.map b/dist/mz-math.node.cjs.map index 3d682eb..223409b 100644 --- a/dist/mz-math.node.cjs.map +++ b/dist/mz-math.node.cjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/index-esm.ts", "../src/main/format.ts", "../src/main/other.ts", "../src/main/angle.ts", "../src/main/linear-algebra/vector.ts", "../src/main/linear-algebra/matrix.ts", "../src/main/linear-algebra/matrix-transformations.ts", "../src/main/random.ts", "../src/main/convert.ts", "../src/main/derivative.ts", "../src/main/equations/linear-equations.ts", "../src/main/equations/quadratic-equations.ts", "../src/main/bezier-curves/bezier-curve.ts", "../src/main/path-movement.ts", "../src/main/color.ts", "../src/main/id.ts", "../src/main/collision-detection.ts", "../src/main/animation.ts", "../src/main/circle-ellipse.ts", "../src/main/sequence.ts", "../src/main/statistics.ts", "../src/main/ml.ts", "../src/main/series.ts", "../src/main/combinatorics/factorial.ts", "../src/main/combinatorics/combinatorics.ts"], - "sourcesContent": ["export * from './main/linear-algebra/vector';\nexport * from './main/linear-algebra/matrix';\nexport * from './main/linear-algebra/matrix-transformations';\nexport * from './main/format';\nexport * from './main/angle';\nexport * from './main/random';\nexport * from './main/other';\nexport * from './main/convert';\nexport * from './main/bezier-curves/bezier-curve';\nexport * from './main/equations/linear-equations';\nexport * from './main/path-movement';\nexport * from './main/color';\nexport * from './main/physics';\nexport * from './main/id';\nexport * from './main/derivative';\nexport * from './main/collision-detection';\nexport * from './main/animation';\nexport * from './main/circle-ellipse';\nexport * from './main/sequence';\nexport * from './main/statistics';\nexport * from './main/ml';\nexport * from './main/series';\nexport * from './main/combinatorics/factorial';\nexport * from './main/combinatorics/combinatorics';", "export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}\n\nexport const isClockwise = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n return angle2Deg >= angle1Deg;\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const getAnglesDistance = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0, decimalPlaces = Infinity) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n if(isClockwise(angle1Deg, angle2Deg, startAngleDeg)) {\n return setDecimalPlaces((angle2Deg - angle1Deg + 360) % 360, decimalPlaces);\n }\n else{\n return setDecimalPlaces((angle1Deg - angle2Deg + 360) % 360, decimalPlaces);\n }\n};\n\nexport const percentToAngle = (percent: number, startAngleDeg: number, endAngleDeg: number, circleStartAngle = 0) => {\n if(percent < 0) {\n percent = 0;\n }\n\n if(percent > 100) {\n percent = 100;\n }\n\n const distance = getAnglesDistance(startAngleDeg, endAngleDeg, circleStartAngle);\n\n const clockwise = isClockwise(startAngleDeg, endAngleDeg, circleStartAngle);\n if(clockwise) {\n return mod(circleStartAngle + (percent * distance / 100), 360);\n }\n else {\n return mod(circleStartAngle - (percent * distance / 100), 360);\n }\n};", "import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, LABColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to degrees.\n * @param {number} h\n * @return {number} [0, 360] degrees\n */\nconst convertHueToDegrees = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n return h;\n // convert huw to %\n // return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (max === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n const diff = max - min;\n\n let h = 0;\n\n // if red is max\n if(max === r){\n h = (g - b) / diff + (g < b ? 6 : 0);\n }\n\n // if green is max\n if(max === g){\n h = 2 + (b - r) / diff;\n }\n\n // if blue is max\n if(max === b){\n h = 4 + (r - g) / diff;\n }\n\n return convertHueToDegrees(h);\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n/**\n * RGB to HEX\n * rgbToHex([235, 64, 52]) // #eb4034\n */\nexport const rgbToHex = (rgb: RGBColor) => {\n const [r, g, b] = rgb;\n return '#' + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);\n};\n\nexport const hexToRgb = (hex: string) : RGBColor | null => {\n\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const _hex = hex.replace(shorthandRegex, (_m, r, g, b) => {\n return r + r + g + g + b + b;\n });\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(_hex);\n if(!result) return null;\n\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n\n return [r, g, b];\n};\n\nexport const rgbToLab = (rgb: RGBColor, decimalPlaces = Infinity) : LABColor => {\n\n let r = rgb[0] / 255;\n let g = rgb[1] / 255;\n let b = rgb[2] / 255;\n\n r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n let x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;\n let y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;\n let z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;\n\n x = (x > 0.008856) ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;\n y = (y > 0.008856) ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;\n z = (z > 0.008856) ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;\n\n return [\n setDecimalPlaces((116 * y) - 16, decimalPlaces),\n setDecimalPlaces(500 * (x - y), decimalPlaces),\n setDecimalPlaces(200 * (y - z), decimalPlaces),\n ];\n};\n\nexport const labToRgb = (lab: LABColor, decimalPlaces = Infinity) : RGBColor => {\n let y = (lab[0] + 16) / 116;\n let x = lab[1] / 500 + y;\n let z = y - lab[2] / 200;\n\n x = 0.95047 * ((x * x * x > 0.008856) ? x * x * x : (x - 16/116) / 7.787);\n y = 1.00000 * ((y * y * y > 0.008856) ? y * y * y : (y - 16/116) / 7.787);\n z = 1.08883 * ((z * z * z > 0.008856) ? z * z * z : (z - 16/116) / 7.787);\n\n let r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n let g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n let b = x * 0.0557 + y * -0.2040 + z * 1.0570;\n\n r = (r > 0.0031308) ? (1.055 * Math.pow(r, 1/2.4) - 0.055) : 12.92 * r;\n g = (g > 0.0031308) ? (1.055 * Math.pow(g, 1/2.4) - 0.055) : 12.92 * g;\n b = (b > 0.0031308) ? (1.055 * Math.pow(b, 1/2.4) - 0.055) : 12.92 * b;\n\n return [\n setDecimalPlaces(Math.max(0, Math.min(1, r)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, g)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, b)) * 255, decimalPlaces),\n ];\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n\n// ----------------------- SIMILAR COLORS --------------------------------------\n\n/**\n * Measure the perceptual difference between two RGB colors using the CIE76 color difference formula:\n * delta = Math.sqrt((L2 - L1)^2 + (a2 - a1)^2 + (b2 - b1)^2)\n * https://en.wikipedia.org/wiki/Color_difference\n * https://stackoverflow.com/questions/13586999/color-difference-similarity-between-two-values-with-js\n * <= 1.0 Not perceptible by human eyes.\n * 1 - 2 Perceptible through close observation.\n * 2 - 10 Perceptible at a glance.\n * 11 - 49 Colors are more similar than opposite\n * 100 Colors are exact opposite\n */\nexport const getColorsDelta = (rgbA: RGBColor, rgbB: RGBColor, decimalPlaces = Infinity) => {\n const labA = rgbToLab(rgbA, decimalPlaces);\n const labB = rgbToLab(rgbB, decimalPlaces);\n\n // differences between the LAB components of the two colors\n const deltaL = labA[0] - labB[0];\n const deltaA = labA[1] - labB[1];\n const deltaB = labA[2] - labB[2];\n\n // chroma components\n const c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);\n const c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);\n const deltaC = c1 - c2;\n\n // difference in hue, deltaH, which takes into account both the differences\n // in the a* and b* components of LAB and the differences in chroma.\n let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n\n // It applies weighting factors to the differences in lightness (deltaL),\n // chroma (deltaC), and hue (deltaH).\n const deltaLKlsl = deltaL / (1.0);\n const deltaCkcsc = deltaC / (sc);\n const deltaHkhsh = deltaH / (sh);\n\n // It computes the final color difference using the CIE76 formula:\n // deltaE = sqrt(deltaLKlsl^2 + deltaCkcsc^2 + deltaHkhsh^2),\n // where deltaLKlsl is the weighted lightness difference,\n // deltaCkcsc is the weighted chroma difference,\n // and deltaHkhsh is the weighted hue difference.\n const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n\n // It returns the calculated color difference,\n // optionally rounded to the specified number of decimal places.\n return i < 0 ? 0 : Math.sqrt(i);\n};\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces } from './format';\n\nexport const getCircleCircumference = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * radius, decimalPlaces);\n};\n\nexport const getEllipseCircumference = (radius1: number, radius2: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * Math.sqrt((radius1 ** 2 + radius2 ** 2) / 2), decimalPlaces);\n};\n\nexport const isAngleInCircleArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "/**\n * 1 + 2 + ... + n = n * (n + 1) / 2\n */\nexport const naturalNumbersSequenceSum = (n: number) => {\n return n * (n + 1) / 2;\n};\n\n/**\n * n = the number of terms to be added\n * a = the first term in the sequence\n * d = the constant value between terms\n */\nexport const arithmeticSequenceSum = (n: number, a: number, d: number) => {\n return (n / 2) * (2 * a + (n - 1) * d);\n};", "import { setDecimalPlaces } from './format';\n\n// -------------------- CENTRAL TENDENCY ----------------------------\n\n/**\n * Central tendency: Calculate the Average (mean = \u03BC)\n * Sum of all numbers divided by the array length.\n */\nexport const getArithmeticMean = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const sum = data.reduce((acc, val) => acc + val, 0);\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Frequency map: number ---> it's frequency\n */\nexport const getArithmeticMeanFromFrequency = (frequencyMap: Map, decimalPlaces = Infinity) => {\n\n let mean = 0;\n\n for(const [val, frequency] of frequencyMap) {\n mean += val * frequency;\n }\n\n return setDecimalPlaces(mean, decimalPlaces);\n};\n\n/**\n * Central tendency: What is the central number in the sorted array?\n * Good for lists like [3, 3, 3, 3, 3, 3, 100] - 100 here is called \"Outlier\"\n */\nexport const getMedian = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const copy = [...data].sort((num1, num2) => num1 - num2);\n const mid = Math.floor(copy.length / 2);\n\n if(copy.length % 2 === 0) {\n return setDecimalPlaces((copy[mid] + copy[mid - 1]) / 2, decimalPlaces);\n }\n else {\n return setDecimalPlaces(copy[mid], decimalPlaces);\n }\n};\n\n/**\n * Central tendency: What number is most common in the set.\n * If all numbers have the same frequency, there is no mode.\n */\nexport const getMode = (data: number[]) : number[]|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n // Count frequency of each number in the data array.\n const frequencyMap: Map = new Map();\n for (const num of data) {\n frequencyMap.set(num, (frequencyMap.get(num) || 0) + 1);\n }\n\n let maxFrequency = 0;\n let modes: number[] = [];\n\n // Find the maximum frequency\n for (const [num, frequency] of frequencyMap) {\n if (frequency > maxFrequency) {\n maxFrequency = frequency;\n modes = [num];\n }\n else if (frequency === maxFrequency) {\n modes.push(num);\n }\n }\n\n // If all numbers have the same frequency, there is no mode\n if (modes.length === data.length) {\n return undefined;\n }\n\n // Return the mode(s)\n return modes.length === 1 ? [modes[0]] : modes;\n};\n\n/*\nTODO:\n- geometric mean\n- harmonic mean\n */\n\n// -------------------- DISPERSION ----------------------------\n\n/**\n * Dispersion: the average square distance from the mean.\n * Sum of (x - mean)^2 / N\n */\nexport const getVariance1 = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + ((val - mean) ** 2), 0);\n\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Another formula of dispersion - the average square distance from the mean.\n * (Sum of x^2) / N - (mean ^ 2)\n */\nexport const getVariance = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + (val ** 2), 0);\n\n return setDecimalPlaces((sum / data.length) - (mean ** 2), decimalPlaces);\n};\n\n/**\n * \u03C3\n */\nexport const getStandardDeviation = (data: number[], decimalPlaces = Infinity) => {\n const variance = getVariance(data) ?? 0;\n return setDecimalPlaces(Math.sqrt(variance), decimalPlaces);\n};", "import { setDecimalPlaces } from './format';\nimport { getArithmeticMean, getStandardDeviation } from './statistics';\nimport { IMlNormalizeResult, IMlStandardizeResult } from '../types';\n\n// --------------------- NORMALIZE --------------------------------\n\n/**\n * Changes value to be in the range [0, 1].\n */\nexport const mlNormalizeValue = (value: number, min: number, max: number, decimalPlaces = Infinity) : number => {\n const diff = max - min;\n if(diff === 0) return 0;\n return setDecimalPlaces((value - min) / diff, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [0, 1].\n */\nexport const mlNormalizeArray = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n const copy = [...data];\n\n for(let i=0; i {\n const min = Math.min(...data);\n const max = Math.max(...data);\n const _data = mlNormalizeArray(data, min, max, decimalPlaces);\n\n return {\n min: setDecimalPlaces(min, decimalPlaces),\n max: setDecimalPlaces(max, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlNormalizeUnseenData = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n return mlNormalizeArray(data, min, max, decimalPlaces);\n};\n\n// --------------------- STANDARDIZE --------------------------------\n\n/**\n * Changes value to be in the range [-1, 1].\n */\nexport const mlStandardizeValue = (value: number, mean: number, stdDev: number, decimalPlaces = Infinity) : number => {\n if(stdDev === 0) return 0;\n return setDecimalPlaces((value - mean) / stdDev, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [-1, 1].\n */\nexport const mlStandardizeArray = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity) : number[] => {\n return [...data].map(value => mlStandardizeValue(value, mean, stdDev, decimalPlaces));\n};\n\nexport const mlStandardizeTestData = (data: number[], decimalPlaces = Infinity): IMlStandardizeResult => {\n const mean = getArithmeticMean(data) ?? 0;\n const stdDev = getStandardDeviation(data);\n const _data = mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n\n return {\n mean: setDecimalPlaces(mean, decimalPlaces),\n stdDev: setDecimalPlaces(stdDev, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlStandardizeUnseenData = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity): number[] => {\n return mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n};", "/**\n * Sum of 1 to n numbers:\n * (n * (n + 1)) / 2\n */\nexport const naturalNumbersSum1ToN = (n: number): number => {\n return (n / 2) * (n + 1);\n};\n\n/**\n * Sum of m to n numbers.\n */\nexport const naturalNumbersSumMToN = (m: number, n: number): number => {\n return (n - m + 1) * (m + n) / 2;\n};", "/**\n * The simplest and straightforward method\n * but can become inefficient for extremely large numbers\n * due to growing computational time.\n */\nexport const factorialIterative = (n: number, start = 0): number => {\n\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n let result = 1;\n for (let i = start; i <= n; i++) {\n result *= i;\n }\n return result;\n};\n\n/**\n * A recursive approach is a classic method for calculating factorials\n * but can lead to stack overflow errors\n * for very large inputs because of deep recursion.\n * However, it's a direct translation\n * of the mathematical definition of factorial.\n */\nexport const factorialRecursive = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n // Base case: when n reaches start, return start instead of further reducing\n if (n === start) return start;\n\n // Recursive call\n return n * factorialRecursive(n - 1, start);\n};\n\n/**\n * Memoization (Top-Down Dynamic Programming).\n */\nexport const factorialMemoized = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n const memo = new Map();\n\n const traverse = (num: number, end: number): number => {\n if (num < end) return 1; // Adjust the base case to return 1 if we're below 'end'\n // if (num === 0) return 1;\n\n if (memo.has(num)) return memo.get(num) ?? 1;\n\n if (num === end) {\n memo.set(num, num);\n return num;\n }\n\n const result = num * traverse(num - 1, end);\n\n memo.set(num, result);\n\n return result;\n };\n\n return traverse(n, start);\n};\n\n/**\n * Tabulation (Bottom-Up Dynamic Programming).\n */\nexport const factorial = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === n) {\n return n === 0 ? 1 : n; // If start == n and n == 0, return 1 (0!), otherwise return n\n }\n\n if (start === 0) {\n start = 1;\n }\n\n const table = []; // new Array(n + 1);\n table[0] = 1;\n for (let i = 1; i <= n; i++) {\n table[i] = table[i - 1] * i;\n }\n return table[n] / table[start - 1];\n};", "import { factorial } from './factorial';\n\n/**\n * Permutations with repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - repetition is allowed\n *\n * Formula:\n * --------\n * n^r\n *\n * Intuition:\n * ----------\n * In other words, there are n possibilities for the first choice,\n * THEN there are n possibilities for the second choice, and so on,\n * multiplying each time.\n *\n * A Permutation is an ordered Combination.\n *\n * Example:\n * --------\n * Such as a lock that could be \"333\".\n */\nexport const permutationsWithRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return n ** r;\n};\n\n/**\n * Permutations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - no repetitions\n *\n * Formula:\n * --------\n * P(n,r) = n! / (n \u2212 r)!\n *\n * Intuition:\n * ----------\n * In this case, we have to reduce the number of available choices each time.\n * After choosing, say, number \"14\" we can't choose it again.\n * So, our first choice has 16 possibilities, and our next choice has 15 possibilities,\n * then 14, 13, 12, 11, ... etc.\n *\n * A Permutation is an ordered Combination.\n */\nexport const permutationsWithoutRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return factorial(n, n - r + 1);\n};\n\n/**\n * Order doesn't matter.\n *\n * Example:\n * --------\n * Coins in your pocket (5, 5, 5, 10, 10).\n\nexport const combinationsWithRepetition = () => {\n\n};\n */\n\n/**\n * Combinations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order doesn't matter\n * - no repetitions\n *\n * And is also known as the Binomial Coefficient.\n *\n * Formula:\n * --------\n * C(n, r) = C(n, n - r) = n! / (r! * (n\u2212r)!)\n *\n * Example:\n * --------\n * Such as lottery numbers (2, 14, 15, 27, 30, 33).\n */\nexport const combinationsWithoutRepetition = (n: number, r: number) : number => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n // Initialize a two-dimensional array (or matrix) [n + 1, r + 1].\n // The reason for n + 1 is to ensure that we can access indices directly equal to the value of n\n // without running out of bounds, as array indices start at 0.\n const dp = Array.from({ length: n + 1 }, () => Array(r + 1).fill(0));\n /*\n const dp: number[][] = [];\n for(let i=0; i<=n; i++) {\n dp[i] = [];\n for(let j=0; j<=r; j++) {\n dp[i][j] = 0;\n }\n }*/\n\n // Base cases: C(n, 0) = 1 and C(n, n) = 1 for any n.\n for (let i = 0; i <= n; i++) {\n dp[i][0] = 1;\n if (i <= r) {\n // Only fill this if i <= r to avoid filling non-existent cells\n dp[i][i] = 1;\n }\n }\n\n // Fill the table using the relation C(n, r) = C(n-1, r-1) + C(n-1, r)\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= Math.min(i, r); j++) { // Only compute up to the minimum of i and r\n dp[i][j] = dp[i-1][j-1] + dp[i-1][j];\n }\n }\n\n return dp[n][r];\n};\n\n"], - "mappings": "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", + "sourcesContent": ["export * from './main/linear-algebra/vector';\nexport * from './main/linear-algebra/matrix';\nexport * from './main/linear-algebra/matrix-transformations';\nexport * from './main/format';\nexport * from './main/angle';\nexport * from './main/random';\nexport * from './main/other';\nexport * from './main/convert';\nexport * from './main/bezier-curves/bezier-curve';\nexport * from './main/equations/linear-equations';\nexport * from './main/path-movement';\nexport * from './main/color';\nexport * from './main/physics';\nexport * from './main/id';\nexport * from './main/derivative';\nexport * from './main/collision-detection';\nexport * from './main/animation';\nexport * from './main/circle-ellipse';\nexport * from './main/sequence';\nexport * from './main/statistics';\nexport * from './main/ml';\nexport * from './main/series';\nexport * from './main/combinatorics/factorial';\nexport * from './main/combinatorics/combinatorics';", "export const setDecimalPlaces = (num: number, decimalPlaces: number | undefined = Infinity) => {\n if(decimalPlaces === Infinity) return num;\n\n if(decimalPlaces < 0){\n decimalPlaces = 0;\n }\n\n const coefficient = 10 ** decimalPlaces;\n return Math.round(num * coefficient) / coefficient;\n};", "import { Vector2 } from '../types';\nimport { setDecimalPlaces } from './format';\n\nexport const mod = (n: number, m: number) => {\n return ((n % m) + m) % m;\n};\n\n/**\n * Convert range [a, b] to [c, d].\n * f(x) = (d - c) * (x - a) / (b - a) + c\n */\nexport const convertRange = (x: number, a: number, b: number, c: number, d: number) => {\n return (d - c) * (x - a) / (b - a) + c;\n};\n\n/**\n * Check if 2 ranges [a,b] and [c,d] overlap.\n */\nexport const doRangesOverlap = (a: number, b: number, c: number, d: number) => {\n return Math.max(a, c) <= Math.min(b, d) ;\n};\n\n// eslint-disable-next-line\nexport const isNumber = (value: any) => {\n return !isNaN(parseFloat(value)) && isFinite(value);\n};\n\n/**\n * Convert polar coordinates to cartesian coordinates.\n */\nexport const polarToCartesian = (center: Vector2, radii: Vector2, angleInRad: number, decimalPlaces = Infinity) : Vector2 => {\n const [cx, cy] = center;\n const [rx, ry] = radii;\n\n return [\n setDecimalPlaces(cx + (rx * Math.cos(angleInRad)), decimalPlaces),\n setDecimalPlaces(cy + (ry * Math.sin(angleInRad)), decimalPlaces),\n ];\n};", "import { Vector, Vector2, Vector3 } from '../types';\nimport { setDecimalPlaces } from './format';\nimport { v2Length, vNormalize, vDotProduct, vSub } from './linear-algebra/vector';\nimport { mod } from './other';\n\nexport const getV2Angle = (v2: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1], v2[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleInEllipse = (v2: Vector2, radii: Vector2, decimalPlaces = Infinity) => {\n const angle = Math.atan2(v2[1]/radii[1], v2[0]/radii[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const setV2Angle = (v2: Vector2, newAngleRad: number, decimalPlaces = Infinity): Vector2 => {\n const length = v2Length(v2);\n return [\n setDecimalPlaces(Math.cos(newAngleRad) * length, decimalPlaces),\n setDecimalPlaces(Math.sin(newAngleRad) * length, decimalPlaces),\n ];\n};\n\nexport const radiansToDegrees = (radians: number, decimalPlaces = Infinity) => {\n const res = radians * (180 / Math.PI);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\nexport const degreesToRadians = (degrees: number, decimalPlaces = Infinity) => {\n const res = degrees * (Math.PI / 180);\n return setDecimalPlaces(res, decimalPlaces);\n};\n\n/**\n * Returns the range [0, Math.PI]\n * A = Math.acos( dot(v1, v2)/(v1.length()*v2.length()) );\n */\nexport const getVNAngleBetween = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n const unitVector1 = vNormalize(vector1);\n const unitVector2 = vNormalize(vector2);\n const dotProduct = vDotProduct(unitVector1, unitVector2);\n const angle = Math.acos(dotProduct);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV2AngleBetween = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) : number => {\n // return getVNAngleBetween(vector1, vector2, decimalPlaces);\n const diff = vSub(vector1, vector2);\n const angle = Math.atan2(diff[1], diff[0]);\n return setDecimalPlaces(angle, decimalPlaces);\n};\n\nexport const getV3AngleBetween = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return getVNAngleBetween(vector1, vector2, decimalPlaces);\n};\n\nexport const isAngleBetween = (angleDegrees: number, startAngleDegrees: number, endAngleDegrees: number) : boolean => {\n const distance = getAnglesSub(startAngleDegrees, endAngleDegrees);\n const distance1 = getAnglesSub(startAngleDegrees, angleDegrees);\n const distance2 = getAnglesSub(endAngleDegrees, angleDegrees);\n const totalDistance = distance1 + distance2;\n\n // Use a small threshold for floating point errors\n return Math.abs(totalDistance - distance) <= 0.001;\n}\n\nexport const isClockwise = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n return angle2Deg >= angle1Deg;\n};\n\n/**\n * Shortest distance (angular) between two angles.\n */\nexport const getAnglesSub = (angleDegrees1: number, angleDegrees2: number, decimalPlaces = Infinity) : number => {\n const angleDistance = Math.abs(mod(angleDegrees1, 360) - mod(angleDegrees2, 360));\n return setDecimalPlaces(angleDistance <= 180 ? angleDistance : 360 - angleDistance, decimalPlaces);\n};\n\nexport const getAnglesDistance = (angle1Deg: number, angle2Deg: number, startAngleDeg = 0, decimalPlaces = Infinity) => {\n angle1Deg = angle1Deg % 360;\n angle2Deg = angle2Deg % 360;\n\n if(angle1Deg < startAngleDeg) {\n angle1Deg += 360;\n }\n\n if(angle2Deg < startAngleDeg) {\n angle2Deg += 360;\n }\n\n if(isClockwise(angle1Deg, angle2Deg, startAngleDeg)) {\n return setDecimalPlaces((angle2Deg - angle1Deg + 360) % 360, decimalPlaces);\n }\n else{\n return setDecimalPlaces((angle1Deg - angle2Deg + 360) % 360, decimalPlaces);\n }\n};\n\nexport const percentToAngle = (percent: number, startAngleDeg: number, endAngleDeg: number, circleStartAngle = 0) => {\n if(percent < 0) {\n percent = 0;\n }\n\n if(percent > 100) {\n percent = 100;\n }\n\n const distance = getAnglesDistance(startAngleDeg, endAngleDeg, circleStartAngle);\n\n const clockwise = isClockwise(startAngleDeg, endAngleDeg, circleStartAngle);\n if(clockwise) {\n return mod(circleStartAngle + (percent * distance / 100), 360);\n }\n else {\n return mod(circleStartAngle - (percent * distance / 100), 360);\n }\n};", "import { Vector, Vector2, Vector3, Vector4 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { getV2Angle, setV2Angle } from '../angle';\n\n// ------------ SUM ------------------------\n\nexport const vSum = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSum(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sum = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSum(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ SUB ------------------------\n\nexport const vSub = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : Vector => {\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vSub(vector1, vector2, decimalPlaces) as Vector2;\n};\n\nexport const v3Sub = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vSub(vector1, vector2, decimalPlaces) as Vector3;\n};\n\n// ------------ MUL SCALAR ------------------------\n\nexport const vMulScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n const vector: Vector = [];\n\n for(let i=0; i {\n return vMulScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3MulScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vMulScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ DIVIDE ------------------------\n\nexport const vDivideScalar = (v: Vector, scalar: number, decimalPlaces = Infinity): Vector => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const vector: Vector = [];\n\n for(let i=0; i {\n return vDivideScalar(v2, scalar, decimalPlaces) as Vector2;\n};\n\nexport const v3DivideScalar = (v3: Vector3, scalar: number, decimalPlaces = Infinity): Vector3 => {\n return vDivideScalar(v3, scalar, decimalPlaces) as Vector3;\n};\n\n// ------------ LENGTH ------------------------\n\nexport const vLength = (vector: Vector, decimalPlaces = Infinity) => {\n let sum = 0;\n\n for(let i=0; i {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v3Length = (vector: Vector3, decimalPlaces = Infinity) => {\n return vLength(vector, decimalPlaces);\n};\n\nexport const v2SetLength = (v2: Vector2, newLength: number, decimalPlaces = Infinity): Vector2 => {\n const angle = getV2Angle(v2);\n return [\n setDecimalPlaces(Math.cos(angle) * newLength, decimalPlaces),\n setDecimalPlaces(Math.sin(angle) * newLength, decimalPlaces),\n ];\n};\n\n// ----------- DISTANCE ------------------------\n\nexport const vDistance = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v2Distance = (vector1: Vector2, vector2: Vector2, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\nexport const v3Distance = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) => {\n const diff = vSub(vector1, vector2);\n return vLength(diff, decimalPlaces);\n};\n\n// ------------ NORMALIZE ------------------------\n\n/**\n * Normalization creates a unit vector, which is a vector of length 1.\n */\nexport const vNormalize = (v: Vector, decimalPlaces = Infinity) : Vector => {\n const length = vLength(v);\n const unitVector: Vector = [];\n\n for(let i=0; i {\n return vNormalize(v2, decimalPlaces) as Vector2;\n};\n\nexport const v3Normalize = (v3: Vector3, decimalPlaces = Infinity) : Vector3 => {\n return vNormalize(v3, decimalPlaces) as Vector3;\n};\n\n// ------------ DOT PRODUCT ------------------------\n\nexport const vDotProduct = (vector1: Vector, vector2: Vector, decimalPlaces = Infinity) : number => {\n let sum = 0;\n\n for(let i=0; i {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\nexport const v3DotProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity) : number => {\n return vDotProduct(vector1, vector2, decimalPlaces);\n};\n\n// ------------ CROSS PRODUCT ------------------------\n\n/**\n * Cross product is possible on 3D vectors only.\n * The cross product a \u00D7 b is defined as a vector c that is perpendicular (orthogonal) to both a and b.\n */\nexport const v3CrossProduct = (vector1: Vector3, vector2: Vector3, decimalPlaces = Infinity): Vector3 => {\n return [\n setDecimalPlaces(vector1[1] * vector2[2] - vector1[2] * vector2[1], decimalPlaces),\n setDecimalPlaces(vector1[2] * vector2[0] - vector1[0] * vector2[2], decimalPlaces),\n setDecimalPlaces(vector1[0] * vector2[1] - vector1[1] * vector2[0], decimalPlaces),\n ];\n};\n\n// --------------- INIT VECTOR HELPER -----------------\n\nexport const v2 = (defaultValue = 0): Vector2 => {\n return [defaultValue, defaultValue];\n};\n\nexport const v3 = (defaultValue = 0): Vector3 => {\n return [defaultValue, defaultValue, defaultValue];\n};\n\nexport const v4 = (defaultValue = 0): Vector4 => {\n return [defaultValue, defaultValue, defaultValue, defaultValue];\n};\n\nexport const vN = (N: number, defaultValue = 0): Vector => {\n\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n const vector: Vector = [];\n for(let i=0; i {\n let vector: Vector2 = [0, 0];\n vector = v2SetLength(vector, distance);\n return setV2Angle(vector, angleRad);\n};\n\n// --------------- EQUALITY -------------------------\n\nexport const vEqual = (vector1: Vector, vector2: Vector): boolean => {\n if(vector1.length !== vector2.length) return false;\n\n for(let i=0; i {\n const sub = v2Sub(vector2, vector1);\n return [\n -setDecimalPlaces(sub[1], decimalPlaces),\n setDecimalPlaces(sub[0], decimalPlaces)\n ];\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector, Vector2, Vector3 } from '../../types';\nimport { vMulScalar, vSum, vSub, vDotProduct, vN, vEqual, vDivideScalar } from './vector';\n\n// --------------- SUM ----------------------\n\nexport const mSum = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sum = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSum(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- SUB ----------------------\n\nexport const mSub = (matrix1: Matrix, matrix2: Matrix, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix2;\n};\n\nexport const m3Sub = (matrix1: Matrix3, matrix2: Matrix3, decimalPlaces = Infinity): Matrix3 => {\n return mSub(matrix1, matrix2, decimalPlaces) as Matrix3;\n};\n\n// --------------- MUL SCALAR ----------------------\n\nexport const mMulScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vMulScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2MulScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mMulScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3MulScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mMulScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n// --------------- DIVIDE SCALAR ----------------------\n\nexport const mDivideScalar = (m: Matrix, scalar: number, decimalPlaces = Infinity): Matrix => {\n if(scalar === 0){\n throw new Error('Division by zero error.');\n }\n\n const matrix: Matrix = [];\n\n for(const v of m){\n matrix.push(vDivideScalar(v, scalar, decimalPlaces));\n }\n\n return matrix;\n};\n\nexport const m2DivideScalar = (m2: Matrix2, scalar: number, decimalPlaces = Infinity): Matrix2 => {\n return mDivideScalar(m2, scalar, decimalPlaces) as Matrix2;\n};\n\nexport const m3DivideScalar = (m3: Matrix3, scalar: number, decimalPlaces = Infinity): Matrix3 => {\n return mDivideScalar(m3, scalar, decimalPlaces) as Matrix3;\n};\n\n\n// --------------- TRANSPOSE ----------------------\n\nexport const mTranspose = (m: Matrix): Matrix => {\n\n const vectorsCount = m.length;\n if(vectorsCount <= 0) return m;\n\n const vectorLength = m[0].length;\n if(vectorLength <= 0) return m;\n\n const matrix: Matrix = [];\n for(let i=0; i {\n return mTranspose(m2);\n};\n\nexport const m3Transpose = (m3: Matrix3): Matrix => {\n return mTranspose(m3);\n};\n\n// ----------------- RESET ----------------------\n\nexport const mReset = (m: Matrix, defaultValue = 0): Matrix => {\n\n if(m.length <= 0) return [];\n\n const res: Matrix = [];\n\n for(let i=0; i {\n return mReset(m2, defaultValue) as Matrix2;\n};\n\nexport const m3Reset = (m3: Matrix3, defaultValue = 0): Matrix3 => {\n return mReset(m3, defaultValue) as Matrix3;\n};\n\n// --------------- MATRIX INIT HELPERS -----------------\n\nexport const m2x2 = (defaultValue = 0): Matrix2 => {\n return [\n [defaultValue, defaultValue],\n [defaultValue, defaultValue],\n ];\n};\n\nexport const m3x3 = (defaultValue = 0): Matrix3 => {\n return [\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const m4x4 = (defaultValue = 0): Matrix4 => {\n return [\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n [defaultValue, defaultValue, defaultValue, defaultValue],\n ];\n};\n\nexport const mNxM = (N: number, M: number, defaultValue = 0): Matrix => {\n if(N <= 0 || M <= 0){\n throw new Error('M and N must be positive numbers.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return [\n [1, 0],\n [0, 1],\n ];\n};\n\nexport const identity3 = (): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\nexport const identity4 = (): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Identity Matrix (I).\n * M x I = I x M = M for any matrix M.\n * Identity Matrix is a special case of scale matrix.\n */\nexport const identityN = (N: number): Matrix => {\n if(N < 0){\n throw new Error('N must be a non-negative number.');\n }\n\n if(N === 0) return [];\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const matrix: Matrix = [];\n\n for(let i=0; i {\n return mDeepCopy(m2) as Matrix2;\n};\n\nexport const m3DeepCopy = (m3: Matrix3): Matrix3 => {\n return mDeepCopy(m3) as Matrix3;\n};\n\n// -------------- APPEND / PREPEND ROW OR COLUMN ---------------\n\nexport const mAppendCol = (m: Matrix, col: Vector): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n const copy = mDeepCopy(m);\n copy.push(row);\n return copy;\n};\n\nexport const m2AppendRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.push(row);\n return copy;\n};\n\nexport const m3AppendRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.push(row);\n return copy;\n};\n\nexport const mPrependRow = (m: Matrix, row: Vector) : Matrix => {\n const copy = mDeepCopy(m);\n copy.unshift(row);\n return copy;\n};\n\nexport const m2PrependRow = (m2: Matrix2, row: Vector2) : Matrix2 => {\n const copy = m2DeepCopy(m2);\n copy.unshift(row);\n return copy;\n};\n\nexport const m3PrependRow = (m3: Matrix3, row: Vector3) : Matrix3 => {\n const copy = m3DeepCopy(m3);\n copy.unshift(row);\n return copy;\n};\n\n// ------------ DELETE ROW OR COLUMN ----------------------------\n\nexport const mDelLastRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.pop();\n return copy;\n};\n\nexport const mDelFirstRow = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n copy.shift();\n return copy;\n};\n\nexport const mDelLastColumn = (m: Matrix): Matrix => {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const copy = mDeepCopy(m);\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const size = m[0].length;\n\n const vector: Vector = [];\n for(let i=0; i {\n if(m.length <= 0) return [];\n\n const vector: Vector = [];\n for(let i=0; i {\n\n const matrix: Matrix = [];\n for(let i=0; i {\n\n if(matrix.length < 0) return [];\n\n if(matrix[0].length !== vector.length){\n throw new Error('The number of columns in the matrix must be equal to the length of the vector.');\n }\n\n const res: Vector = [];\n\n for(let i=0; i {\n if(matrix1.length !== matrix2.length) return false;\n\n for(let i=0; i returns matrix N (m-1 x m-1)\n * The matrix must be square.\n */\nconst mMinorHelper = (m: Matrix, row: number, col: number) => {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const matrix: Matrix = [];\n\n for(let i=0; i {\n const size = m.length;\n\n if(size <= 0){\n throw new Error('The matrix should not be empty.');\n }\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // prepare the matrix without provided row and column\n const matrix = mMinorHelper(m, row, col);\n\n // calculate the matrix determinant\n return mDeterminant(matrix);\n};\n\n/**\n * Calculate determinant for NxN matrix.\n * Matrix should be square.\n */\nexport const mDeterminant = (matrix: Matrix): number => {\n const size = matrix.length;\n if(size === 0) return 1;\n\n if(size !== matrix[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return matrix[0][0];\n if(size === 2) return m2Determinant(matrix as Matrix2);\n\n let d = 0;\n\n for(let i=0; i {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return m2[0][0] * m2[1][1] - m2[1][0] * m2[0][1];\n};\n\n/**\n * Calculate determinant for 3x3 matrix.\n * Matrix should be square.\n */\nexport const m3Determinant = (m3: Matrix3): number => {\n if(m3.length !== m3[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return mDeterminant(m3);\n};\n\n// ------------------ INVERSE -----------------------\n\nexport const m2Adjugate = (m2: Matrix2): Matrix2|null => {\n if(m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n return [\n [m2[1][1], -m2[0][1]],\n [-m2[1][0], m2[0][0]],\n ];\n};\n\nexport const m3Adjugate = (m3: Matrix3) : Matrix3|null => {\n return mAdjugate(m3) as (Matrix3|null);\n};\n\n/**\n * Adjugate is a transpose of a cofactor matrix\n */\nexport const mAdjugate = (m: Matrix): Matrix|null => {\n\n const size = m.length;\n if(size <= 0) return null;\n\n if(size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n if(size === 1) return m;\n\n if(size === 2) return m2Adjugate(m as Matrix2);\n\n // build a cofactor matrix ----------------\n const cofactors: Matrix = [];\n\n for(let i=0; i {\n if(m.length > 0 && m.length !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = mDeterminant(m);\n return d === 0;\n};\n\n/**\n * Square matrix A (nxn) is invertible is there is another square matrix B (nxn) so AxB = BxA = I\n * For A (2x2) matrix, the inverse is:\n * (1 / (determinant(A))) * adj(A)\n */\nexport const m2Inverse = (m2: Matrix2, decimalPlaces = Infinity): (Matrix2 | null) => {\n if(m2.length > 0 && m2.length !== m2[0].length){\n throw new Error('The matrix must be square.');\n }\n\n const d = m2Determinant(m2);\n if(d === 0) return null;\n\n const adj = m2Adjugate(m2);\n if(adj === null) return null;\n\n return m2DivideScalar(adj, d, decimalPlaces);\n};\n\nexport const m3Inverse = (m3: Matrix3, decimalPlaces = Infinity): (Matrix3 | null) => {\n return mInverse(m3, decimalPlaces) as (Matrix3|null);\n};\n\nexport const mInverse = (m: Matrix, decimalPlaces = Infinity): (Matrix | null) => {\n const size = m.length;\n\n if(size > 0 && size !== m[0].length){\n throw new Error('The matrix must be square.');\n }\n\n // find a determinant ----------------------\n const d = mDeterminant(m);\n\n // find an Adjugate - a transpose of a cofactor matrix\n const adj = mAdjugate(m);\n if(adj === null) return null;\n\n return mDivideScalar(adj, d, decimalPlaces);\n};", "import { Matrix2, Matrix3, Matrix4, Matrix, Vector2, Vector3, Vector4 } from '../../types';\nimport { v2Normalize, v3MulScalar, v3Normalize } from './vector';\nimport { mMulVector, mMul } from './matrix';\nimport { setDecimalPlaces } from '../format';\n\n/*\nAny 2D affine transformation can be decomposed\ninto a rotation, followed by a scaling, followed by a\nshearing, and followed by a translation.\n---------------------------------------------------------\nAffine matrix = translation x shearing x scaling x rotation\n */\n\n// ----------------- CSS -------------------------------------\n\n/**\n * Matrix 2D in non-homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2ToCSS = (m: Matrix2) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, 0, 0)`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix\n */\nexport const m2hToCSS = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix(${ a }, ${ b }, ${ c }, ${ d }, ${ tx }, ${ ty })`;\n};\n\n/**\n * Matrix 2D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m2hToCSS3d = (m: Matrix3) : string => {\n const a = m[0][0];\n const b = m[1][0];\n const c = m[0][1];\n const d = m[1][1];\n const tx = m[0][2];\n const ty = m[1][2];\n\n return `matrix3d(${ a }, ${ b }, 0, 0, ${ c }, ${ d }, 0, 0, 0, 0, 1, 0, ${ tx }, ${ ty }, 0, 1)`;\n};\n\n/**\n * Matrix 3D in homogeneous coordinates to CSS matrix3d() function\n * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix3d\n */\nexport const m3hToCSS3d = (m: Matrix4) : string => {\n\n return `matrix3d(\n ${ m[0][0] }, ${ m[0][1] }, ${ m[0][2] }, ${ m[0][3] },\n ${ m[1][0] }, ${ m[1][1] }, ${ m[1][2] }, ${ m[1][3] },\n ${ m[2][0] }, ${ m[2][1] }, ${ m[2][2] }, ${ m[2][3] },\n ${ m[3][0] }, ${ m[3][1] }, ${ m[3][2] }, ${ m[3][3] }\n )`;\n};\n\n// ---------------- TRANSLATION MATRICES ----------------------\n\nexport const m2Translation = (position: Vector2, decimalPlaces = Infinity): Matrix2 => {\n\n return [\n [1, 0],\n [0, 1],\n [setDecimalPlaces(position[0], decimalPlaces), setDecimalPlaces(position[1], decimalPlaces)],\n ];\n};\n\nexport const m3Translation = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n [\n setDecimalPlaces(position[0], decimalPlaces),\n setDecimalPlaces(position[1], decimalPlaces),\n setDecimalPlaces(position[2], decimalPlaces)\n ],\n ];\n};\n\n/**\n * 2D Translation matrix in homogeneous coordinates.\n */\nexport const m2TranslationH = (position: Vector3, decimalPlaces = Infinity): Matrix3 => {\n\n return [\n [1, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1],\n ];\n};\n\n/**\n * 3D Translation matrix in homogeneous coordinates.\n */\nexport const m3TranslationH = (position: Vector4, decimalPlaces = Infinity): Matrix4 => {\n\n return [\n [1, 0, 0, setDecimalPlaces(position[0], decimalPlaces)],\n [0, 1, 0, setDecimalPlaces(position[1], decimalPlaces)],\n [0, 0, 1, setDecimalPlaces(position[2], decimalPlaces)],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- ROTATION MATRICES -------------------------\n\n/**\n * Rotation of an angle about the origin.\n */\nexport const m2Rotation = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix2 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin],\n [sin, cos],\n ] :\n [\n [cos, sin],\n [-sin, cos],\n ];\n};\n\n/**\n * Rotation of an angle about the origin in homogeneous coordinates (clockwise).\n */\nexport const m2RotationH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ]:\n [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation of an angle \"angleRad\" around the given point (transformOrigin) in homogeneous coordinates (clockwise).\n * result_vector = TranslationMatrix(x, y) * RotationMatrix() * TranslationMatrix(-x, -y) * position_vector\n */\nexport const m2RotationAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const rotation = m2RotationH(angleRad, isClockwise, decimalPlaces);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, rotation);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2RotateAroundPointH = (\n angleRad: number,\n transformOrigin: Vector3,\n position: Vector3,\n isClockwise = true,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2RotationAroundPointH(angleRad, transformOrigin, isClockwise, decimalPlaces);\n return mMulVector(mat3h, position) as Vector3;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2Rotate = (angleRad: number, vector: Vector2, isClockwise = true, decimalPlaces = Infinity): Vector2 => {\n const unitVector = v2Normalize(vector);\n return mMulVector(m2Rotation(angleRad, isClockwise, decimalPlaces), unitVector) as Vector2;\n};\n\n/**\n * Rotate vector around the origin by angle \"angleRad\" (clockwise).\n */\nexport const v2RotateH = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m2RotationH(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the X axis (clockwise).\n */\nexport const m3RotationX = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0],\n [0, cos, -sin],\n [0, sin, cos],\n ] :\n [\n [1, 0, 0],\n [0, cos, sin],\n [0, -sin, cos],\n ];\n};\n\n/**\n * Rotation around the X axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationXH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [1, 0, 0, 0],\n [0, cos, -sin, 0],\n [0, sin, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [1, 0, 0, 0],\n [0, cos, sin, 0],\n [0, -sin, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateX = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationX(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Y axis (clockwise).\n */\nexport const m3RotationY = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin],\n [0, 1, 0],\n [-sin, 0, cos],\n ] :\n [\n [cos, 0, -sin],\n [0, 1, 0],\n [sin, 0, cos],\n ];\n};\n\n/**\n * Rotation around the Y axis (clockwise) - in homogeneous coordinates\n */\nexport const m3RotationYH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, 0, sin, 0],\n [0, 1, 0, 0],\n [-sin, 0, cos, 0],\n [0, 0, 0, 1],\n ] :\n [\n [cos, 0, -sin, 0],\n [0, 1, 0, 0],\n [sin, 0, cos, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateY = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationY(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n/**\n * Rotation around the Z axis (clockwise).\n */\nexport const m3RotationZ = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix3 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0],\n [sin, cos, 0],\n [0, 0, 1],\n ] : [\n [cos, sin, 0],\n [-sin, cos, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Rotation around the Z axis (clockwise)- in homogeneous coordinates\n */\nexport const m3RotationZH = (angleRad: number, isClockwise = true, decimalPlaces = Infinity): Matrix4 => {\n\n const cos = setDecimalPlaces(Math.cos(angleRad), decimalPlaces);\n const sin = setDecimalPlaces(Math.sin(angleRad), decimalPlaces);\n\n return isClockwise ? [\n [cos, -sin, 0, 0],\n [sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ] : [\n [cos, sin, 0, 0],\n [-sin, cos, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\nexport const v3RotateZ = (angleRad: number, vector: Vector3, isClockwise = true, decimalPlaces = Infinity): Vector3 => {\n const unitVector = v3Normalize(vector);\n return mMulVector(m3RotationZ(angleRad, isClockwise, decimalPlaces), unitVector) as Vector3;\n};\n\n// ---------------- SCALE MATRICES -------------\n\n/**\n * Get matrix for arbitrary scaling pivot point.\n * result_vector = TranslationMatrix(x, y) * ScaleMatrix() * TranslationMatrix(-x, -y) * scale_vector\n */\nexport const m2ScaleAtPointHMatrix = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n decimalPlaces = Infinity): Matrix3 => {\n\n const translation = m2TranslationH(transformOrigin, decimalPlaces);\n const scale = m2ScaleH(scaleVector);\n const translationBack = m2TranslationH(v3MulScalar(transformOrigin, -1), decimalPlaces);\n const temp1 = mMul(translation, scale);\n return mMul(temp1, translationBack) as Matrix3;\n};\n\nexport const m2ScaleAtPointH = (\n scaleVector: Vector3,\n transformOrigin: Vector3,\n point: Vector3,\n decimalPlaces = Infinity): Vector3 => {\n\n const mat3h = m2ScaleAtPointHMatrix(scaleVector, transformOrigin, decimalPlaces);\n return mMulVector(mat3h, point) as Vector3;\n};\n\nexport const m2Scale = (scaleVector: Vector2): Matrix2 => {\n return [\n [scaleVector[0], 0],\n [0, scaleVector[1]],\n ];\n};\n\nexport const v2Scale = (scaleVector: Vector2, vector: Vector2): Vector2 => {\n return mMulVector(m2Scale(scaleVector), vector) as Vector2;\n};\n\n/**\n * homogeneous coordinates\n */\nexport const m2ScaleH = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, 1],\n ];\n};\n\nexport const m3Scale = (scaleVector: Vector3): Matrix3 => {\n return [\n [scaleVector[0], 0, 0],\n [0, scaleVector[1], 0],\n [0, 0, scaleVector[2]],\n ];\n};\n\nexport const m3ScaleH = (scaleVector: Vector4): Matrix4 => {\n return [\n [scaleVector[0], 0, 0, 0],\n [0, scaleVector[1], 0, 0],\n [0, 0, scaleVector[2], 0],\n [0, 0, 0, 1]\n ];\n};\n\nexport const v3Scale = (scaleVector: Vector3, vector: Vector3): Vector3 => {\n return mMulVector(m3Scale(scaleVector), vector) as Vector3;\n};\n\n/**\n * Stretch, parallel to the x-axis.\n */\nexport const m2ScaleX = (scale: number): Matrix2 => {\n return [\n [scale, 0],\n [0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the x-axis - homogeneous coordinates\n */\nexport const m2ScaleXH = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleX = (scale: number): Matrix3 => {\n return [\n [scale, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in x-direction\n */\nexport const m3ScaleXH = (scale: number): Matrix4 => {\n return [\n [scale, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleY = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Stretch in y-direction\n */\nexport const m3ScaleYH = (scale: number): Matrix => {\n return [\n [1, 0, 0, 0],\n [0, scale, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZ = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, scale],\n ];\n};\n\n/**\n * Stretch in z-direction\n */\nexport const m3ScaleZH = (scale: number): Matrix4 => {\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, scale, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis.\n */\nexport const m2ScaleY = (scale: number): Matrix2 => {\n return [\n [1, 0],\n [0, scale],\n ];\n};\n\n/**\n * Stretch, parallel to the y-axis - homogeneous coordinates\n */\nexport const m2ScaleYH = (scale: number): Matrix3 => {\n return [\n [1, 0, 0],\n [0, scale, 0],\n [0, 0, 1],\n ];\n};\n\n// ---------------- REFLECTION MATRICES -------------------------\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOrigin = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection about the origin.\n */\nexport const m2ReflectionOriginH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection about the origin in non-homogeneous coordinates\n */\nexport const m3ReflectionOrigin = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, -1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection about the origin in homogeneous coordinates\n */\nexport const m3ReflectionOriginH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection about y=-x\n */\nexport const m2ReflectionYmX = (): Matrix2 => {\n\n return [\n [0, -1],\n [-1, 0],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionX = (): Matrix2 => {\n\n return [\n [1, 0],\n [0, -1],\n ];\n};\n\n/**\n * Reflection in the x-axis.\n */\nexport const m2ReflectionXH = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection in the y-axis.\n */\nexport const m2ReflectionY = (): Matrix2 => {\n\n return [\n [-1, 0],\n [0, 1],\n ];\n};\n\nexport const m2ReflectionYH = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionYZ = (): Matrix3 => {\n\n return [\n [-1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to YZ plane in homogeneous coordinates\n */\nexport const m3ReflectionYZH = (): Matrix4 => {\n\n return [\n [-1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXZ = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, -1, 0],\n [0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XZ plane in homogeneous coordinates\n */\nexport const m3ReflectionXZH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, -1, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in non-homogeneous coordinates\n */\nexport const m3ReflectionXY = (): Matrix3 => {\n\n return [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, -1],\n ];\n};\n\n/**\n * Reflection relative to XY plane in homogeneous coordinates\n */\nexport const m3ReflectionXYH = (): Matrix4 => {\n\n return [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, -1, 0],\n [0, 0, 0, 1],\n ];\n};\n\n// ---------------- SHEARING MATRICES -------------------------\n\n\n/**\n * Shearing in y-axis, with x-axis fixed with (0,1) moving to (factor, 1)\n */\nexport const m2ShearingY = (factor: number): Matrix2 => {\n\n return [\n [1, factor],\n [0, 1],\n ];\n};\n\n/**\n * Shearing in x-axis, with y-axis fixed with (1,0) moving to (1, factor)\n */\nexport const m2ShearingX = (factor: number): Matrix2 => {\n\n return [\n [1, 0],\n [factor, 1],\n ];\n};", "import { setDecimalPlaces } from './format';\n\n/**\n * Returns a random number in the [min,max] range.\n */\nexport const getRandom = (min: number, max: number, decimalPlaces = Infinity): number => {\n return setDecimalPlaces(Math.random() * (max - min) + min, decimalPlaces);\n};\n\n/**\n * Returns a random integer number in the [min,max] range.\n */\nexport const getRandomInt = (min: number, max: number): number => {\n return Math.floor(Math.random() * (max - min + 1) + min);\n};\n\nexport const getRandomBoolean = () => Math.random() < 0.5;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const getRandomItemFromArray = (array: any[]) => {\n const randomIndex = getRandomInt(0, array.length - 1);\n return array[randomIndex];\n};", "export const stringToNumber = (value: string|undefined|null|number, defaultNumber: number) => {\n if(value === undefined || value === null) return defaultNumber;\n const res = Number(value) ?? defaultNumber;\n return isNaN(res) ? defaultNumber : res;\n};", "import { setDecimalPlaces } from './format';\nimport { Vector2, Vector3 } from '../types';\n\n/**\n * u(x) and v(x) are functions ---------->\n *\n * dx(u + v) = dx(u) + dx(v)\n * dx(u - v) = dx(u) - dx(v)\n * dx(u * v) = dx(u) * v + u * dx(v)\n * dx(u / v) = (dx(u) * v - u * dx(v)) / (v ^ 2), when v(x) != 0\n */\n\n// ------------------ Derivatives of Polynomial ---------------------------\n\n/**\n * y = 3x+2\n * dxPolynomial(10, [[3, 1], [2, 0]])\n */\nexport const dxPolynomial = (x: number, polynomial: number[][], decimalPlaces = Infinity) => {\n let res = 0;\n\n for(const part of polynomial){\n if(part.length !== 2) return NaN;\n\n const coeff = part[0];\n const power = part[1];\n res += coeff * power * Math.pow(x, power - 1);\n }\n\n return setDecimalPlaces(res, decimalPlaces);\n}\n\n// ---------------------- Bezier Curves ---------------------------\n\n/**\n * Derivative of Bezier Curve is another Bezier Curve.\n * t must min in range [0, 1]\n */\nexport const dxV2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n // The derivative: P1 * (2t-2) + (2*P3-4*P2) * t + 2 * P2\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -2 * (1 - t); // Math.pow(1 - t, 2)\n const temp2 = 2 - 4 * t; // (1 - t) * 2 * t\n const temp3 = 2 * t; //t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\nexport const dxV2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const dxV3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = -3 * Math.pow(1 - t, 2); //Math.pow(1 - t, 3);\n const temp2 = 3 * (t - 1) * (3 * t - 1); //Math.pow(1 - t, 2) * 3 * t;\n const temp3 = 6 * t - 9 * t * t; // (1 - t) * 3 * t * t;\n const temp4 = 3 * t * t; //t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n\n// ----------------- Derivatives of trigonometry functions ---------------------------\n\nexport const dxSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(Math.cos(x), decimalPlaces);\n};\n\nexport const dxCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-Math.sin(x), decimalPlaces);\n};\n\nexport const dxTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.cos(x) ** 2), decimalPlaces);\n};\n\n/**\n * x != Math.PI * n, where n is an integer\n */\nexport const dxCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sin(x) ** 2), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcSin = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\n/**\n * -1 < x < 1\n */\nexport const dxArcCos = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (Math.sqrt(1 - x ** 2)), decimalPlaces);\n};\n\nexport const dxArcTan = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(1 / (1 + x ** 2), decimalPlaces);\n};\n\nexport const dxArcCot = (x: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(-1 / (1 + x ** 2), decimalPlaces);\n};\n", "import { Matrix, Matrix2, Matrix3, Vector, Vector2, Vector3 } from '../../types';\nimport { m2Inverse, m3Inverse, mInverse, mMulVector, mDelLastColumn, mGetLastColumn } from '../linear-algebra/matrix';\nimport { setDecimalPlaces } from '../format';\nimport { v2Sub } from '../linear-algebra/vector';\n\n/**\n * Linear equation\n * ax + b = c\n * x = (c - b) / a; a != 0\n */\nexport const linearEquation = (equation: Vector3, decimalPlaces = Infinity) : number => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n\n const diff = c - b;\n\n if(a === 0 && diff === 0) return Infinity; // any number is a solution\n if(a === 0) return NaN; // no solution\n\n return setDecimalPlaces(diff / a, decimalPlaces);\n};\n\n/**\n * System of 2 linear equations.\n * [x, y] = inverse(Matrix of equation parameters) x (vector of equation results)\n * ---------------\n * 3x + 2y = 7\n * -6x + 6y = 6\n */\nexport const linearEquationSystem2 = (equation1: Vector3, equation2: Vector3, decimalPlaces = Infinity) : Vector2 | null => {\n const equationParams: Matrix2 = [\n [equation1[0], equation1[1]],\n [equation2[0], equation2[1]],\n ];\n\n const inversed = m2Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector2 = [\n equation1[2],\n equation2[2]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector2;\n};\n\n/**\n * System of 3 linear equations.\n * ---------------------------------------\n * 3x + 2y + 5z = 7\n * -6x + 6y + 6z = 6\n * 2x + 7y - z = 4\n */\nexport const linearEquationSystem3 = (\n equation1: Vector,\n equation2: Vector,\n equation3: Vector,\n decimalPlaces = Infinity) : Vector3 | null => {\n const equationParams: Matrix3 = [\n [equation1[0], equation1[1], equation1[2]],\n [equation2[0], equation2[1], equation2[2]],\n [equation3[0], equation3[1], equation3[2]],\n ];\n\n const inversed = m3Inverse(equationParams);\n if(inversed === null) return null; // no results\n\n const equationResults: Vector3 = [\n equation1[3],\n equation2[3],\n equation3[3]\n ];\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector3;\n};\n\n/**\n * System of N linear equations.\n */\nexport const linearEquationSystemN = (equations: Matrix, decimalPlaces = Infinity) : Vector | null => {\n if(equations.length <= 0) return null;\n\n const equationParams = mDelLastColumn(equations);\n\n const inversed = mInverse(equationParams);\n if(inversed === null) return null; // no results\n\n // the last column of the equations matrix\n const equationResults = mGetLastColumn(equations);\n\n return mMulVector(inversed, equationResults, decimalPlaces) as Vector;\n};\n\n/**\n * Calculate the equation of a line given two points in a 2D space.\n * y = ax + b\n * y - y1 = m(x - x1)\n * m = (y2 - y1) / (x2 - x1)\n */\nexport const getLinearEquationBy2Points = (point1: Vector2, point2: Vector2) : {\n slope: number|undefined,\n yIntercept: number|undefined,\n xIntercept: number|undefined,\n formula: string,\n} => {\n const [deltaX, deltaY] = v2Sub(point2, point1);\n const [x, y] = point1;\n\n if(deltaX === 0) {\n return {\n slope: undefined,\n xIntercept: x,\n yIntercept: undefined,\n formula: `x = ${ x }`,\n };\n }\n\n const m = deltaY / deltaX;\n const b = y - m * x;\n let formula = '';\n\n if(m === 0) {\n formula = `y = ${ b }`;\n }\n else{\n formula = `y = ${ m === 1 ? '' : m }x`;\n\n if(b !== 0) {\n formula += ` ${ b < 0 ? '-' : '+' } ${ Math.abs(b) }`;\n }\n }\n\n return {\n slope: m,\n xIntercept: undefined,\n yIntercept: b,\n formula,\n };\n};", "import { Vector } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport { linearEquation } from './linear-equations';\nimport { isNumber } from '../other';\n\n/**\n * Quadratic Equation.\n * ax^2 + bx + c = d\n */\nexport const quadraticEquation = (equation: Vector, decimalPlaces = Infinity) : Vector => {\n const a = equation[0];\n const b = equation[1];\n const c = equation[2];\n const d = equation[3];\n\n if(a === 0){\n // it's a linear equation -------------------------------------------\n const res = linearEquation([b, c, d], decimalPlaces);\n if(isNumber(res)) return [res];\n return [];\n }\n\n const diff = c - d;\n\n const discriminant = b * b - (4 * a * diff);\n\n if(discriminant < 0){\n return []; // no results\n }\n\n if(discriminant === 0){\n return [ setDecimalPlaces(-b / (2 * a), decimalPlaces) ]; // 1 result\n }\n\n // if(determinant > 0) ---> 2 results\n const t1 = 2 * a;\n const t2 = Math.sqrt(discriminant);\n\n return [\n setDecimalPlaces((-b + t2) / t1, decimalPlaces),\n setDecimalPlaces((-b - t2) / t1, decimalPlaces),\n ];\n};", "import { IBBox, Vector, Vector2, Vector3 } from '../../types';\nimport { setDecimalPlaces } from '../format';\nimport {\n dxV2CubicBezierCurve,\n dxV2QuadraticBezierCurve,\n dxV3CubicBezierCurve,\n dxV3QuadraticBezierCurve\n} from '../derivative';\nimport { v2Normalize, v3Normalize } from '../linear-algebra/vector';\nimport { linearEquation } from '../equations/linear-equations';\nimport { quadraticEquation } from '../equations/quadratic-equations';\nimport { isNumber } from '../other';\n\n/**\n * B\u00E9zier Curves\n * quadratic: y = P1 * (1-t)\u00B2 + P2 * 2 * (1-t)t + P3 * t\u00B2\n * t in range [0, 1]\n */\n\n// -------------------- GET POINT ON CURVE --------------------------\n\n/**\n * Get a point on a quadratic B\u00E9zier curve as a function of time.\n */\nexport const v2QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3QuadraticBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 2);\n const temp2 = (1 - t) * 2 * t;\n const temp3 = t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * centerControlPoint[0] + temp3 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * centerControlPoint[1] + temp3 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * centerControlPoint[2] + temp3 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n/**\n * Get a point on a cubic B\u00E9zier curve as a function of time.\n */\nexport const v2CubicBezierCurve = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n ];\n};\n\nexport const v3CubicBezierCurve = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n\n const temp1 = Math.pow(1 - t, 3);\n const temp2 = Math.pow(1 - t, 2) * 3 * t;\n const temp3 = (1 - t) * 3 * t * t;\n const temp4 = t * t * t;\n\n return [\n setDecimalPlaces(temp1 * startControlPoint[0] + temp2 * center1ControlPoint[0] + temp3 * center2ControlPoint[0] + temp4 * endControlPoint[0], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[1] + temp2 * center1ControlPoint[1] + temp3 * center2ControlPoint[1] + temp4 * endControlPoint[1], decimalPlaces),\n setDecimalPlaces(temp1 * startControlPoint[2] + temp2 * center1ControlPoint[2] + temp3 * center2ControlPoint[2] + temp4 * endControlPoint[2], decimalPlaces),\n ];\n};\n\n// -------------------- TANGENT --------------------------\n\n/**\n * Tangent indicates the direction of travel at specific points along the B\u00E9zier curve,\n * and is literally just the first derivative of our curve.\n */\nexport const v2QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3QuadraticBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n centerControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3QuadraticBezierCurve(t, startControlPoint, centerControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\nexport const v2CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n const dxVector = dxV2CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v2Normalize(dxVector, decimalPlaces);\n};\n\nexport const v3CubicBezierCurveTangent = (\n t: number,\n startControlPoint: Vector3,\n center1ControlPoint: Vector3,\n center2ControlPoint: Vector3,\n endControlPoint: Vector3,\n decimalPlaces = Infinity\n) : Vector3 => {\n const dxVector = dxV3CubicBezierCurve(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n return v3Normalize(dxVector, decimalPlaces);\n};\n\n// -------------------- NORMAL --------------------------\n\n/**\n * Normal is a vector that runs at a right angle to the direction of the curve, and is typically of length 1.\n * To find it, we take the normalised tangent vector, and then rotate it by a 90 degrees.\n */\nexport const v2QuadraticBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2QuadraticBezierCurveTangent(t, startControlPoint, centerControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\nexport const v2CubicBezierCurveNormal = (\n t: number,\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2 => {\n\n const tangent = v2CubicBezierCurveTangent(t, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint, decimalPlaces);\n return [-tangent[1], tangent[0]];\n};\n\n// -------------------- EXTREMA --------------------------\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2QuadraticBezierCurveExtrema = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector => {\n\n /*\n (-2 * (1 - t)) * startControlPoint[0] + (2 - 4 * t) * centerControlPoint[0] + (2 * t) * endControlPoint[0]\n 2 * t * startControlPoint[0] - 4 * t * centerControlPoint[0] + 2 * t * endControlPoint[0] - 2 * startControlPoint[0] + 2 * centerControlPoint[0]\n t * (2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0]) + (- 2 * startControlPoint[0] + 2 * centerControlPoint[0])\n */\n\n const a1 = 2 * startControlPoint[0] - 4 * centerControlPoint[0] + 2 * endControlPoint[0];\n const b1 = -2 * startControlPoint[0] + 2 * centerControlPoint[0];\n const equation1: Vector3 = [a1, b1, 0];\n const res1 = linearEquation(equation1, decimalPlaces);\n\n const a2 = 2 * startControlPoint[1] - 4 * centerControlPoint[1] + 2 * endControlPoint[1];\n const b2 = -2 * startControlPoint[1] + 2 * centerControlPoint[1];\n const equation2: Vector3 = [a2, b2, 0];\n const res2 = linearEquation(equation2, decimalPlaces);\n\n const res: Vector = [];\n\n if(isNumber(res1)){\n res.push(res1);\n }\n\n if(isNumber(res2)){\n res.push(res2);\n }\n\n return res;\n};\n\n/**\n * Find maxima and minima by solving the equation B'(t) = 0\n * Returns result in [0, 1] range.\n */\nexport const v2CubicBezierCurveExtrema = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : Vector2|null => {\n\n const a1 = -3 * startControlPoint[0] + 9 * center1ControlPoint[0] - 9 * center2ControlPoint[0] + 3 * endControlPoint[0];\n const b1 = 6 * startControlPoint[0] - 12 * center1ControlPoint[0] + 6 * center2ControlPoint[0];\n const c1 = -3 * startControlPoint[0] + 3 * center1ControlPoint[0];\n const equation1: Vector = [a1, b1, c1, 0];\n\n const a2 = -3 * startControlPoint[1] + 9 * center1ControlPoint[1] - 9 * center2ControlPoint[1] + 3 * endControlPoint[1];\n const b2 = 6 * startControlPoint[1] - 12 * center1ControlPoint[1] + 6 * center2ControlPoint[1];\n const c2 = -3 * startControlPoint[1] + 3 * center1ControlPoint[1];\n const equation2: Vector = [a2, b2, c2, 0];\n\n // Any value between 0 and 1 is a root that matters for B\u00E9zier curves, anything below or above that is irrelevant (because B\u00E9zier curves are only defined over the interval [0,1]).\n const res1 = quadraticEquation(equation1, decimalPlaces).filter(num => num >= 0 && num <= 1);\n const res2 = quadraticEquation(equation2, decimalPlaces).filter(num => num >= 0 && num <= 1);\n\n const res = [...res1, ...res2];\n if(res.length === 2){\n return [...res1, ...res2] as Vector2;\n }\n\n return null;\n};\n\n// -------------------- BOUNDING BOX --------------------------\n\nexport const v2QuadraticBezierBBox = (\n startControlPoint: Vector2,\n centerControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2QuadraticBezierCurveExtrema(startControlPoint, centerControlPoint, endControlPoint);\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2QuadraticBezierCurve(percent, startControlPoint, centerControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\nexport const v2CubicBezierBBox = (\n startControlPoint: Vector2,\n center1ControlPoint: Vector2,\n center2ControlPoint: Vector2,\n endControlPoint: Vector2,\n decimalPlaces = Infinity\n) : IBBox => {\n\n const extrema = v2CubicBezierCurveExtrema(startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint) || [];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for(const percent of extrema){\n const point = v2CubicBezierCurve(percent, startControlPoint, center1ControlPoint, center2ControlPoint, endControlPoint);\n\n const x = point[0];\n const y = point[1];\n\n minX = Math.min(minX, x ?? Infinity);\n maxX = Math.max(maxX, x ?? -Infinity);\n\n minY = Math.min(minY, y ?? Infinity);\n maxY = Math.max(maxY, y ?? -Infinity);\n }\n\n minX = setDecimalPlaces(Math.min(minX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n maxX = setDecimalPlaces(Math.max(maxX, startControlPoint[0], endControlPoint[0]), decimalPlaces);\n minY = setDecimalPlaces(Math.min(minY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n maxY = setDecimalPlaces(Math.max(maxY, startControlPoint[1], endControlPoint[1]), decimalPlaces);\n\n return {\n x: minX,\n y: minY,\n w: Math.abs(maxX - minX),\n h: Math.abs(maxY - minY),\n x2: maxX,\n y2: maxY,\n }\n};\n\n\n", "import { Vector2 } from '../types';\nimport { v2Sub } from './linear-algebra/vector';\nimport { getV2Angle } from './angle';\nimport { convertRange } from './other';\n\n/**\n * Circle Equation\n * x^2 + y^2 = radius^2\n * ----------------------\n * Circle Parametric Equation\n * x(t) = radius * cos(t)\n * y(t) = radius * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const circleMovement = (center: Vector2, angle: number, radius: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ];\n};\n\n/**\n * Circle Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const circleMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radius: number\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return circleMovement(center, angle, radius);\n};\n\n/**\n * Ellipse Equation\n * (x - centerX)^2 / (radius1^2) + (y - centerY)^2 / (radius2^2) = 1\n * -----------------------------------------------------------------\n * Ellipse Parametric Equation\n * x(t) = radius1 * cos(t)\n * y(t) = radius2 * sin(t)\n * t is the parameter = angle\n *\n * Angle should be in the range [0, Math.PI]\n */\nexport const ellipseMovement = (center: Vector2, angle: number, radius1: number, radius2: number): Vector2 => {\n angle = angle % Math.PI * 2;\n\n return [\n center[0] + Math.cos(angle) * radius1,\n center[1] + Math.sin(angle) * radius2\n ];\n};\n\n/**\n * Ellipse Movement After Mouse.\n * Mouse Positions:\n * - pageX/Y coordinates are relative to the top left corner of the whole rendered page (including parts hidden by scrolling),\n * - screenX and screenY: Relative to the top left of the physical screen/monitor, this reference point only moves if you increase or decrease the number of monitors or the monitor resolution.\n * - clientX/Y coordinates are relative to the top left corner of the visible part of the page, \"seen\" through browser window.\n * - offsetX and offsetY are relative to the parent container,\n */\nexport const ellipseMovementAfterMouse = (\n mouse: Vector2,\n center: Vector2,\n radii: Vector2\n): Vector2 => {\n\n const vector = v2Sub(mouse, center);\n\n let angle = getV2Angle(vector);\n\n // convert the angle from the range [0, Math.PI*2] to the range [0, Math.PI]\n angle = convertRange(angle, 0, Math.PI*2, 0, Math.PI);\n\n return ellipseMovement(center, angle, radii[0], radii[1]);\n};\n\n/**\n * Sine Wave Equation (Sinusoid)\n * -----------------------------\n * const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n * amplitude = the peak deviation of the function from zero\n * frequency = number of cycles\n * phase = specifies (in radians) where in its cycle the oscillation is at t = 0.\n * think of it as \"shifting\" the starting point of the function to the right (positive p) or left (negative)\n */\nexport const sineWaveMovement = (x: number, amplitude: number, frequency: number, phase: number) : Vector2 => {\n /*\n example values:\n const amplitude = 50;\n const frequency = 0.005;\n const phase = 0;\n x: [0, 1000]\n */\n const y = amplitude * Math.sin(2 * Math.PI * frequency * x + phase);\n\n return [x, y];\n};\n\n/**\n * Lissajous curve (Lissajous figure or Bowditch curve)\n * Parametric equation #1\n * f(t) = A * sin(k * t + m)\n * f(t) = B * sin(n * t)\n * 0 <= m <= PI/2\n * k, n >= 1\n * -----------------------\n * Parametric equation #2\n * f(t) = A * cos(k * t - m)\n * f(t) = B * cos(n * t - p)\n * -----------------------------\n * Shapes:\n * k = 1, n = 1, m = 0, p = 0 ---> line\n * A = B, k = 1, n = 1, m = PI/2, p = PI/2 ----> circle\n * A != B, k = 1, n = 1, m = PI/2, p = PI/2 ----> ellipse\n * k = 2, n = 2, m = PI/2, p = PI/2 ----> section of a parabola\n */\nexport const lissajousCurve = (\n width: number,\n height: number,\n t: number,\n k: number,\n n: number,\n m: number,\n p: number\n) :Vector2 => {\n return [\n width * Math.cos(k * t - m),\n height * Math.cos(n * t - p),\n ];\n};\n", "import { getRandom } from './random';\nimport { HSLColor, LABColor, RGBColor } from '../types';\nimport { mod } from './other';\nimport { setDecimalPlaces } from './format';\n\n// ------------------------ RANDOM COLOR -------------------------------------\n\nexport const getRandomRGBColor = () : RGBColor => {\n const hslColor = getRandomHSLColor();\n return hslToRgb(hslColor);\n};\n\nexport const getRandomHexColor = () : string => {\n const hslColor = getRandomHSLColor();\n return hslToHex(hslColor);\n};\n\nexport const getRandomHSLColor = () : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given hue\n */\nexport const getRandomHSLColorWithHue = (h: number) : HSLColor => {\n const s = getRandom(0, 100);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given saturation\n */\nexport const getRandomHSLColorWithSaturation = (s: number) : HSLColor => {\n const h = getRandom(1, 360);\n const l = getRandom(0, 100);\n return [h, s, l];\n};\n\n/**\n * generate random color with the given lightness\n */\nexport const getRandomHSLColorWithLightness = (l: number) : HSLColor => {\n const h = getRandom(1, 360);\n const s = getRandom(0, 100);\n return [h, s, l];\n};\n\nexport const getRandomGrayscaleHSLColor = () : HSLColor => {\n const l = getRandom(0, 100);\n return [0, 0, l];\n};\n\nexport const getRandomHSLColorWithinRanges = (\n hueStart = 1, hueEnd = 360,\n saturationStart = 0, saturationEnd = 100,\n lightStart = 0, lightEnd = 100\n) : HSLColor => {\n const h = getRandom(hueStart, hueEnd);\n const s = getRandom(saturationStart, saturationEnd);\n const l = getRandom(lightStart, lightEnd);\n return [h, s, l];\n};\n\n// ----------------------- CONVERT COLORS --------------------------------------\n\n/**\n * helper: convert hue value to degrees.\n * @param {number} h\n * @return {number} [0, 360] degrees\n */\nconst convertHueToDegrees = (h : number) : number => {\n\n // the hue value needs to be multiplied by 60 to convert it to degrees\n h *= 60;\n\n // if hue becomes negative, you need to add 360 to, because a circle has 360 degrees\n if(h < 0){\n h += 360;\n }\n\n return h;\n // convert huw to %\n // return h * 100 / 360;\n};\n\n/**\n * get hue from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] % - we use here % instead of [0, 359] degrees\n */\nconst getHue = (r : number, g : number, b : number, min : number | undefined = undefined, max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (max === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no hue, as it's gray\n if(min === max) return 0;\n\n const diff = max - min;\n\n let h = 0;\n\n // if red is max\n if(max === r){\n h = (g - b) / diff + (g < b ? 6 : 0);\n }\n\n // if green is max\n if(max === g){\n h = 2 + (b - r) / diff;\n }\n\n // if blue is max\n if(max === b){\n h = 4 + (r - g) / diff;\n }\n\n return convertHueToDegrees(h);\n};\n\n/**\n * get luminance from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @return {number} [0, 100] %\n */\nconst getLuminance = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // calculate the luminance value\n // @ts-ignore\n const l = (min + max) / 2; // [0, 1]\n\n // return l value in %\n return l * 100;\n};\n\n/**\n * get saturation from RGB\n * @param {number} r [0, 255]\n * @param {number} g [0, 255]\n * @param {number} b [0, 255]\n * @param {number|undefined=} min - min number of [r, g, b]\n * @param {number|undefined=} max - max number of [r, g, b]\n * @param {number|undefined=} l - luminance in [0, 100] %\n * @return {number} [0, 100] %\n */\nconst getSaturation = (\n r : number,\n g : number,\n b : number,\n min : number | undefined = undefined,\n max : number | undefined = undefined,\n l : number | undefined = undefined) : number => {\n\n // find the minimum and maximum values of r, g, and b if they are not provided\n min = (min === undefined) ? Math.min(r, g, b) : min;\n max = (min === undefined) ? Math.max(r, g, b) : max;\n\n // if the min and max value are the same -> no saturation, as it's gray\n if(min === max) return 0;\n\n // calculate luminance if it's not provided\n l = (l === undefined) ? getLuminance(r, g, b) : l;\n\n // check the level of luminance\n const s = (l <= 50) ?\n // @ts-ignore\n ((max - min) / (max + min)) : // this formula is used when luminance <= 50%\n // @ts-ignore\n (max - min) / (2.0 - max - min); // this formula is used when luminance > 50%\n\n // return saturation in %\n return s * 100;\n};\n\nexport const rgbToHsl = (rgb: RGBColor, decimalPlaces = Infinity): HSLColor => {\n\n // convert rgb values to the range [0, 1]\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n // find the minimum and maximum values of r, g, and b\n const min = Math.min(r, g, b);\n const max = Math.max(r, g, b);\n\n // calculate the luminance value in %\n const l = getLuminance(r, g, b, min, max);\n\n // calculate the saturation in %\n const s = getSaturation(r, g, b, min, max, l);\n\n // calculate the hue in % (not in degrees!)\n const h = getHue(r, g, b, min, max);\n\n if(h > 360 || s > 100 || l > 100){\n return [0, 0, 100];\n }\n\n if(h < 0 || s < 0 || l < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(h, decimalPlaces),\n setDecimalPlaces(s, decimalPlaces),\n setDecimalPlaces(l, decimalPlaces),\n ];\n};\n\n/**\n * helper: HSL to RGB\n */\nconst hslToRgbHelper = (helper1 : number, helper2 : number, colorHelper : number) : number => {\n\n // all values need to be between 0 and 1\n // if you get a negative value you need to add 1 to it\n if(colorHelper < 0) colorHelper += 1;\n\n // if you get a value above 1 you need to subtract 1 from it.\n if(colorHelper > 1) colorHelper -= 1;\n\n if(colorHelper * 6 < 1) return helper2 + (helper1 - helper2) * 6 * colorHelper;\n\n if(colorHelper * 2 < 1) return helper1;\n\n if(colorHelper * 3 < 2){\n return helper2 + (helper1 - helper2) * (0.666 - colorHelper) * 6;\n }\n else{\n return helper2;\n }\n};\n\nexport const hslToRgb = (hsl: HSLColor, decimalPlaces = Infinity): RGBColor => {\n\n // convert all values to [0, 1] from %\n const h = hsl[0] / 100;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n // if there is no saturation -> it\u2019s grey\n if(s === 0){\n // convert the luminance from [0, 1] to [0, 255]\n const gray = l * 255;\n return [gray, gray, gray];\n }\n\n // check the level of luminance\n const helper1 = (l < 0.5) ?\n (l * (1.0 + s)) :\n (l + s - l * s);\n\n const helper2 = 2 * l - helper1;\n\n const rHelper = h + 0.333;\n const gHelper = h;\n const bHelper = h - 0.333;\n\n let r = hslToRgbHelper(helper1, helper2, rHelper);\n let g = hslToRgbHelper(helper1, helper2, gHelper);\n let b = hslToRgbHelper(helper1, helper2, bHelper);\n\n // convert rgb to [0, 255]\n r *= 255;\n g *= 255;\n b *= 255;\n\n if(r > 255 || g > 255 || b > 255){\n return [255, 255, 255];\n }\n\n if(r < 0 || g < 0 || b < 0){\n return [0, 0, 0];\n }\n\n return [\n setDecimalPlaces(r, decimalPlaces),\n setDecimalPlaces(g, decimalPlaces),\n setDecimalPlaces(b, decimalPlaces),\n ];\n};\n\n/**\n * HSL to hex\n * hslToHex(360, 100, 50) // [360, 100, 5] ==> \"#ff0000\" (red)\n */\nexport const hslToHex = (hsl: HSLColor) => {\n\n if(hsl[0] > 360 || hsl[1] > 100 || hsl[2] > 100){\n return '#ffffff';\n }\n\n if(hsl[0] < 0 || hsl[1] < 0 || hsl[2] < 0){\n return '#000000';\n }\n\n const h = hsl[0] / 360;\n const s = hsl[1] / 100;\n const l = hsl[2] / 100;\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n const toHex = (x: number) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n};\n\n/**\n * RGB to HEX\n * rgbToHex([235, 64, 52]) // #eb4034\n */\nexport const rgbToHex = (rgb: RGBColor) => {\n const [r, g, b] = rgb;\n return '#' + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);\n};\n\nexport const hexToRgb = (hex: string) : RGBColor | null => {\n\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const _hex = hex.replace(shorthandRegex, (_m, r, g, b) => {\n return r + r + g + g + b + b;\n });\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(_hex);\n if(!result) return null;\n\n const r = parseInt(result[1], 16);\n const g = parseInt(result[2], 16);\n const b = parseInt(result[3], 16);\n\n return [r, g, b];\n};\n\nexport const rgbToLab = (rgb: RGBColor, decimalPlaces = Infinity) : LABColor => {\n\n let r = rgb[0] / 255;\n let g = rgb[1] / 255;\n let b = rgb[2] / 255;\n\n r = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n let x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;\n let y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;\n let z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;\n\n x = (x > 0.008856) ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;\n y = (y > 0.008856) ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;\n z = (z > 0.008856) ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;\n\n return [\n setDecimalPlaces((116 * y) - 16, decimalPlaces),\n setDecimalPlaces(500 * (x - y), decimalPlaces),\n setDecimalPlaces(200 * (y - z), decimalPlaces),\n ];\n};\n\nexport const labToRgb = (lab: LABColor, decimalPlaces = Infinity) : RGBColor => {\n let y = (lab[0] + 16) / 116;\n let x = lab[1] / 500 + y;\n let z = y - lab[2] / 200;\n\n x = 0.95047 * ((x * x * x > 0.008856) ? x * x * x : (x - 16/116) / 7.787);\n y = 1.00000 * ((y * y * y > 0.008856) ? y * y * y : (y - 16/116) / 7.787);\n z = 1.08883 * ((z * z * z > 0.008856) ? z * z * z : (z - 16/116) / 7.787);\n\n let r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n let g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n let b = x * 0.0557 + y * -0.2040 + z * 1.0570;\n\n r = (r > 0.0031308) ? (1.055 * Math.pow(r, 1/2.4) - 0.055) : 12.92 * r;\n g = (g > 0.0031308) ? (1.055 * Math.pow(g, 1/2.4) - 0.055) : 12.92 * g;\n b = (b > 0.0031308) ? (1.055 * Math.pow(b, 1/2.4) - 0.055) : 12.92 * b;\n\n return [\n setDecimalPlaces(Math.max(0, Math.min(1, r)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, g)) * 255, decimalPlaces),\n setDecimalPlaces(Math.max(0, Math.min(1, b)) * 255, decimalPlaces),\n ];\n};\n\n// ----------------------- GET SHIFTED COLORS --------------------------------------\n\nexport const getShiftedHue = (color: HSLColor, shift = 180) : HSLColor => {\n let hue = color[0];\n hue += shift;\n\n if (hue > 360 || hue < 0) {\n hue = mod(hue, 360);\n }\n\n return [hue, color[1], color[2]];\n};\n\nexport const getShiftedLightness = (color: HSLColor, shift = 10) : HSLColor => {\n let lightness = color[2];\n lightness += shift;\n\n if (lightness > 100 || lightness < 0) {\n lightness = mod(lightness, 100);\n }\n\n return [color[0], color[1], lightness];\n};\n\nexport const getShiftedSaturation = (color: HSLColor, shift = 10) : HSLColor => {\n let saturation = color[1];\n saturation += shift;\n\n if (saturation > 100) {\n saturation -= 100;\n }\n\n if(saturation < 0){\n saturation += 100;\n }\n\n return [color[0], saturation, color[2]];\n};\n\n// ----------------------- SIMILAR COLORS --------------------------------------\n\n/**\n * Measure the perceptual difference between two RGB colors using the CIE76 color difference formula:\n * delta = Math.sqrt((L2 - L1)^2 + (a2 - a1)^2 + (b2 - b1)^2)\n * https://en.wikipedia.org/wiki/Color_difference\n * https://stackoverflow.com/questions/13586999/color-difference-similarity-between-two-values-with-js\n * <= 1.0 Not perceptible by human eyes.\n * 1 - 2 Perceptible through close observation.\n * 2 - 10 Perceptible at a glance.\n * 11 - 49 Colors are more similar than opposite\n * 100 Colors are exact opposite\n */\nexport const getColorsDelta = (rgbA: RGBColor, rgbB: RGBColor, decimalPlaces = Infinity) => {\n const labA = rgbToLab(rgbA, decimalPlaces);\n const labB = rgbToLab(rgbB, decimalPlaces);\n\n // differences between the LAB components of the two colors\n const deltaL = labA[0] - labB[0];\n const deltaA = labA[1] - labB[1];\n const deltaB = labA[2] - labB[2];\n\n // chroma components\n const c1 = Math.sqrt(labA[1] * labA[1] + labA[2] * labA[2]);\n const c2 = Math.sqrt(labB[1] * labB[1] + labB[2] * labB[2]);\n const deltaC = c1 - c2;\n\n // difference in hue, deltaH, which takes into account both the differences\n // in the a* and b* components of LAB and the differences in chroma.\n let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n\n // It applies weighting factors to the differences in lightness (deltaL),\n // chroma (deltaC), and hue (deltaH).\n const deltaLKlsl = deltaL / (1.0);\n const deltaCkcsc = deltaC / (sc);\n const deltaHkhsh = deltaH / (sh);\n\n // It computes the final color difference using the CIE76 formula:\n // deltaE = sqrt(deltaLKlsl^2 + deltaCkcsc^2 + deltaHkhsh^2),\n // where deltaLKlsl is the weighted lightness difference,\n // deltaCkcsc is the weighted chroma difference,\n // and deltaHkhsh is the weighted hue difference.\n const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n\n // It returns the calculated color difference,\n // optionally rounded to the specified number of decimal places.\n return i < 0 ? 0 : Math.sqrt(i);\n};\n", "/**\n * guid like '932ade5e-c515-4807-ac01-73b20ab3fb66'\n */\nexport const guid = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n return (c == 'x' ? r : r & 0x3 | 0x8).toString(16);\n });\n};\n\n/**\n * id like 'df4unio1opulby2uqh4'\n */\nexport const newId = () => {\n return Math.random().toString(36).substring(2) + (new Date()).getTime().toString(36);\n};\n", "import { ICircle, IPolygon, IRect, Matrix2, Vector2 } from '../types';\nimport { mod } from './other';\nimport { v2GetNormal, v2DotProduct } from './linear-algebra/vector';\n\n/**\n * Rectangles collision detection.\n * Rectangles should not be rotated.\n * The algorithm works by ensuring there is no gap between any of the 4 sides of the rectangles.\n * Any gap means a collision does not exist.\n * Returns true if collision is detected.\n */\nexport const rectCollide = (rect1: IRect, rect2: IRect) : boolean => {\n return rect1.x <= rect2.x + rect2.w &&\n rect1.x + rect1.w >= rect2.x &&\n rect1.y <= rect2.y + rect2.h &&\n rect1.h + rect1.y >= rect2.y;\n};\n\n/**\n * Circles collision detection.\n * This algorithm works by taking the center points of the two circles\n * and ensuring the distance between the center points\n * are less than the two radii added together.\n * Returns true if collision is detected.\n */\nexport const circleCollide = (circle1: ICircle, circle2: ICircle) => {\n const dx = Math.abs(circle1.cx - circle2.cx);\n const dy = Math.abs(circle1.cy - circle2.cy);\n const distance = Math.sqrt(dx * dx + dy * dy);\n return distance <= circle1.r + circle2.r;\n};\n\n//-------------------- Separating Axis Theorem (SAT) Collision detection -------------------------\n\nconst getEdges = (poly: IPolygon) : Matrix2[] => {\n const edges: Matrix2[] = [];\n\n for(let i= 0; i {\n const edges: Matrix2[] = [];\n\n // collect polygon edges, and combine then into a single array\n edges.push(...getEdges(poly1));\n edges.push(...getEdges(poly2));\n\n // for each edge, find the normal vector and project both polygons onto it\n for (const edge of edges) {\n const normal = v2GetNormal(edge[0], edge[1]);\n const p1Proj = projectPolygon(poly1, normal);\n const p2Proj = projectPolygon(poly2, normal);\n\n // Check if the projections overlap\n const isOverlap = p1Proj.max >= p2Proj.min && p2Proj.max >= p1Proj.min;\n\n // Check if the projections overlap; if not, the polygons do not collide\n if (!isOverlap) return false;\n }\n\n // If all tests pass, the polygons overlap and collide\n return true;\n};\n\n/**\n * Project every polygon point onto the normal.\n * Then find min and max.\n */\nconst projectPolygon = (polygon: IPolygon, normal: Vector2): { min: number, max: number } => {\n let min = Infinity;\n let max = -Infinity;\n\n // Project each vertex of the polygon onto the axis\n for (const vertex of polygon) {\n const projection = v2DotProduct(vertex, normal);\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n\n return { min, max };\n};", "export interface IAnimationProps {\n duration?: number;\n callback: (result: IAnimationResult) => void;\n restartOnResize?: boolean;\n resizeCallback?: (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => void;\n}\n\nexport interface IAnimationResult {\n start: () => void;\n stop: () => void;\n pause: () => void;\n resume: () => void;\n restart: () => void;\n isAnimating: () => boolean;\n getStartTime: () => number|undefined;\n getElapsedTime: () => number|undefined;\n getPercent: () => number|undefined;\n getResizeObserver: () => ResizeObserver|undefined;\n}\n\nexport const animate = (props: IAnimationProps) : IAnimationResult => {\n\n const _duration = props.duration !== undefined ? props.duration : Infinity;\n\n let startTime: number|undefined = undefined; // in milliseconds\n let animationId: number|undefined = undefined;\n\n // the time elapsed since the start of the animation (in milliseconds)\n let elapsed: number|undefined = undefined;\n let previousTimeStamp: number|undefined = undefined;\n\n let animating = false;\n let observer: ResizeObserver|undefined = undefined;\n\n // -------------------- COMMANDS ---------------------\n\n const stop = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = false;\n\n /*if(observer !== undefined){\n observer.disconnect();\n observer = undefined;\n }*/\n\n if(animationId === undefined) return;\n window.cancelAnimationFrame(animationId);\n };\n\n const restart = () => {\n stop();\n start();\n };\n\n const pause = () => {\n animating = false;\n };\n\n const resume = () => {\n animating = true;\n };\n\n /**\n * Animation Step.\n * @param {number} timeStamp in milliseconds\n */\n const step = (timeStamp: DOMHighResTimeStamp) => {\n\n if (startTime === undefined) {\n startTime = timeStamp;\n }\n\n // the time elapsed since the start of the animation (in milliseconds)\n elapsed = timeStamp - startTime;\n\n if (animating && previousTimeStamp !== timeStamp && typeof props.callback === 'function') {\n\n // do the rendering .............\n props.callback(getResult());\n }\n\n if(elapsed <= _duration){\n previousTimeStamp = timeStamp;\n animationId = window.requestAnimationFrame(step);\n }\n else{\n stop();\n }\n };\n\n const observerHandler = (_entries: ResizeObserverEntry[], _observer: ResizeObserver) => {\n restart();\n\n if(typeof props.resizeCallback === 'function'){\n props.resizeCallback(_entries, _observer);\n }\n };\n\n const start = () => {\n startTime = undefined;\n elapsed = undefined;\n previousTimeStamp = undefined;\n animating = true;\n\n if(props.restartOnResize && window.ResizeObserver && observer === undefined){\n observer = new ResizeObserver(observerHandler);\n observer.observe(document.body, { box: 'border-box' });\n }\n else{\n animationId = window.requestAnimationFrame(step);\n }\n };\n\n // --------------- GET INFO ----------------------\n\n /**\n * the time elapsed since the start of the animation (in milliseconds)\n */\n const getElapsedTime = () : number|undefined => {\n return elapsed;\n };\n\n const isAnimating = () => {\n return animating;\n };\n\n const getStartTime = () => {\n return startTime;\n };\n\n const getPercent = () => {\n if(_duration === Infinity || elapsed === undefined) return undefined;\n return elapsed * 100 / _duration;\n };\n\n const getResizeObserver = () => {\n return observer;\n };\n\n const getResult = () : IAnimationResult => {\n return {\n\n // commands --------------\n start,\n stop,\n pause,\n resume,\n restart,\n\n // information -------\n isAnimating,\n getElapsedTime,\n getStartTime,\n getPercent,\n getResizeObserver,\n };\n };\n\n return getResult();\n};\n", "import { setDecimalPlaces } from './format';\n\nexport const getCircleCircumference = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * radius, decimalPlaces);\n};\n\nexport const getEllipseCircumference = (radius1: number, radius2: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(2 * Math.PI * Math.sqrt((radius1 ** 2 + radius2 ** 2) / 2), decimalPlaces);\n};\n\nexport const isAngleInCircleArc = (startAngleDeg: number, endAngleDeg: number, currentDegrees: number) : boolean => {\n\n if(startAngleDeg > endAngleDeg) {\n endAngleDeg += 360;\n }\n\n return currentDegrees >= startAngleDeg && currentDegrees <= endAngleDeg ||\n (currentDegrees + 360) >= startAngleDeg && (currentDegrees + 360) <= endAngleDeg;\n};\n\n/**\n * get the side of a square inscribed in a circle\n */\nexport const getSquareInCircleSide = (radius: number, decimalPlaces = Infinity) => {\n return setDecimalPlaces(radius * 2 / Math.sqrt(2), decimalPlaces);\n};\n", "/**\n * 1 + 2 + ... + n = n * (n + 1) / 2\n */\nexport const naturalNumbersSequenceSum = (n: number) => {\n return n * (n + 1) / 2;\n};\n\n/**\n * n = the number of terms to be added\n * a = the first term in the sequence\n * d = the constant value between terms\n */\nexport const arithmeticSequenceSum = (n: number, a: number, d: number) => {\n return (n / 2) * (2 * a + (n - 1) * d);\n};", "import { setDecimalPlaces } from './format';\n\n// -------------------- CENTRAL TENDENCY ----------------------------\n\n/**\n * Central tendency: Calculate the Average (mean = \u03BC)\n * Sum of all numbers divided by the array length.\n */\nexport const getArithmeticMean = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const sum = data.reduce((acc, val) => acc + val, 0);\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Frequency map: number ---> it's frequency\n */\nexport const getArithmeticMeanFromFrequency = (frequencyMap: Map, decimalPlaces = Infinity) => {\n\n let mean = 0;\n\n for(const [val, frequency] of frequencyMap) {\n mean += val * frequency;\n }\n\n return setDecimalPlaces(mean, decimalPlaces);\n};\n\n/**\n * Central tendency: What is the central number in the sorted array?\n * Good for lists like [3, 3, 3, 3, 3, 3, 100] - 100 here is called \"Outlier\"\n */\nexport const getMedian = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const copy = [...data].sort((num1, num2) => num1 - num2);\n const mid = Math.floor(copy.length / 2);\n\n if(copy.length % 2 === 0) {\n return setDecimalPlaces((copy[mid] + copy[mid - 1]) / 2, decimalPlaces);\n }\n else {\n return setDecimalPlaces(copy[mid], decimalPlaces);\n }\n};\n\n/**\n * Central tendency: What number is most common in the set.\n * If all numbers have the same frequency, there is no mode.\n */\nexport const getMode = (data: number[]) : number[]|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n // Count frequency of each number in the data array.\n const frequencyMap: Map = new Map();\n for (const num of data) {\n frequencyMap.set(num, (frequencyMap.get(num) || 0) + 1);\n }\n\n let maxFrequency = 0;\n let modes: number[] = [];\n\n // Find the maximum frequency\n for (const [num, frequency] of frequencyMap) {\n if (frequency > maxFrequency) {\n maxFrequency = frequency;\n modes = [num];\n }\n else if (frequency === maxFrequency) {\n modes.push(num);\n }\n }\n\n // If all numbers have the same frequency, there is no mode\n if (modes.length === data.length) {\n return undefined;\n }\n\n // Return the mode(s)\n return modes.length === 1 ? [modes[0]] : modes;\n};\n\n/*\nTODO:\n- geometric mean\n- harmonic mean\n */\n\n// -------------------- DISPERSION ----------------------------\n\n/**\n * Dispersion: the average square distance from the mean.\n * Sum of (x - mean)^2 / N\n */\nexport const getVariance1 = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + ((val - mean) ** 2), 0);\n\n return setDecimalPlaces(sum / data.length, decimalPlaces);\n};\n\n/**\n * Another formula of dispersion - the average square distance from the mean.\n * (Sum of x^2) / N - (mean ^ 2)\n */\nexport const getVariance = (data: number[], decimalPlaces = Infinity) : number|undefined => {\n if(!data || data.length <= 0) return undefined;\n\n const mean = getArithmeticMean(data);\n if(mean === undefined) return undefined;\n\n const sum = data.reduce((acc, val) => acc + (val ** 2), 0);\n\n return setDecimalPlaces((sum / data.length) - (mean ** 2), decimalPlaces);\n};\n\n/**\n * \u03C3\n */\nexport const getStandardDeviation = (data: number[], decimalPlaces = Infinity) => {\n const variance = getVariance(data) ?? 0;\n return setDecimalPlaces(Math.sqrt(variance), decimalPlaces);\n};", "import { setDecimalPlaces } from './format';\nimport { getArithmeticMean, getStandardDeviation } from './statistics';\nimport { IMlNormalizeResult, IMlStandardizeResult } from '../types';\n\n// --------------------- NORMALIZE --------------------------------\n\n/**\n * Changes value to be in the range [0, 1].\n */\nexport const mlNormalizeValue = (value: number, min: number, max: number, decimalPlaces = Infinity) : number => {\n const diff = max - min;\n if(diff === 0) return 0;\n return setDecimalPlaces((value - min) / diff, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [0, 1].\n */\nexport const mlNormalizeArray = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n const copy = [...data];\n\n for(let i=0; i {\n const min = Math.min(...data);\n const max = Math.max(...data);\n const _data = mlNormalizeArray(data, min, max, decimalPlaces);\n\n return {\n min: setDecimalPlaces(min, decimalPlaces),\n max: setDecimalPlaces(max, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlNormalizeUnseenData = (data: number[], min: number, max: number, decimalPlaces = Infinity): number[] => {\n return mlNormalizeArray(data, min, max, decimalPlaces);\n};\n\n// --------------------- STANDARDIZE --------------------------------\n\n/**\n * Changes value to be in the range [-1, 1].\n */\nexport const mlStandardizeValue = (value: number, mean: number, stdDev: number, decimalPlaces = Infinity) : number => {\n if(stdDev === 0) return 0;\n return setDecimalPlaces((value - mean) / stdDev, decimalPlaces);\n};\n\n/**\n * Returns a copy of array, where each value will be in the range [-1, 1].\n */\nexport const mlStandardizeArray = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity) : number[] => {\n return [...data].map(value => mlStandardizeValue(value, mean, stdDev, decimalPlaces));\n};\n\nexport const mlStandardizeTestData = (data: number[], decimalPlaces = Infinity): IMlStandardizeResult => {\n const mean = getArithmeticMean(data) ?? 0;\n const stdDev = getStandardDeviation(data);\n const _data = mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n\n return {\n mean: setDecimalPlaces(mean, decimalPlaces),\n stdDev: setDecimalPlaces(stdDev, decimalPlaces),\n data: _data,\n };\n};\n\n/**\n * Alias.\n */\nexport const mlStandardizeUnseenData = (data: number[], mean: number, stdDev: number, decimalPlaces = Infinity): number[] => {\n return mlStandardizeArray(data, mean, stdDev, decimalPlaces);\n};", "/**\n * Sum of 1 to n numbers:\n * (n * (n + 1)) / 2\n */\nexport const naturalNumbersSum1ToN = (n: number): number => {\n return (n / 2) * (n + 1);\n};\n\n/**\n * Sum of m to n numbers.\n */\nexport const naturalNumbersSumMToN = (m: number, n: number): number => {\n return (n - m + 1) * (m + n) / 2;\n};", "/**\n * The simplest and straightforward method\n * but can become inefficient for extremely large numbers\n * due to growing computational time.\n */\nexport const factorialIterative = (n: number, start = 0): number => {\n\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n let result = 1;\n for (let i = start; i <= n; i++) {\n result *= i;\n }\n return result;\n};\n\n/**\n * A recursive approach is a classic method for calculating factorials\n * but can lead to stack overflow errors\n * for very large inputs because of deep recursion.\n * However, it's a direct translation\n * of the mathematical definition of factorial.\n */\nexport const factorialRecursive = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n // Base case: when n reaches start, return start instead of further reducing\n if (n === start) return start;\n\n // Recursive call\n return n * factorialRecursive(n - 1, start);\n};\n\n/**\n * Memoization (Top-Down Dynamic Programming).\n */\nexport const factorialMemoized = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === 0) {\n if (n === 0) {\n return 1; // 0! is defined as 1\n }\n else {\n start = 1; // Adjust start to 1 to prevent multiplication by zero\n }\n }\n\n const memo = new Map();\n\n const traverse = (num: number, end: number): number => {\n if (num < end) return 1; // Adjust the base case to return 1 if we're below 'end'\n // if (num === 0) return 1;\n\n if (memo.has(num)) return memo.get(num) ?? 1;\n\n if (num === end) {\n memo.set(num, num);\n return num;\n }\n\n const result = num * traverse(num - 1, end);\n\n memo.set(num, result);\n\n return result;\n };\n\n return traverse(n, start);\n};\n\n/**\n * Tabulation (Bottom-Up Dynamic Programming).\n */\nexport const factorial = (n: number, start = 0): number => {\n if (n < 0) {\n throw new Error('Factorial is not defined for negative numbers.');\n }\n\n if (start > n) {\n throw new Error('Start cannot be greater than n.');\n }\n\n if (start < 0) {\n throw new Error('Start must be non-negative.');\n }\n\n if (start === n) {\n return n === 0 ? 1 : n; // If start == n and n == 0, return 1 (0!), otherwise return n\n }\n\n if (start === 0) {\n start = 1;\n }\n\n const table = []; // new Array(n + 1);\n table[0] = 1;\n for (let i = 1; i <= n; i++) {\n table[i] = table[i - 1] * i;\n }\n return table[n] / table[start - 1];\n};", "import { factorial } from './factorial';\n\n/**\n * Permutations with repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - repetition is allowed\n *\n * Formula:\n * --------\n * n^r\n *\n * Intuition:\n * ----------\n * In other words, there are n possibilities for the first choice,\n * THEN there are n possibilities for the second choice, and so on,\n * multiplying each time.\n *\n * A Permutation is an ordered Combination.\n *\n * Example:\n * --------\n * Such as a lock that could be \"333\".\n */\nexport const permutationsWithRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return n ** r;\n};\n\n/**\n * Permutations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order matters\n * - no repetitions\n *\n * Formula:\n * --------\n * P(n,r) = n! / (n \u2212 r)!\n *\n * Intuition:\n * ----------\n * In this case, we have to reduce the number of available choices each time.\n * After choosing, say, number \"14\" we can't choose it again.\n * So, our first choice has 16 possibilities, and our next choice has 15 possibilities,\n * then 14, 13, 12, 11, ... etc.\n *\n * A Permutation is an ordered Combination.\n */\nexport const permutationsWithoutRepetition = (n: number, r: number) => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n return factorial(n, n - r + 1);\n};\n\n/**\n * Order doesn't matter.\n *\n * Example:\n * --------\n * Coins in your pocket (5, 5, 5, 10, 10).\n\nexport const combinationsWithRepetition = () => {\n\n};\n */\n\n/**\n * Combinations without repetitions:\n * - \"n\" is the number of things to choose from\n * - we choose \"r\" of them\n * - order doesn't matter\n * - no repetitions\n *\n * And is also known as the Binomial Coefficient.\n *\n * Formula:\n * --------\n * C(n, r) = C(n, n - r) = n! / (r! * (n\u2212r)!)\n *\n * Example:\n * --------\n * Such as lottery numbers (2, 14, 15, 27, 30, 33).\n *\n * Tabulation (Bottom-Up Dynamic Programming).\n * Time Complexity: \uD835\uDC42(n \u00D7 r)\n * Space Complexity: \uD835\uDC42(n \u00D7 r)\n */\nexport const combinationsWithoutRepetition = (n: number, r: number) : number => {\n if (n < 0 || r < 0) {\n throw new Error('Both n and r should be non-negative integers.');\n }\n if (!Number.isInteger(n) || !Number.isInteger(r)) {\n throw new Error('Both n and r should be integers.');\n }\n\n // Initialize a two-dimensional array (or matrix) [n + 1, r + 1].\n // The reason for n + 1 is to ensure that we can access indices directly equal to the value of n\n // without running out of bounds, as array indices start at 0.\n const dp = Array.from({ length: n + 1 }, () => Array(r + 1).fill(0));\n /*\n const dp: number[][] = [];\n for(let i=0; i<=n; i++) {\n dp[i] = [];\n for(let j=0; j<=r; j++) {\n dp[i][j] = 0;\n }\n }*/\n\n // Base cases: C(n, 0) = 1 and C(n, n) = 1 for any n.\n for (let i = 0; i <= n; i++) {\n dp[i][0] = 1;\n if (i <= r) {\n // Only fill this if i <= r to avoid filling non-existent cells\n dp[i][i] = 1;\n }\n }\n\n // Fill the table using the relation C(n, r) = C(n-1, r-1) + C(n-1, r)\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= Math.min(i, r); j++) { // Only compute up to the minimum of i and r\n dp[i][j] = dp[i-1][j-1] + dp[i-1][j];\n }\n }\n\n return dp[n][r];\n};\n\n"], + "mappings": "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", "names": ["index_esm_exports", "__export", "animate", "arithmeticSequenceSum", "circleCollide", "circleMovement", "circleMovementAfterMouse", "combinationsWithoutRepetition", "convertRange", "convexPolygonsCollide", "degreesToRadians", "doRangesOverlap", "dxArcCos", "dxArcCot", "dxArcSin", "dxArcTan", "dxCos", "dxCot", "dxPolynomial", "dxSin", "dxTan", "dxV2CubicBezierCurve", "dxV2QuadraticBezierCurve", "dxV3CubicBezierCurve", "dxV3QuadraticBezierCurve", "ellipseMovement", "ellipseMovementAfterMouse", "factorial", "factorialIterative", "factorialMemoized", "factorialRecursive", "getAnglesDistance", "getAnglesSub", "getArithmeticMean", "getArithmeticMeanFromFrequency", "getCircleCircumference", "getColorsDelta", "getEllipseCircumference", "getLinearEquationBy2Points", "getMedian", "getMode", "getRandom", "getRandomBoolean", "getRandomGrayscaleHSLColor", "getRandomHSLColor", "getRandomHSLColorWithHue", "getRandomHSLColorWithLightness", "getRandomHSLColorWithSaturation", "getRandomHSLColorWithinRanges", "getRandomHexColor", "getRandomInt", "getRandomItemFromArray", "getRandomRGBColor", "getShiftedHue", "getShiftedLightness", "getShiftedSaturation", "getSquareInCircleSide", "getStandardDeviation", "getV2Angle", "getV2AngleBetween", "getV2AngleInEllipse", "getV3AngleBetween", "getVNAngleBetween", "getVariance", "getVariance1", "guid", "hexToRgb", "hslToHex", "hslToRgb", "identity2", "identity3", "identity4", "identityN", "isAngleBetween", "isAngleInCircleArc", "isClockwise", "isNumber", "isSingularMatrix", "labToRgb", "linearEquation", "linearEquationSystem2", "linearEquationSystem3", "linearEquationSystemN", "lissajousCurve", "m2Adjugate", "m2AppendRow", "m2DeepCopy", "m2Determinant", "m2DivideScalar", "m2Inverse", "m2MulScalar", "m2PrependRow", "m2ReflectionOrigin", "m2ReflectionOriginH", "m2ReflectionX", "m2ReflectionXH", "m2ReflectionY", "m2ReflectionYH", "m2ReflectionYmX", "m2Reset", "m2RotateAroundPointH", "m2Rotation", "m2RotationAroundPointH", "m2RotationH", "m2Scale", "m2ScaleAtPointH", "m2ScaleAtPointHMatrix", "m2ScaleH", "m2ScaleX", "m2ScaleXH", "m2ScaleY", "m2ScaleYH", "m2ShearingX", "m2ShearingY", "m2Sub", "m2Sum", "m2ToCSS", "m2Translation", "m2TranslationH", "m2Transpose", "m2hToCSS", "m2hToCSS3d", "m2x2", "m3Adjugate", "m3AppendRow", "m3DeepCopy", "m3Determinant", "m3DivideScalar", "m3Inverse", "m3MulScalar", "m3PrependRow", "m3ReflectionOrigin", "m3ReflectionOriginH", "m3ReflectionXY", "m3ReflectionXYH", "m3ReflectionXZ", "m3ReflectionXZH", "m3ReflectionYZ", "m3ReflectionYZH", "m3Reset", "m3RotationX", "m3RotationXH", "m3RotationY", "m3RotationYH", "m3RotationZ", "m3RotationZH", "m3Scale", "m3ScaleH", "m3ScaleX", "m3ScaleXH", "m3ScaleY", "m3ScaleYH", "m3ScaleZ", "m3ScaleZH", "m3Sub", "m3Sum", "m3Translation", "m3TranslationH", "m3Transpose", "m3hToCSS3d", "m3x3", "m4x4", "mAdjugate", "mAppendCol", "mAppendRow", "mDeepCopy", "mDelFirstColumn", "mDelFirstRow", "mDelLastColumn", "mDelLastRow", "mDeterminant", "mDivideScalar", "mEqual", "mGetColumn", "mGetFirstColumn", "mGetLastColumn", "mInverse", "mMinor", "mMul", "mMulScalar", "mMulVector", "mNxM", "mPrependCol", "mPrependRow", "mReset", "mSub", "mSum", "mTranspose", "mlNormalizeArray", "mlNormalizeTestData", "mlNormalizeUnseenData", "mlNormalizeValue", "mlStandardizeArray", "mlStandardizeTestData", "mlStandardizeUnseenData", "mlStandardizeValue", "mod", "naturalNumbersSequenceSum", "naturalNumbersSum1ToN", "naturalNumbersSumMToN", "newId", "percentToAngle", "permutationsWithRepetition", "permutationsWithoutRepetition", "polarToCartesian", "radiansToDegrees", "rectCollide", "rgbToHex", "rgbToHsl", "rgbToLab", "setDecimalPlaces", "setV2Angle", "sineWaveMovement", "stringToNumber", "v2", "v2CubicBezierBBox", "v2CubicBezierCurve", "v2CubicBezierCurveExtrema", "v2CubicBezierCurveNormal", "v2CubicBezierCurveTangent", "v2Distance", "v2DivideScalar", "v2DotProduct", "v2FromPolarCoords", "v2GetNormal", "v2Length", "v2MulScalar", "v2Normalize", "v2QuadraticBezierBBox", "v2QuadraticBezierCurve", "v2QuadraticBezierCurveExtrema", "v2QuadraticBezierCurveNormal", "v2QuadraticBezierCurveTangent", "v2Rotate", "v2RotateH", "v2Scale", "v2SetLength", "v2Sub", "v2Sum", "v3", "v3CrossProduct", "v3CubicBezierCurve", "v3CubicBezierCurveTangent", "v3Distance", "v3DivideScalar", "v3DotProduct", "v3Length", "v3MulScalar", "v3Normalize", "v3QuadraticBezierCurve", "v3QuadraticBezierCurveTangent", "v3RotateX", "v3RotateY", "v3RotateZ", "v3Scale", "v3Sub", "v3Sum", "v4", "vDistance", "vDivideScalar", "vDotProduct", "vEqual", "vLength", "vMulScalar", "vN", "vNormalize", "vSub", "vSum", "__toCommonJS", "setDecimalPlaces", "num", "decimalPlaces", "coefficient", "__pow", "mod", "n", "m", "convertRange", "x", "a", "b", "c", "d", "doRangesOverlap", "isNumber", "value", "polarToCartesian", "center", "radii", "angleInRad", "decimalPlaces", "cx", "cy", "rx", "ry", "setDecimalPlaces", "getV2Angle", "v2", "decimalPlaces", "angle", "setDecimalPlaces", "getV2AngleInEllipse", "radii", "setV2Angle", "newAngleRad", "length", "v2Length", "radiansToDegrees", "radians", "res", "degreesToRadians", "degrees", "getVNAngleBetween", "vector1", "vector2", "unitVector1", "vNormalize", "unitVector2", "dotProduct", "vDotProduct", "getV2AngleBetween", "diff", "vSub", "getV3AngleBetween", "isAngleBetween", "angleDegrees", "startAngleDegrees", "endAngleDegrees", "distance", "getAnglesSub", "distance1", "distance2", "totalDistance", "isClockwise", "angle1Deg", "angle2Deg", "startAngleDeg", "angleDegrees1", "angleDegrees2", "angleDistance", "mod", "getAnglesDistance", "percentToAngle", "percent", "endAngleDeg", "circleStartAngle", "vSum", "vector1", "vector2", "decimalPlaces", "vector", "i", "setDecimalPlaces", "v2Sum", "v3Sum", "vSub", "v2Sub", "v3Sub", "vMulScalar", "v", "scalar", "v2MulScalar", "v2", "v3MulScalar", "v3", "vDivideScalar", "v2DivideScalar", "v3DivideScalar", "vLength", "sum", "v2Length", "v3Length", "v2SetLength", "newLength", "angle", "getV2Angle", "vDistance", "diff", "v2Distance", "v3Distance", "vNormalize", "length", "unitVector", "v2Normalize", "v3Normalize", "vDotProduct", "v2DotProduct", "v3DotProduct", "v3CrossProduct", "defaultValue", "v4", "vN", "N", "v2FromPolarCoords", "distance", "angleRad", "setV2Angle", "vEqual", "v2GetNormal", "sub", "mSum", "matrix1", "matrix2", "decimalPlaces", "matrix", "i", "vSum", "m2Sum", "m3Sum", "mSub", "vSub", "m2Sub", "m3Sub", "mMulScalar", "m", "scalar", "v", "vMulScalar", "m2MulScalar", "m2", "m3MulScalar", "m3", "mDivideScalar", "vDivideScalar", "m2DivideScalar", "m3DivideScalar", "mTranspose", "vectorsCount", "vectorLength", "j", "m2Transpose", "m3Transpose", "mReset", "defaultValue", "res", "size", "vector", "m2Reset", "m3Reset", "m2x2", "m3x3", "m4x4", "mNxM", "N", "M", "vN", "identity2", "identity3", "identity4", "identityN", "mDeepCopy", "m2DeepCopy", "m3DeepCopy", "mAppendCol", "col", "copy", "mPrependCol", "mAppendRow", "row", "m2AppendRow", "m3AppendRow", "mPrependRow", "m2PrependRow", "m3PrependRow", "mDelLastRow", "mDelFirstRow", "mDelLastColumn", "mDelFirstColumn", "mGetFirstColumn", "mGetLastColumn", "mGetColumn", "colIndex", "mMul", "transposed", "vector1", "vector2", "product", "vDotProduct", "mMulVector", "mEqual", "vEqual", "mMinorHelper", "mMinor", "mDeterminant", "m2Determinant", "d", "minor", "param", "m3Determinant", "m2Adjugate", "m3Adjugate", "mAdjugate", "cofactors", "sign", "isSingularMatrix", "m2Inverse", "adj", "m3Inverse", "mInverse", "m2ToCSS", "m", "a", "b", "c", "d", "m2hToCSS", "tx", "ty", "m2hToCSS3d", "m3hToCSS3d", "m2Translation", "position", "decimalPlaces", "setDecimalPlaces", "m3Translation", "m2TranslationH", "m3TranslationH", "m2Rotation", "angleRad", "isClockwise", "cos", "sin", "m2RotationH", "m2RotationAroundPointH", "transformOrigin", "translation", "rotation", "translationBack", "v3MulScalar", "temp1", "mMul", "m2RotateAroundPointH", "mat3h", "mMulVector", "v2Rotate", "vector", "unitVector", "v2Normalize", "v2RotateH", "v3Normalize", "m3RotationX", "m3RotationXH", "v3RotateX", "m3RotationY", "m3RotationYH", "v3RotateY", "m3RotationZ", "m3RotationZH", "v3RotateZ", "m2ScaleAtPointHMatrix", "scaleVector", "scale", "m2ScaleH", "m2ScaleAtPointH", "point", "m2Scale", "v2Scale", "m3Scale", "m3ScaleH", "v3Scale", "m2ScaleX", "m2ScaleXH", "m3ScaleX", "m3ScaleXH", "m3ScaleY", "m3ScaleYH", "m3ScaleZ", "m3ScaleZH", "m2ScaleY", "m2ScaleYH", "m2ReflectionOrigin", "m2ReflectionOriginH", "m3ReflectionOrigin", "m3ReflectionOriginH", "m2ReflectionYmX", "m2ReflectionX", "m2ReflectionXH", "m2ReflectionY", "m2ReflectionYH", "m3ReflectionYZ", "m3ReflectionYZH", "m3ReflectionXZ", "m3ReflectionXZH", "m3ReflectionXY", "m3ReflectionXYH", "m2ShearingY", "factor", "m2ShearingX", "getRandom", "min", "max", "decimalPlaces", "setDecimalPlaces", "getRandomInt", "getRandomBoolean", "getRandomItemFromArray", "array", "randomIndex", "stringToNumber", "value", "defaultNumber", "_a", "res", "dxPolynomial", "x", "polynomial", "decimalPlaces", "res", "part", "coeff", "power", "setDecimalPlaces", "dxV2QuadraticBezierCurve", "startControlPoint", "centerControlPoint", "endControlPoint", "temp1", "temp2", "temp3", "dxV3QuadraticBezierCurve", "dxV2CubicBezierCurve", "center1ControlPoint", "center2ControlPoint", "temp4", "dxV3CubicBezierCurve", "dxSin", "dxCos", "dxTan", "__pow", "dxCot", "dxArcSin", "dxArcCos", "dxArcTan", "dxArcCot", "linearEquation", "equation", "decimalPlaces", "a", "b", "diff", "setDecimalPlaces", "linearEquationSystem2", "equation1", "equation2", "equationParams", "inversed", "m2Inverse", "equationResults", "mMulVector", "linearEquationSystem3", "equation3", "m3Inverse", "linearEquationSystemN", "equations", "mDelLastColumn", "mInverse", "mGetLastColumn", "getLinearEquationBy2Points", "point1", "point2", "deltaX", "deltaY", "v2Sub", "x", "y", "m", "formula", "quadraticEquation", "equation", "decimalPlaces", "a", "b", "c", "d", "res", "linearEquation", "isNumber", "diff", "discriminant", "setDecimalPlaces", "t1", "t2", "v2QuadraticBezierCurve", "startControlPoint", "centerControlPoint", "endControlPoint", "decimalPlaces", "temp1", "temp2", "temp3", "setDecimalPlaces", "v3QuadraticBezierCurve", "v2CubicBezierCurve", "center1ControlPoint", "center2ControlPoint", "temp4", "v3CubicBezierCurve", "v2QuadraticBezierCurveTangent", "dxVector", "dxV2QuadraticBezierCurve", "v2Normalize", "v3QuadraticBezierCurveTangent", "dxV3QuadraticBezierCurve", "v3Normalize", "v2CubicBezierCurveTangent", "dxV2CubicBezierCurve", "v3CubicBezierCurveTangent", "dxV3CubicBezierCurve", "v2QuadraticBezierCurveNormal", "tangent", "v2CubicBezierCurveNormal", "v2QuadraticBezierCurveExtrema", "a1", "b1", "res1", "linearEquation", "a2", "b2", "res2", "res", "isNumber", "v2CubicBezierCurveExtrema", "c1", "equation1", "c2", "equation2", "quadraticEquation", "num", "v2QuadraticBezierBBox", "extrema", "minX", "minY", "maxX", "maxY", "percent", "point", "x", "y", "v2CubicBezierBBox", "circleMovement", "center", "angle", "radius", "circleMovementAfterMouse", "mouse", "vector", "v2Sub", "getV2Angle", "convertRange", "ellipseMovement", "radius1", "radius2", "ellipseMovementAfterMouse", "radii", "sineWaveMovement", "x", "amplitude", "frequency", "phase", "y", "lissajousCurve", "width", "height", "t", "k", "n", "m", "p", "getRandomRGBColor", "hslColor", "getRandomHSLColor", "hslToRgb", "getRandomHexColor", "hslToHex", "h", "getRandom", "s", "l", "getRandomHSLColorWithHue", "getRandomHSLColorWithSaturation", "getRandomHSLColorWithLightness", "getRandomGrayscaleHSLColor", "getRandomHSLColorWithinRanges", "hueStart", "hueEnd", "saturationStart", "saturationEnd", "lightStart", "lightEnd", "convertHueToDegrees", "getHue", "r", "g", "b", "min", "max", "diff", "getLuminance", "getSaturation", "rgbToHsl", "rgb", "decimalPlaces", "setDecimalPlaces", "hslToRgbHelper", "helper1", "helper2", "colorHelper", "hsl", "gray", "rHelper", "gHelper", "bHelper", "hue2rgb", "q", "t", "p", "toHex", "hex", "rgbToHex", "hexToRgb", "shorthandRegex", "_hex", "_m", "result", "rgbToLab", "x", "y", "z", "labToRgb", "lab", "getShiftedHue", "color", "shift", "hue", "mod", "getShiftedLightness", "lightness", "getShiftedSaturation", "saturation", "getColorsDelta", "rgbA", "rgbB", "labA", "labB", "deltaL", "deltaA", "deltaB", "c1", "c2", "deltaC", "deltaH", "sc", "sh", "deltaLKlsl", "deltaCkcsc", "deltaHkhsh", "i", "guid", "c", "newId", "rectCollide", "rect1", "rect2", "circleCollide", "circle1", "circle2", "dx", "dy", "getEdges", "poly", "edges", "i", "nextIndex", "mod", "edge", "convexPolygonsCollide", "poly1", "poly2", "normal", "v2GetNormal", "p1Proj", "projectPolygon", "p2Proj", "polygon", "min", "max", "vertex", "projection", "v2DotProduct", "animate", "props", "_duration", "startTime", "animationId", "elapsed", "previousTimeStamp", "animating", "observer", "stop", "restart", "start", "pause", "resume", "step", "timeStamp", "getResult", "observerHandler", "_entries", "_observer", "getElapsedTime", "isAnimating", "getStartTime", "getPercent", "getResizeObserver", "getCircleCircumference", "radius", "decimalPlaces", "setDecimalPlaces", "getEllipseCircumference", "radius1", "radius2", "__pow", "isAngleInCircleArc", "startAngleDeg", "endAngleDeg", "currentDegrees", "getSquareInCircleSide", "naturalNumbersSequenceSum", "n", "arithmeticSequenceSum", "a", "d", "getArithmeticMean", "data", "decimalPlaces", "sum", "acc", "val", "setDecimalPlaces", "getArithmeticMeanFromFrequency", "frequencyMap", "mean", "frequency", "getMedian", "copy", "num1", "num2", "mid", "getMode", "num", "maxFrequency", "modes", "getVariance1", "__pow", "getVariance", "getStandardDeviation", "_a", "variance", "mlNormalizeValue", "value", "min", "max", "decimalPlaces", "diff", "setDecimalPlaces", "mlNormalizeArray", "data", "copy", "mlNormalizeTestData", "_data", "mlNormalizeUnseenData", "mlStandardizeValue", "mean", "stdDev", "mlStandardizeArray", "mlStandardizeTestData", "_a", "getArithmeticMean", "getStandardDeviation", "mlStandardizeUnseenData", "naturalNumbersSum1ToN", "n", "naturalNumbersSumMToN", "m", "factorialIterative", "n", "start", "result", "i", "factorialRecursive", "factorialMemoized", "memo", "traverse", "num", "end", "_a", "factorial", "table", "permutationsWithRepetition", "n", "__pow", "permutationsWithoutRepetition", "factorial", "combinationsWithoutRepetition", "dp", "i", "j"] } diff --git a/src/main/combinatorics/combinatorics.ts b/src/main/combinatorics/combinatorics.ts index 72162bb..7f7cadf 100644 --- a/src/main/combinatorics/combinatorics.ts +++ b/src/main/combinatorics/combinatorics.ts @@ -93,6 +93,10 @@ export const combinationsWithRepetition = () => { * Example: * -------- * Such as lottery numbers (2, 14, 15, 27, 30, 33). + * + * Tabulation (Bottom-Up Dynamic Programming). + * Time Complexity: 𝑂(n × r) + * Space Complexity: 𝑂(n × r) */ export const combinationsWithoutRepetition = (n: number, r: number) : number => { if (n < 0 || r < 0) {