@khanacademy/kmath 2.0.9 → 2.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/es/index.js CHANGED
@@ -3,7 +3,7 @@ import _ from 'underscore';
3
3
  import { approximateEqual, approximateDeepEqual } from '@khanacademy/perseus-core';
4
4
  import $ from 'jquery';
5
5
 
6
- const libName="@khanacademy/kmath";const libVersion="2.0.9";addLibraryVersionToPerseusDebug(libName,libVersion);
6
+ const libName="@khanacademy/kmath";const libVersion="2.0.11";addLibraryVersionToPerseusDebug(libName,libVersion);
7
7
 
8
8
  const DEFAULT_TOLERANCE=1e-9;const EPSILON=Math.pow(2,-42);function is$2(x){return _.isNumber(x)&&!_.isNaN(x)}function equal$4(x,y,tolerance){if(x==null||y==null){return x===y}if(x===y){return true}if(tolerance==null){tolerance=DEFAULT_TOLERANCE;}return Math.abs(x-y)<tolerance}function sign$1(x,tolerance){return equal$4(x,0,tolerance)?0:Math.abs(x)/x}function isInteger(num,tolerance){return equal$4(Math.round(num),num,tolerance)}function round$2(num,precision){const factor=Math.pow(10,precision);return Math.round(num*factor)/factor}function roundTo$2(num,increment){return Math.round(num/increment)*increment}function floorTo$2(num,increment){return Math.floor(num/increment)*increment}function ceilTo$2(num,increment){return Math.ceil(num/increment)*increment}function toFraction(decimal,tolerance=EPSILON,maxDenominator=1e3){let n=[1,0];let d=[0,1];let a=Math.floor(decimal);let rem=decimal-a;while(d[0]<=maxDenominator){if(equal$4(n[0]/d[0],decimal,tolerance)){return [n[0],d[0]]}n=[a*n[0]+n[1],n[0]];d=[a*d[0]+d[1],d[0]];a=Math.floor(1/rem);rem=1/rem-a;}return [decimal,1]}
9
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/version.ts","../../src/number.ts","../../src/vector.ts","../../src/point.ts","../../src/line.ts","../../src/ray.ts","../../src/math.ts","../../src/geometry.ts","../../src/angles.ts","../../src/coefficients.ts"],"sourcesContent":["// This file is processed by a Rollup plugin (replace) to inject the production\n// version number during the release build.\n// In dev, you'll never see the version number.\n\nimport {addLibraryVersionToPerseusDebug} from \"@khanacademy/perseus-utils\";\n\nconst libName = \"@khanacademy/kmath\";\nexport const libVersion = \"__lib_version__\";\n\naddLibraryVersionToPerseusDebug(libName, libVersion);\n","/**\n * Number Utils\n * A number is a js-number, e.g. 5.12\n */\n\nimport _ from \"underscore\";\n\nexport const DEFAULT_TOLERANCE = 1e-9;\n\n// TODO: Should this just be Number.Epsilon\nexport const EPSILON: number = Math.pow(2, -42);\n\nexport function is(x: any): boolean {\n return _.isNumber(x) && !_.isNaN(x);\n}\n\nexport function equal(x: number, y: number, tolerance?: number): boolean {\n // Checking for undefined makes this function behave nicely\n // with vectors of different lengths that are _.zip'd together\n if (x == null || y == null) {\n return x === y;\n }\n // We check === here so that +/-Infinity comparisons work correctly\n if (x === y) {\n return true;\n }\n if (tolerance == null) {\n tolerance = DEFAULT_TOLERANCE;\n }\n return Math.abs(x - y) < tolerance;\n}\n\nexport function sign(\n x: number,\n tolerance?: number,\n): number /* Should be: 0 | 1 | -1 */ {\n return equal(x, 0, tolerance) ? 0 : Math.abs(x) / x;\n}\n\nexport function isInteger(num: number, tolerance?: number): boolean {\n return equal(Math.round(num), num, tolerance);\n}\n\n// Round a number to a certain number of decimal places\nexport function round(num: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round(num * factor) / factor;\n}\n\n// Round num to the nearest multiple of increment\n// i.e. roundTo(83, 5) -> 85\nexport function roundTo(num: number, increment: number): number {\n return Math.round(num / increment) * increment;\n}\n\nexport function floorTo(num: number, increment: number): number {\n return Math.floor(num / increment) * increment;\n}\n\nexport function ceilTo(num: number, increment: number): number {\n return Math.ceil(num / increment) * increment;\n}\n\n/**\n * toFraction\n *\n * Returns a [numerator, denominator] array rational representation\n * of `decimal`\n *\n * See http://en.wikipedia.org/wiki/Continued_fraction for implementation\n * details\n *\n * toFraction(4/8) => [1, 2]\n * toFraction(0.66) => [33, 50]\n * toFraction(0.66, 0.01) => [2/3]\n * toFraction(283 + 1/3) => [850, 3]\n */\nexport function toFraction(\n decimal: number,\n // can't be 0\n tolerance: number = EPSILON,\n maxDenominator = 1000,\n): [number, number] {\n // Initialize everything to compute successive terms of\n // continued-fraction approximations via recurrence relation\n let n = [1, 0];\n let d = [0, 1];\n let a = Math.floor(decimal);\n let rem = decimal - a;\n\n while (d[0] <= maxDenominator) {\n if (equal(n[0] / d[0], decimal, tolerance)) {\n return [n[0], d[0]];\n }\n n = [a * n[0] + n[1], n[0]];\n d = [a * d[0] + d[1], d[0]];\n a = Math.floor(1 / rem);\n rem = 1 / rem - a;\n }\n\n // We failed to find a nice rational representation,\n // so return an irrational \"fraction\"\n return [decimal, 1];\n}\n","/**\n * Vector Utils\n * A vector is an array of numbers e.g. [0, 3, 4].\n */\n\nimport * as knumber from \"./number\";\n\ntype Vector = ReadonlyArray<number>;\n\nfunction arraySum(array: ReadonlyArray<number>): number {\n return array.reduce((memo, arg) => memo + arg, 0);\n}\n\nfunction arrayProduct(array: ReadonlyArray<number>): number {\n return array.reduce((memo, arg) => memo * arg, 1);\n}\n\nexport function zip<T>(xs: ReadonlyArray<T>, ys: ReadonlyArray<T>): [T, T][];\nexport function zip<T>(...arrays: ReadonlyArray<T>[]): T[][];\nexport function zip<T>(...arrays: ReadonlyArray<T>[]): T[][] {\n const n = Math.min(...arrays.map((a) => a.length));\n const results: T[][] = [];\n for (let i = 0; i < n; i++) {\n results.push(arrays.map((a) => a[i]));\n }\n return results;\n}\n\nexport function map<T, U>(pair: [T, T], f: (a: T, i: number) => U): [U, U] {\n return [f(pair[0], 0), f(pair[1], 1)];\n}\n\n/**\n * Checks if the given vector contains only numbers and, optionally, is of the\n * right dimension (length).\n *\n * is([1, 2, 3]) -> true\n * is([1, \"Hello\", 3]) -> false\n * is([1, 2, 3], 1) -> false\n */\nexport function is(vec: unknown, dimension: 2): vec is [number, number];\nexport function is(vec: unknown, dimension?: number): vec is Vector;\nexport function is(vec: unknown, dimension?: number) {\n if (!Array.isArray(vec)) {\n return false;\n }\n if (dimension !== undefined && vec.length !== dimension) {\n return false;\n }\n return vec.every(knumber.is);\n}\n\n// Normalize to a unit vector\nexport function normalize<V extends Vector>(v: V): V {\n return scale(v, 1 / length(v));\n}\n\n// Length/magnitude of a vector\nexport function length(v: Vector): number {\n return Math.sqrt(dot(v, v));\n}\n// Dot product of two vectors\nexport function dot(a: Vector, b: Vector): number {\n const zipped = zip(a, b);\n const multiplied = zipped.map(arrayProduct);\n return arraySum(multiplied);\n}\n\n/* vector-add multiple [x, y] coords/vectors\n *\n * add([1, 2], [3, 4]) -> [4, 6]\n */\nexport function add<V extends Vector>(...vecs: ReadonlyArray<V>): V {\n const zipped = zip(...vecs);\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return zipped.map(arraySum);\n}\n\nexport function subtract<V extends Vector>(v1: V, v2: V): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return zip(v1, v2).map((dim) => dim[0] - dim[1]);\n}\n\nexport function negate<V extends Vector>(v: V): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return v.map((x) => {\n return -x;\n });\n}\n\n// Scale a vector\nexport function scale<V extends Vector>(v1: V, scalar: number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return v1.map((x) => {\n return x * scalar;\n });\n}\n\nexport function equal(v1: Vector, v2: Vector, tolerance?: number): boolean {\n return (\n v1.length === v2.length &&\n zip(v1, v2).every((pair) => knumber.equal(pair[0], pair[1], tolerance))\n );\n}\n\nexport function codirectional(\n v1: Vector,\n v2: Vector,\n tolerance?: number,\n): boolean {\n // The origin is trivially codirectional with all other vectors.\n // This gives nice semantics for codirectionality between points when\n // comparing their difference vectors.\n if (\n knumber.equal(length(v1), 0, tolerance) ||\n knumber.equal(length(v2), 0, tolerance)\n ) {\n return true;\n }\n\n v1 = normalize(v1);\n v2 = normalize(v2);\n\n return equal(v1, v2, tolerance);\n}\n\nexport function collinear(v1: Vector, v2: Vector, tolerance?: number): boolean {\n return (\n codirectional(v1, v2, tolerance) ||\n codirectional(v1, negate(v2), tolerance)\n );\n}\n\n// TODO(jeremy) These coordinate conversion functions really only handle 2D points (ie. [number, number])\n\n// Convert a cartesian coordinate into a radian polar coordinate\nexport function polarRadFromCart(\n v: ReadonlyArray<number>,\n): ReadonlyArray<number> {\n const radius = length(v);\n let theta = Math.atan2(v[1], v[0]);\n\n // Convert angle range from [-pi, pi] to [0, 2pi]\n if (theta < 0) {\n theta += 2 * Math.PI;\n }\n\n return [radius, theta];\n}\n\n// Converts a cartesian coordinate into a degree polar coordinate\nexport function polarDegFromCart(\n v: ReadonlyArray<number>,\n): ReadonlyArray<number> /* TODO: convert to tuple/Point */ {\n const polar = polarRadFromCart(v);\n return [polar[0], (polar[1] * 180) / Math.PI];\n}\n\n/* Convert a polar coordinate into a cartesian coordinate\n *\n * Examples:\n * cartFromPolarRad(5, Math.PI)\n */\nexport function cartFromPolarRad(\n radius: number,\n theta = 0,\n): ReadonlyArray<number> /* TODO: convert to tuple/Point */ {\n return [radius * Math.cos(theta), radius * Math.sin(theta)];\n}\n\n/* Convert a polar coordinate into a cartesian coordinate\n *\n * Examples:\n * cartFromPolarDeg(5, 30)\n */\nexport function cartFromPolarDeg(\n radius: number,\n theta = 0,\n): ReadonlyArray<number> {\n return cartFromPolarRad(radius, (theta * Math.PI) / 180);\n}\n\n// Rotate vector\nexport function rotateRad(\n v: ReadonlyArray<number>,\n theta: number,\n): ReadonlyArray<number> {\n const polar = polarRadFromCart(v);\n const angle = polar[1] + theta;\n return cartFromPolarRad(polar[0], angle);\n}\n\nexport function rotateDeg(\n v: ReadonlyArray<number>,\n theta: number,\n): ReadonlyArray<number> {\n const polar = polarDegFromCart(v);\n const angle = polar[1] + theta;\n return cartFromPolarDeg(polar[0], angle);\n}\n\n// Angle between two vectors\nexport function angleRad(v1: Vector, v2: Vector): number {\n return Math.acos(dot(v1, v2) / (length(v1) * length(v2)));\n}\n\nexport function angleDeg(v1: Vector, v2: Vector): number {\n return (angleRad(v1, v2) * 180) / Math.PI;\n}\n\n// Vector projection of v1 onto v2\nexport function projection<V extends Vector>(v1: V, v2: V): V {\n const scalar = dot(v1, v2) / dot(v2, v2);\n return scale(v2, scalar);\n}\n\n// Round each number to a certain number of decimal places\nexport function round<V extends Vector>(vec: V, precision: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) => knumber.round(elem, precision[i] || precision));\n}\n\n// Round each number to the nearest increment\nexport function roundTo(\n coord: [number, number],\n increment: [number, number] | number,\n): [number, number];\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V;\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.roundTo(elem, increment[i] || increment),\n );\n}\n\nexport function floorTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.floorTo(elem, increment[i] || increment),\n );\n}\n\nexport function ceilTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.ceilTo(elem, increment[i] || increment),\n );\n}\n","/**\n * Point Utils\n * A point is an array of two numbers e.g. [0, 0].\n */\n\nimport * as knumber from \"./number\";\nimport * as kvector from \"./vector\";\n\n// A point, in 2D, 3D, or nD space.\nexport type Point = ReadonlyArray<number>;\n\n// Rotate point (around origin unless a center is specified)\nexport function rotateRad(point: Point, theta: number, center?: Point): Point {\n if (center === undefined) {\n return kvector.rotateRad(point, theta);\n } else {\n return kvector.add(\n center,\n kvector.rotateRad(kvector.subtract(point, center), theta),\n );\n }\n}\n\nexport function rotateDeg(point: Point, theta: number, center?: Point): Point {\n if (center === undefined) {\n return kvector.rotateDeg(point, theta);\n } else {\n return kvector.add(\n center,\n kvector.rotateDeg(kvector.subtract(point, center), theta),\n );\n }\n}\n\n// Distance between two points\nexport function distanceToPoint(point1: Point, point2: Point): number {\n return kvector.length(kvector.subtract(point1, point2));\n}\n\n// Distance between point and line\nexport function distanceToLine(point: Point, line: [Point, Point]): number {\n const lv = kvector.subtract(line[1], line[0]);\n const pv = kvector.subtract(point, line[0]);\n const projectedPv = kvector.projection(pv, lv);\n const distancePv = kvector.subtract(projectedPv, pv);\n return kvector.length(distancePv);\n}\n\n// Reflect point over line\nexport function reflectOverLine<P extends Point>(point: P, line: [P, P]): P {\n const lv = kvector.subtract(line[1], line[0]);\n const pv = kvector.subtract(point, line[0]);\n const projectedPv = kvector.projection(pv, lv);\n const reflectedPv = kvector.subtract(kvector.scale(projectedPv, 2), pv);\n return kvector.add(line[0], reflectedPv);\n}\n\n/**\n * Compares two points, returning -1, 0, or 1, for use with\n * Array.prototype.sort\n *\n * Note: This technically doesn't satisfy the total-ordering\n * requirements of Array.prototype.sort unless equalityTolerance\n * is 0. In some cases very close points that compare within a\n * few equalityTolerances could appear in the wrong order.\n */\nexport function compare(\n point1: Point,\n point2: Point,\n equalityTolerance?: number,\n): number /* TODO: convert to -1 | 0 | 1 type */ {\n if (point1.length !== point2.length) {\n return point1.length - point2.length;\n }\n for (let i = 0; i < point1.length; i++) {\n if (!knumber.equal(point1[i], point2[i], equalityTolerance)) {\n return point1[i] - point2[i];\n }\n }\n return 0;\n}\n\n// Check if a value is a point\nexport const is = kvector.is;\n\n// Add and subtract vector(s)\nexport const addVector = kvector.add;\nexport const addVectors = kvector.add;\nexport const subtractVector = kvector.subtract;\nexport const equal = kvector.equal;\n\n// Convert from cartesian to polar and back\nexport const polarRadFromCart = kvector.polarRadFromCart;\nexport const polarDegFromCart = kvector.polarDegFromCart;\nexport const cartFromPolarRad = kvector.cartFromPolarRad;\nexport const cartFromPolarDeg = kvector.cartFromPolarDeg;\n\n// Rounding\nexport const round = kvector.round;\nexport const roundTo = kvector.roundTo;\nexport const floorTo = kvector.floorTo;\nexport const ceilTo = kvector.ceilTo;\n","/**\n * Line Utils\n * A line is an array of two points e.g. [[-5, 0], [5, 0]].\n */\n\nimport * as kpoint from \"./point\";\nimport * as kvector from \"./vector\";\n\nimport type {Point} from \"./point\";\n\nexport type Line = [Point, Point];\n\nexport function distanceToPoint(line: Line, point: Point): number {\n return kpoint.distanceToLine(point, line);\n}\n\nexport function reflectPoint(line: Line, point: Point): Point {\n return kpoint.reflectOverLine(point, line);\n}\n\nexport function midpoint(line: Line): Point {\n return [(line[0][0] + line[1][0]) / 2, (line[0][1] + line[1][1]) / 2];\n}\n\nexport function equal(line1: Line, line2: Line, tolerance?: number): boolean {\n // TODO: A nicer implementation might just check collinearity of\n // vectors using underscore magick\n // Compare the directions of the lines\n const v1 = kvector.subtract(line1[1], line1[0]);\n const v2 = kvector.subtract(line2[1], line2[0]);\n if (!kvector.collinear(v1, v2, tolerance)) {\n return false;\n }\n // If the start point is the same for the two lines, then they are the same\n if (kpoint.equal(line1[0], line2[0])) {\n return true;\n }\n // Make sure that the direction to get from line1 to\n // line2 is the same as the direction of the lines\n const line1ToLine2Vector = kvector.subtract(line2[0], line1[0]);\n return kvector.collinear(v1, line1ToLine2Vector, tolerance);\n}\n","/**\n * Ray Utils\n * A ray (→) is an array of an endpoint and another point along the ray.\n * For example, [[0, 0], [1, 0]] is the ray starting at the origin and\n * traveling along the positive x-axis.\n */\n\nimport * as kpoint from \"./point\";\nimport * as kvector from \"./vector\";\n\nimport type {Point} from \"./point\";\n\nexport type Ray = [Point, Point];\n\nexport function equal(ray1: Ray, ray2: Ray, tolerance?: number): boolean {\n // Compare the directions of the rays\n const v1 = kvector.subtract(ray1[1], ray1[0]);\n const v2 = kvector.subtract(ray2[1], ray2[0]);\n\n const sameOrigin = kpoint.equal(ray1[0], ray2[0]);\n const codirectional = kvector.codirectional(v1, v2, tolerance);\n\n return sameOrigin && codirectional;\n}\n","import $ from \"jquery\";\nimport _ from \"underscore\";\n\nimport * as knumber from \"./number\";\n\nimport type {MathFormat} from \"@khanacademy/perseus-core\";\n\nconst KhanMath = {\n // Simplify formulas before display\n cleanMath: function (expr: string): string {\n return typeof expr === \"string\"\n ? expr\n .replace(/\\+\\s*-/g, \"- \")\n .replace(/-\\s*-/g, \"+ \")\n .replace(/\\^1/g, \"\")\n : expr;\n },\n\n // Bound a number by 1e-6 and 1e20 to avoid exponents after toString\n bound: function (num: number): number {\n if (num === 0) {\n return num;\n }\n if (num < 0) {\n return -KhanMath.bound(-num);\n }\n return Math.max(1e-6, Math.min(num, 1e20));\n },\n\n factorial: function (x: number): number {\n if (x <= 1) {\n return x;\n }\n return x * KhanMath.factorial(x - 1);\n },\n\n getGCD: function (a: number, b: number): number {\n if (arguments.length > 2) {\n // TODO(kevinb): rewrite using rest args instead of arguments\n // eslint-disable-next-line prefer-rest-params\n const rest = [].slice.call(arguments, 1);\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return KhanMath.getGCD(a, KhanMath.getGCD(...rest));\n }\n let mod;\n\n a = Math.abs(a);\n b = Math.abs(b);\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n while (b) {\n mod = a % b;\n a = b;\n b = mod;\n }\n\n return a;\n },\n\n getLCM: function (a: number, b: number): number {\n if (arguments.length > 2) {\n // TODO(kevinb): rewrite using rest args instead of arguments\n // eslint-disable-next-line prefer-rest-params\n const rest = [].slice.call(arguments, 1);\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return KhanMath.getLCM(a, KhanMath.getLCM(...rest));\n }\n return Math.abs(a * b) / KhanMath.getGCD(a, b);\n },\n\n primes: [\n 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,\n 71, 73, 79, 83, 89, 97,\n ],\n\n isPrime: function (n: number): boolean {\n if (n <= 1) {\n return false;\n }\n if (n < 101) {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n return !!$.grep(KhanMath.primes, function (p, i) {\n return Math.abs(p - n) <= 0.5;\n }).length;\n }\n if (n <= 1 || (n > 2 && n % 2 === 0)) {\n return false;\n }\n for (let i = 3, sqrt = Math.sqrt(n); i <= sqrt; i += 2) {\n if (n % i === 0) {\n return false;\n }\n }\n\n return true;\n },\n // @ts-expect-error - TS2366 - Function lacks ending return statement and return type does not include 'undefined'.\n getPrimeFactorization: function (number: number): ReadonlyArray<number> {\n if (number === 1) {\n return [];\n }\n if (KhanMath.isPrime(number)) {\n return [number];\n }\n\n const maxf = Math.sqrt(number);\n for (let f = 2; f <= maxf; f++) {\n if (number % f === 0) {\n return $.merge(\n KhanMath.getPrimeFactorization(f),\n KhanMath.getPrimeFactorization(number / f),\n );\n }\n }\n },\n\n // Round a number to the nearest increment\n // E.g., if increment = 30 and num = 40, return 30. if increment = 30 and\n // num = 45, return 60.\n roundToNearest: function (increment: number, num: number): number {\n return Math.round(num / increment) * increment;\n },\n\n // Round a number to a certain number of decimal places\n roundTo: function (precision: number, num: number): number {\n const factor = Math.pow(10, precision).toFixed(5);\n // @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type 'number'. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.\n return Math.round((num * factor).toFixed(5)) / factor;\n },\n\n /**\n * Return a string of num rounded to a fixed precision decimal places,\n * with an approx symbol if num had to be rounded, and trailing 0s\n */\n toFixedApprox: function (num: number, precision: number): string {\n // TODO(aria): Make this locale-dependent\n const fixedStr = num.toFixed(precision);\n if (knumber.equal(+fixedStr, num)) {\n return fixedStr;\n }\n return \"\\\\approx \" + fixedStr;\n },\n\n /**\n * Return a string of num rounded to precision decimal places, with an\n * approx symbol if num had to be rounded, but no trailing 0s if it was\n * not rounded.\n */\n roundToApprox: function (num: number, precision: number): string {\n const fixed = KhanMath.roundTo(precision, num);\n if (knumber.equal(fixed, num)) {\n return String(fixed);\n }\n return KhanMath.toFixedApprox(num, precision);\n },\n\n // toFraction(4/8) => [1, 2]\n // toFraction(0.666) => [333, 500]\n // toFraction(0.666, 0.001) => [2, 3]\n //\n // tolerance can't be bigger than 1, sorry\n toFraction: function (\n decimal: number,\n tolerance?: number,\n ): [number, number] {\n if (tolerance == null) {\n tolerance = Math.pow(2, -46);\n }\n\n if (decimal < 0 || decimal > 1) {\n let fract = decimal % 1;\n fract += fract < 0 ? 1 : 0;\n\n const nd = KhanMath.toFraction(fract, tolerance);\n nd[0] += Math.round(decimal - fract) * nd[1];\n return nd;\n }\n if (Math.abs(Math.round(Number(decimal)) - decimal) <= tolerance) {\n return [Math.round(decimal), 1];\n }\n let loN = 0;\n let loD = 1;\n let hiN = 1;\n let hiD = 1;\n let midN = 1;\n let midD = 2;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (Math.abs(Number(midN / midD) - decimal) <= tolerance) {\n return [midN, midD];\n }\n if (midN / midD < decimal) {\n loN = midN;\n loD = midD;\n } else {\n hiN = midN;\n hiD = midD;\n }\n\n midN = loN + hiN;\n midD = loD + hiD;\n }\n },\n\n // Returns the format (string) of a given numeric string\n // Note: purposively more inclusive than answer-types' predicate.forms\n // That is, it is not necessarily true that interpreted input are numeric\n getNumericFormat: function (text: string): MathFormat | null | undefined {\n text = $.trim(text);\n text = text.replace(/\\u2212/, \"-\").replace(/([+-])\\s+/g, \"$1\");\n if (text.match(/^[+-]?\\d+$/)) {\n return \"integer\";\n }\n if (text.match(/^[+-]?\\d+\\s+\\d+\\s*\\/\\s*\\d+$/)) {\n return \"mixed\";\n }\n const fraction = text.match(/^[+-]?(\\d+)\\s*\\/\\s*(\\d+)$/);\n if (fraction) {\n return parseFloat(fraction[1]) > parseFloat(fraction[2])\n ? \"improper\"\n : \"proper\";\n }\n if (text.replace(/[,. ]/g, \"\").match(/^\\d+$/)) {\n return \"decimal\";\n }\n if (text.match(/(pi?|\\u03c0|t(?:au)?|\\u03c4|pau)/)) {\n return \"pi\";\n }\n return null;\n },\n\n // Returns a string of the number in a specified format\n toNumericString: function (number: number, format?: MathFormat): string {\n if (number == null) {\n return \"\";\n }\n if (number === 0) {\n return \"0\"; // otherwise it might end up as 0% or 0pi\n }\n\n if (format === \"percent\") {\n return number * 100 + \"%\";\n }\n\n if (format === \"pi\") {\n const fraction = knumber.toFraction(number / Math.PI);\n const numerator = Math.abs(fraction[0]);\n const denominator = fraction[1];\n if (knumber.isInteger(numerator)) {\n const sign = number < 0 ? \"-\" : \"\";\n const pi = \"\\u03C0\";\n return (\n sign +\n (numerator === 1 ? \"\" : numerator) +\n pi +\n (denominator === 1 ? \"\" : \"/\" + denominator)\n );\n }\n }\n\n if (_([\"proper\", \"improper\", \"mixed\", \"fraction\"]).contains(format)) {\n const fraction = knumber.toFraction(number);\n const numerator = Math.abs(fraction[0]);\n const denominator = fraction[1];\n const sign = number < 0 ? \"-\" : \"\";\n if (denominator === 1) {\n return sign + numerator; // for integers, irrational, d > 1000\n }\n if (format === \"mixed\") {\n const modulus = numerator % denominator;\n const integer = (numerator - modulus) / denominator;\n return (\n sign +\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n (integer ? integer + \" \" : \"\") +\n modulus +\n \"/\" +\n denominator\n );\n } // otherwise proper, improper, or fraction\n return sign + numerator + \"/\" + denominator;\n }\n\n // otherwise (decimal, float, long long)\n return String(number);\n },\n} as const;\n\nexport function sum(array: number[]): number {\n return array.reduce(add, 0);\n}\n\nfunction add(a: number, b: number): number {\n return a + b;\n}\n\nexport default KhanMath;\n","/**\n * A collection of geomtry-related utility functions\n */\n\nimport {\n approximateDeepEqual,\n approximateEqual,\n type Coord,\n} from \"@khanacademy/perseus-core\";\nimport _ from \"underscore\";\n\nimport {sum} from \"./math\";\nimport * as knumber from \"./number\";\nimport * as kpoint from \"./point\";\n\ntype Line = [Coord, Coord];\n\n// This should really be a readonly tuple of [number, number]\nexport type Range = [number, number];\n\nexport type SineCoefficient = [\n number, // amplitude\n number, // angularFrequency\n number, // phase\n number, // verticalOffset\n];\n\n// Given a number, return whether it is positive (1), negative (-1), or zero (0)\nexport function sign(val: number): 0 | 1 | -1 {\n if (approximateEqual(val, 0)) {\n return 0;\n }\n return val > 0 ? 1 : -1;\n}\n\n// Determine whether three points are collinear (0), for a clockwise turn (negative),\n// or counterclockwise turn (positive)\nexport function ccw(a: Coord, b: Coord, c: Coord): number {\n return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]);\n}\n\nexport function collinear(a: Coord, b: Coord, c: Coord): boolean {\n return approximateEqual(ccw(a, b, c), 0);\n}\n\n// Given rect bounding points A and B, whether point C is inside the rect\nfunction pointInRect(a: Coord, b: Coord, c: Coord): boolean {\n return (\n c[0] <= Math.max(a[0], b[0]) &&\n c[0] >= Math.min(a[0], b[0]) &&\n c[1] <= Math.max(a[1], b[1]) &&\n c[1] >= Math.min(a[1], b[1])\n );\n}\n\n// Whether line segment AB intersects line segment CD\n// http://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/\nexport function intersects(ab: Line, cd: Line): boolean {\n const triplets = [\n [ab[0], ab[1], cd[0]] as const,\n [ab[0], ab[1], cd[1]] as const,\n [cd[0], cd[1], ab[0]] as const,\n [cd[0], cd[1], ab[1]] as const,\n ];\n\n const orientations = _.map(triplets, function (triplet) {\n return sign(ccw(...triplet));\n });\n\n if (\n orientations[0] !== orientations[1] &&\n orientations[2] !== orientations[3]\n ) {\n return true;\n }\n\n for (let i = 0; i < 4; i++) {\n if (orientations[i] === 0 && pointInRect(...triplets[i])) {\n return true;\n }\n }\n\n return false;\n}\n\n// Whether any two sides of a polygon intersect each other\nexport function polygonSidesIntersect(vertices: Coord[]): boolean {\n for (let i = 0; i < vertices.length; i++) {\n for (let k = i + 1; k < vertices.length; k++) {\n // If any two vertices are the same point, sides overlap\n if (kpoint.equal(vertices[i], vertices[k])) {\n return true;\n }\n\n // Find the other end of the sides starting at vertices i and k\n const iNext = (i + 1) % vertices.length;\n const kNext = (k + 1) % vertices.length;\n\n // Adjacent sides always intersect (at the vertex); skip those\n if (iNext === k || kNext === i) {\n continue;\n }\n\n const side1: Line = [vertices[i], vertices[iNext]];\n const side2: Line = [vertices[k], vertices[kNext]];\n if (intersects(side1, side2)) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function vector(a, b) {\n return _.map(_.zip(a, b), function (pair) {\n return pair[0] - pair[1];\n });\n}\n\nexport function reverseVector(vector: Coord): Coord {\n return [-vector[0], -vector[1]];\n}\n\n// Returns whether connecting the given sequence of `points` forms a clockwise\n// path (assuming a closed loop, where the last point connects back to the\n// first).\nexport function clockwise(points: Coord[]): boolean {\n const segments = _.zip(points, points.slice(1).concat(points.slice(0, 1)));\n const areas = _.map(segments, function (segment) {\n const p1 = segment[0];\n const p2 = segment[1];\n return (p2[0] - p1[0]) * (p2[1] + p1[1]);\n });\n return sum(areas) > 0;\n}\n\nexport function magnitude(v: ReadonlyArray<Coord>): number {\n return Math.sqrt(\n _.reduce(\n v,\n function (memo, el) {\n // @ts-expect-error - TS2345 - Argument of type 'Coord' is not assignable to parameter of type 'number'.\n return memo + Math.pow(el, 2);\n },\n 0,\n ),\n );\n}\n\nfunction dotProduct(a: Coord, b: Coord): number {\n return _.reduce(\n _.zip(a, b),\n function (memo, pair) {\n return memo + pair[0] * pair[1];\n },\n 0,\n );\n}\n\nfunction sideLengths(coords: ReadonlyArray<Coord>): ReadonlyArray<number> {\n const segments = _.zip(coords, rotate(coords));\n return segments.map(function (segment) {\n // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'. | TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return magnitude(vector(...segment));\n });\n}\n\n// Based on http://math.stackexchange.com/a/151149\nexport function angleMeasures(\n coords: ReadonlyArray<Coord>,\n): ReadonlyArray<number> {\n const triplets = _.zip(rotate(coords, -1), coords, rotate(coords, 1));\n\n const offsets = _.map(triplets, function (triplet) {\n const p = vector(triplet[1], triplet[0]);\n const q = vector(triplet[2], triplet[1]);\n // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'Coord'. | TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'. | TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'.\n const raw = Math.acos(dotProduct(p, q) / (magnitude(p) * magnitude(q)));\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return sign(ccw(...triplet)) > 0 ? raw : -raw;\n });\n\n const sum = _.reduce(\n offsets,\n function (memo, arg) {\n return memo + arg;\n },\n 0,\n );\n\n return _.map(offsets, function (offset) {\n return sum > 0 ? Math.PI - offset : Math.PI + offset;\n });\n}\n\n// Whether two polygons are similar (or if specified, congruent)\nexport function similar(\n coords1: ReadonlyArray<Coord>,\n coords2: ReadonlyArray<Coord>,\n tolerance: number,\n): boolean {\n if (coords1.length !== coords2.length) {\n return false;\n }\n\n const n = coords1.length;\n\n const angles1 = angleMeasures(coords1);\n const angles2 = angleMeasures(coords2);\n\n const sides1 = sideLengths(coords1);\n const sides2 = sideLengths(coords2);\n\n for (let i = 0; i < 2 * n; i++) {\n let angles = angles2.slice();\n let sides = sides2.slice();\n\n // Reverse angles and sides to allow matching reflected polygons\n if (i >= n) {\n angles.reverse();\n sides.reverse();\n // Since sides are calculated from two coordinates,\n // simply reversing results in an off by one error\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n sides = rotate(sides, 1);\n }\n\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n angles = rotate(angles, i);\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n sides = rotate(sides, i);\n\n if (approximateDeepEqual(angles1, angles)) {\n const sidePairs = _.zip(sides1, sides);\n\n const factors = _.map(sidePairs, function (pair) {\n return pair[0] / pair[1];\n });\n\n const same = _.all(factors, function (factor) {\n return approximateEqual(factors[0], factor);\n });\n\n const congruentEnough = _.all(sidePairs, function (pair) {\n return knumber.equal(pair[0], pair[1], tolerance);\n });\n\n if (same && congruentEnough) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n// Given triangle with sides ABC return angle opposite side C in degrees\nexport function lawOfCosines(a: number, b: number, c: number): number {\n return (Math.acos((a * a + b * b - c * c) / (2 * a * b)) * 180) / Math.PI;\n}\n\nexport function canonicalSineCoefficients([\n amplitude,\n angularFrequency,\n phase,\n verticalOffset,\n]: [any, any, any, any]) {\n // For a curve of the form f(x) = a * Sin(b * x - c) + d,\n // this function ensures that a, b > 0, and c is its\n // smallest possible positive value.\n\n // Guarantee a > 0\n if (amplitude < 0) {\n amplitude *= -1;\n angularFrequency *= -1;\n phase *= -1;\n }\n\n const period = 2 * Math.PI;\n // Guarantee b > 0\n if (angularFrequency < 0) {\n angularFrequency *= -1;\n phase *= -1;\n phase += period / 2;\n }\n\n // Guarantee c is smallest possible positive value\n while (phase > 0) {\n phase -= period;\n }\n while (phase < 0) {\n phase += period;\n }\n\n return [amplitude, angularFrequency, phase, verticalOffset];\n}\n\n// e.g. rotate([1, 2, 3]) -> [2, 3, 1]\nexport function rotate<T>(\n array: ReadonlyArray<T>,\n n?: number,\n): ReadonlyArray<T> {\n n = typeof n === \"undefined\" ? 1 : n % array.length;\n return array.slice(n).concat(array.slice(0, n));\n}\n\nexport function getLineEquation(first: Coord, second: Coord): string {\n if (approximateEqual(first[0], second[0])) {\n return \"x = \" + first[0].toFixed(3);\n }\n const m = (second[1] - first[1]) / (second[0] - first[0]);\n const b = first[1] - m * first[0];\n return \"y = \" + m.toFixed(3) + \"x + \" + b.toFixed(3);\n}\n\n// Stolen from the wikipedia article\n// http://en.wikipedia.org/wiki/Line-line_intersection\nexport function getLineIntersection(\n // TODO(LP-10725): update these to be 2-tuples\n firstPoints: ReadonlyArray<Coord>,\n secondPoints: ReadonlyArray<Coord>,\n): [number, number] | null {\n const x1 = firstPoints[0][0];\n const y1 = firstPoints[0][1];\n const x2 = firstPoints[1][0];\n const y2 = firstPoints[1][1];\n const x3 = secondPoints[0][0];\n const y3 = secondPoints[0][1];\n const x4 = secondPoints[1][0];\n const y4 = secondPoints[1][1];\n\n const determinant = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n if (Math.abs(determinant) < 1e-9) {\n // Lines are parallel\n return null;\n }\n const x =\n ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) /\n determinant;\n const y =\n ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) /\n determinant;\n return [x, y];\n}\n\nexport function getLineIntersectionString(\n firstPoints: ReadonlyArray<Coord>,\n secondPoints: ReadonlyArray<Coord>,\n): string {\n const intersection = getLineIntersection(firstPoints, secondPoints);\n\n if (intersection === null) {\n return \"Lines are parallel\";\n }\n\n const [x, y] = intersection;\n return \"Intersection: (\" + x.toFixed(3) + \", \" + y.toFixed(3) + \")\";\n}\n","// This file contains helper functions for working with angles.\n\nimport {clockwise} from \"./geometry\";\n\nimport type {Coord} from \"@khanacademy/perseus-core\";\n\nexport function convertDegreesToRadians(degrees: number): number {\n return (degrees / 180) * Math.PI;\n}\n\nexport function convertRadiansToDegrees(radians: number): number {\n const degree = (radians / Math.PI) * 180;\n // Account for floating point errors.\n return Number(degree.toPrecision(15));\n}\n\n// Returns a value between -180 and 180, inclusive. The angle is measured\n// between the positive x-axis and the given vector.\nexport function calculateAngleInDegrees([x, y]: Coord): number {\n return (Math.atan2(y, x) * 180) / Math.PI;\n}\n\n// Converts polar coordinates to cartesian. The th(eta) parameter is in degrees.\nexport function polar(r: number | Coord, th: number): Coord {\n if (typeof r === \"number\") {\n r = [r, r];\n }\n th = (th * Math.PI) / 180;\n return [r[0] * Math.cos(th), r[1] * Math.sin(th)];\n}\n// This function calculates the angle between two points and an optional vertex.\n// If the vertex is not provided, the angle is measured between the two points.\n// This does not account for reflex angles or clockwise position.\nexport const getAngleFromVertex = (point: Coord, vertex: Coord): number => {\n const x = point[0] - vertex[0];\n const y = point[1] - vertex[1];\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (!x && !y) {\n return 0;\n }\n return (180 + (Math.atan2(-y, -x) * 180) / Math.PI + 360) % 360;\n};\n\n// This function calculates the clockwise angle between three points,\n// and is used to generate the labels and equation strings of the\n// current angle for the interactive graph.\nexport const getClockwiseAngle = (\n coords: [Coord, Coord, Coord],\n allowReflexAngles: boolean = false,\n): number => {\n const coordsCopy = [...coords];\n // The coords are saved as [point1, vertex, point2] in the interactive graph\n const areClockwise = clockwise([\n coordsCopy[0],\n coordsCopy[2],\n coordsCopy[1],\n ]);\n\n // We may need to reverse the coordinates if we allow\n // reflex angles and the points are not in clockwise order.\n const shouldReverseCoords = !areClockwise || allowReflexAngles;\n\n // Reverse the coordinates accordingly to ensure the angle is calculated correctly\n const clockwiseCoords = shouldReverseCoords\n ? coordsCopy.reverse()\n : coordsCopy;\n\n // Calculate the angles between the two points and get the difference\n // between the two angles to get the clockwise angle.\n const startAngle = getAngleFromVertex(\n clockwiseCoords[0],\n clockwiseCoords[1],\n );\n const endAngle = getAngleFromVertex(clockwiseCoords[2], clockwiseCoords[1]);\n const angle = (startAngle + 360 - endAngle) % 360;\n return angle;\n};\n","import type {SineCoefficient} from \"./geometry\";\nimport type {Coord} from \"@khanacademy/perseus-core\";\n\nexport type NamedSineCoefficient = {\n amplitude: number;\n angularFrequency: number;\n phase: number;\n verticalOffset: number;\n};\n\n// TODO: there's another, very similar getSinusoidCoefficients function\n// they should probably be merged\nexport function getSinusoidCoefficients(\n coords: ReadonlyArray<Coord>,\n): SineCoefficient {\n // It's assumed that p1 is the root and p2 is the first peak\n const p1 = coords[0];\n const p2 = coords[1];\n\n // Resulting coefficients are canonical for this sine curve\n const amplitude = p2[1] - p1[1];\n const angularFrequency = Math.PI / (2 * (p2[0] - p1[0]));\n const phase = p1[0] * angularFrequency;\n const verticalOffset = p1[1];\n\n return [amplitude, angularFrequency, phase, verticalOffset];\n}\n\nexport type QuadraticCoefficient = [number, number, number];\n\n// TODO: there's another, very similar getQuadraticCoefficients function\n// they should probably be merged\nexport function getQuadraticCoefficients(\n coords: ReadonlyArray<Coord>,\n): QuadraticCoefficient {\n const p1 = coords[0];\n const p2 = coords[1];\n const p3 = coords[2];\n\n const denom = (p1[0] - p2[0]) * (p1[0] - p3[0]) * (p2[0] - p3[0]);\n if (denom === 0) {\n // Many of the callers assume that the return value is always defined.\n // @ts-expect-error - TS2322 - Type 'undefined' is not assignable to type 'QuadraticCoefficient'.\n return;\n }\n const a =\n (p3[0] * (p2[1] - p1[1]) +\n p2[0] * (p1[1] - p3[1]) +\n p1[0] * (p3[1] - p2[1])) /\n denom;\n const b =\n (p3[0] * p3[0] * (p1[1] - p2[1]) +\n p2[0] * p2[0] * (p3[1] - p1[1]) +\n p1[0] * p1[0] * (p2[1] - p3[1])) /\n denom;\n const c =\n (p2[0] * p3[0] * (p2[0] - p3[0]) * p1[1] +\n p3[0] * p1[0] * (p3[0] - p1[0]) * p2[1] +\n p1[0] * p2[0] * (p1[0] - p2[0]) * p3[1]) /\n denom;\n return [a, b, c];\n}\n"],"names":["libName","libVersion","addLibraryVersionToPerseusDebug","DEFAULT_TOLERANCE","EPSILON","Math","pow","is","x","_","isNumber","isNaN","equal","y","tolerance","abs","sign","isInteger","num","round","precision","factor","roundTo","increment","floorTo","floor","ceilTo","ceil","toFraction","decimal","maxDenominator","n","d","a","rem","arraySum","array","reduce","memo","arg","arrayProduct","zip","arrays","min","map","length","results","i","push","pair","f","vec","dimension","Array","isArray","undefined","every","knumber","normalize","v","scale","sqrt","dot","b","zipped","multiplied","add","vecs","subtract","v1","v2","dim","negate","scalar","codirectional","collinear","polarRadFromCart","radius","theta","atan2","PI","polarDegFromCart","polar","cartFromPolarRad","cos","sin","cartFromPolarDeg","rotateRad","angle","rotateDeg","angleRad","acos","angleDeg","projection","elem","point","center","kvector","distanceToPoint","point1","point2","distanceToLine","line","lv","pv","projectedPv","distancePv","reflectOverLine","reflectedPv","compare","equalityTolerance","addVector","addVectors","subtractVector","kpoint","reflectPoint","midpoint","line1","line2","line1ToLine2Vector","ray1","ray2","sameOrigin","KhanMath","cleanMath","expr","replace","bound","max","factorial","getGCD","arguments","rest","slice","call","mod","getLCM","primes","isPrime","$","grep","p","getPrimeFactorization","number","maxf","merge","roundToNearest","toFixed","toFixedApprox","fixedStr","roundToApprox","fixed","String","fract","nd","Number","loN","loD","hiN","hiD","midN","midD","getNumericFormat","text","trim","match","fraction","parseFloat","toNumericString","format","numerator","denominator","pi","contains","modulus","integer","sum","val","approximateEqual","ccw","c","pointInRect","intersects","ab","cd","triplets","orientations","triplet","polygonSidesIntersect","vertices","k","iNext","kNext","side1","side2","vector","reverseVector","clockwise","points","segments","concat","areas","segment","p1","p2","magnitude","el","dotProduct","sideLengths","coords","rotate","angleMeasures","offsets","q","raw","offset","similar","coords1","coords2","angles1","angles2","sides1","sides2","angles","sides","reverse","approximateDeepEqual","sidePairs","factors","same","all","congruentEnough","lawOfCosines","canonicalSineCoefficients","amplitude","angularFrequency","phase","verticalOffset","period","getLineEquation","first","second","m","getLineIntersection","firstPoints","secondPoints","x1","y1","x2","y2","x3","y3","x4","y4","determinant","getLineIntersectionString","intersection","convertDegreesToRadians","degrees","convertRadiansToDegrees","radians","degree","toPrecision","calculateAngleInDegrees","r","th","getAngleFromVertex","vertex","getClockwiseAngle","allowReflexAngles","coordsCopy","areClockwise","shouldReverseCoords","clockwiseCoords","startAngle","endAngle","getSinusoidCoefficients","getQuadraticCoefficients","p3","denom"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/version.ts","../../src/number.ts","../../src/vector.ts","../../src/point.ts","../../src/line.ts","../../src/ray.ts","../../src/math.ts","../../src/geometry.ts","../../src/angles.ts","../../src/coefficients.ts"],"sourcesContent":["// This file is processed by a Rollup plugin (replace) to inject the production\n// version number during the release build.\n// In dev, you'll never see the version number.\n\nimport {addLibraryVersionToPerseusDebug} from \"@khanacademy/perseus-utils\";\n\nconst libName = \"@khanacademy/kmath\";\nexport const libVersion = \"__lib_version__\";\n\naddLibraryVersionToPerseusDebug(libName, libVersion);\n","/**\n * Number Utils\n * A number is a js-number, e.g. 5.12\n */\n\nimport _ from \"underscore\";\n\nexport const DEFAULT_TOLERANCE = 1e-9;\n\n// TODO: Should this just be Number.Epsilon\nexport const EPSILON: number = Math.pow(2, -42);\n\nexport function is(x: any): boolean {\n return _.isNumber(x) && !_.isNaN(x);\n}\n\nexport function equal(x: number, y: number, tolerance?: number): boolean {\n // Checking for undefined makes this function behave nicely\n // with vectors of different lengths that are _.zip'd together\n if (x == null || y == null) {\n return x === y;\n }\n // We check === here so that +/-Infinity comparisons work correctly\n if (x === y) {\n return true;\n }\n if (tolerance == null) {\n tolerance = DEFAULT_TOLERANCE;\n }\n return Math.abs(x - y) < tolerance;\n}\n\nexport function sign(\n x: number,\n tolerance?: number,\n): number /* Should be: 0 | 1 | -1 */ {\n return equal(x, 0, tolerance) ? 0 : Math.abs(x) / x;\n}\n\nexport function isInteger(num: number, tolerance?: number): boolean {\n return equal(Math.round(num), num, tolerance);\n}\n\n// Round a number to a certain number of decimal places\nexport function round(num: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round(num * factor) / factor;\n}\n\n// Round num to the nearest multiple of increment\n// i.e. roundTo(83, 5) -> 85\nexport function roundTo(num: number, increment: number): number {\n return Math.round(num / increment) * increment;\n}\n\nexport function floorTo(num: number, increment: number): number {\n return Math.floor(num / increment) * increment;\n}\n\nexport function ceilTo(num: number, increment: number): number {\n return Math.ceil(num / increment) * increment;\n}\n\n/**\n * toFraction\n *\n * Returns a [numerator, denominator] array rational representation\n * of `decimal`\n *\n * See http://en.wikipedia.org/wiki/Continued_fraction for implementation\n * details\n *\n * toFraction(4/8) => [1, 2]\n * toFraction(0.66) => [33, 50]\n * toFraction(0.66, 0.01) => [2/3]\n * toFraction(283 + 1/3) => [850, 3]\n */\nexport function toFraction(\n decimal: number,\n // can't be 0\n tolerance: number = EPSILON,\n maxDenominator = 1000,\n): [number, number] {\n // Initialize everything to compute successive terms of\n // continued-fraction approximations via recurrence relation\n let n = [1, 0];\n let d = [0, 1];\n let a = Math.floor(decimal);\n let rem = decimal - a;\n\n while (d[0] <= maxDenominator) {\n if (equal(n[0] / d[0], decimal, tolerance)) {\n return [n[0], d[0]];\n }\n n = [a * n[0] + n[1], n[0]];\n d = [a * d[0] + d[1], d[0]];\n a = Math.floor(1 / rem);\n rem = 1 / rem - a;\n }\n\n // We failed to find a nice rational representation,\n // so return an irrational \"fraction\"\n return [decimal, 1];\n}\n","/**\n * Vector Utils\n * A vector is an array of numbers e.g. [0, 3, 4].\n */\n\nimport * as knumber from \"./number\";\n\ntype Vector = ReadonlyArray<number>;\n\nfunction arraySum(array: ReadonlyArray<number>): number {\n return array.reduce((memo, arg) => memo + arg, 0);\n}\n\nfunction arrayProduct(array: ReadonlyArray<number>): number {\n return array.reduce((memo, arg) => memo * arg, 1);\n}\n\nexport function zip<T>(xs: ReadonlyArray<T>, ys: ReadonlyArray<T>): [T, T][];\nexport function zip<T>(...arrays: ReadonlyArray<T>[]): T[][];\nexport function zip<T>(...arrays: ReadonlyArray<T>[]): T[][] {\n const n = Math.min(...arrays.map((a) => a.length));\n const results: T[][] = [];\n for (let i = 0; i < n; i++) {\n results.push(arrays.map((a) => a[i]));\n }\n return results;\n}\n\nexport function map<T, U>(pair: [T, T], f: (a: T, i: number) => U): [U, U] {\n return [f(pair[0], 0), f(pair[1], 1)];\n}\n\n/**\n * Checks if the given vector contains only numbers and, optionally, is of the\n * right dimension (length).\n *\n * is([1, 2, 3]) -> true\n * is([1, \"Hello\", 3]) -> false\n * is([1, 2, 3], 1) -> false\n */\nexport function is(vec: unknown, dimension: 2): vec is [number, number];\nexport function is(vec: unknown, dimension?: number): vec is Vector;\nexport function is(vec: unknown, dimension?: number) {\n if (!Array.isArray(vec)) {\n return false;\n }\n if (dimension !== undefined && vec.length !== dimension) {\n return false;\n }\n return vec.every(knumber.is);\n}\n\n// Normalize to a unit vector\nexport function normalize<V extends Vector>(v: V): V {\n return scale(v, 1 / length(v));\n}\n\n// Length/magnitude of a vector\nexport function length(v: Vector): number {\n return Math.sqrt(dot(v, v));\n}\n// Dot product of two vectors\nexport function dot(a: Vector, b: Vector): number {\n const zipped = zip(a, b);\n const multiplied = zipped.map(arrayProduct);\n return arraySum(multiplied);\n}\n\n/* vector-add multiple [x, y] coords/vectors\n *\n * add([1, 2], [3, 4]) -> [4, 6]\n */\nexport function add<V extends Vector>(...vecs: ReadonlyArray<V>): V {\n const zipped = zip(...vecs);\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return zipped.map(arraySum);\n}\n\nexport function subtract<V extends Vector>(v1: V, v2: V): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return zip(v1, v2).map((dim) => dim[0] - dim[1]);\n}\n\nexport function negate<V extends Vector>(v: V): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return v.map((x) => {\n return -x;\n });\n}\n\n// Scale a vector\nexport function scale<V extends Vector>(v1: V, scalar: number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return v1.map((x) => {\n return x * scalar;\n });\n}\n\nexport function equal(v1: Vector, v2: Vector, tolerance?: number): boolean {\n return (\n v1.length === v2.length &&\n zip(v1, v2).every((pair) => knumber.equal(pair[0], pair[1], tolerance))\n );\n}\n\nexport function codirectional(\n v1: Vector,\n v2: Vector,\n tolerance?: number,\n): boolean {\n // The origin is trivially codirectional with all other vectors.\n // This gives nice semantics for codirectionality between points when\n // comparing their difference vectors.\n if (\n knumber.equal(length(v1), 0, tolerance) ||\n knumber.equal(length(v2), 0, tolerance)\n ) {\n return true;\n }\n\n v1 = normalize(v1);\n v2 = normalize(v2);\n\n return equal(v1, v2, tolerance);\n}\n\nexport function collinear(v1: Vector, v2: Vector, tolerance?: number): boolean {\n return (\n codirectional(v1, v2, tolerance) ||\n codirectional(v1, negate(v2), tolerance)\n );\n}\n\n// TODO(jeremy) These coordinate conversion functions really only handle 2D points (ie. [number, number])\n\n// Convert a cartesian coordinate into a radian polar coordinate\nexport function polarRadFromCart(\n v: ReadonlyArray<number>,\n): ReadonlyArray<number> {\n const radius = length(v);\n let theta = Math.atan2(v[1], v[0]);\n\n // Convert angle range from [-pi, pi] to [0, 2pi]\n if (theta < 0) {\n theta += 2 * Math.PI;\n }\n\n return [radius, theta];\n}\n\n// Converts a cartesian coordinate into a degree polar coordinate\nexport function polarDegFromCart(\n v: ReadonlyArray<number>,\n): ReadonlyArray<number> /* TODO: convert to tuple/Point */ {\n const polar = polarRadFromCart(v);\n return [polar[0], (polar[1] * 180) / Math.PI];\n}\n\n/* Convert a polar coordinate into a cartesian coordinate\n *\n * Examples:\n * cartFromPolarRad(5, Math.PI)\n */\nexport function cartFromPolarRad(\n radius: number,\n theta = 0,\n): ReadonlyArray<number> /* TODO: convert to tuple/Point */ {\n return [radius * Math.cos(theta), radius * Math.sin(theta)];\n}\n\n/* Convert a polar coordinate into a cartesian coordinate\n *\n * Examples:\n * cartFromPolarDeg(5, 30)\n */\nexport function cartFromPolarDeg(\n radius: number,\n theta = 0,\n): ReadonlyArray<number> {\n return cartFromPolarRad(radius, (theta * Math.PI) / 180);\n}\n\n// Rotate vector\nexport function rotateRad(\n v: ReadonlyArray<number>,\n theta: number,\n): ReadonlyArray<number> {\n const polar = polarRadFromCart(v);\n const angle = polar[1] + theta;\n return cartFromPolarRad(polar[0], angle);\n}\n\nexport function rotateDeg(\n v: ReadonlyArray<number>,\n theta: number,\n): ReadonlyArray<number> {\n const polar = polarDegFromCart(v);\n const angle = polar[1] + theta;\n return cartFromPolarDeg(polar[0], angle);\n}\n\n// Angle between two vectors\nexport function angleRad(v1: Vector, v2: Vector): number {\n return Math.acos(dot(v1, v2) / (length(v1) * length(v2)));\n}\n\nexport function angleDeg(v1: Vector, v2: Vector): number {\n return (angleRad(v1, v2) * 180) / Math.PI;\n}\n\n// Vector projection of v1 onto v2\nexport function projection<V extends Vector>(v1: V, v2: V): V {\n const scalar = dot(v1, v2) / dot(v2, v2);\n return scale(v2, scalar);\n}\n\n// Round each number to a certain number of decimal places\nexport function round<V extends Vector>(vec: V, precision: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) => knumber.round(elem, precision[i] || precision));\n}\n\n// Round each number to the nearest increment\nexport function roundTo(\n coord: [number, number],\n increment: [number, number] | number,\n): [number, number];\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V;\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.roundTo(elem, increment[i] || increment),\n );\n}\n\nexport function floorTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.floorTo(elem, increment[i] || increment),\n );\n}\n\nexport function ceilTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.ceilTo(elem, increment[i] || increment),\n );\n}\n","/**\n * Point Utils\n * A point is an array of two numbers e.g. [0, 0].\n */\n\nimport * as knumber from \"./number\";\nimport * as kvector from \"./vector\";\n\n// A point, in 2D, 3D, or nD space.\nexport type Point = ReadonlyArray<number>;\n\n// Rotate point (around origin unless a center is specified)\nexport function rotateRad(point: Point, theta: number, center?: Point): Point {\n if (center === undefined) {\n return kvector.rotateRad(point, theta);\n } else {\n return kvector.add(\n center,\n kvector.rotateRad(kvector.subtract(point, center), theta),\n );\n }\n}\n\nexport function rotateDeg(point: Point, theta: number, center?: Point): Point {\n if (center === undefined) {\n return kvector.rotateDeg(point, theta);\n } else {\n return kvector.add(\n center,\n kvector.rotateDeg(kvector.subtract(point, center), theta),\n );\n }\n}\n\n// Distance between two points\nexport function distanceToPoint(point1: Point, point2: Point): number {\n return kvector.length(kvector.subtract(point1, point2));\n}\n\n// Distance between point and line\nexport function distanceToLine(point: Point, line: [Point, Point]): number {\n const lv = kvector.subtract(line[1], line[0]);\n const pv = kvector.subtract(point, line[0]);\n const projectedPv = kvector.projection(pv, lv);\n const distancePv = kvector.subtract(projectedPv, pv);\n return kvector.length(distancePv);\n}\n\n// Reflect point over line\nexport function reflectOverLine<P extends Point>(point: P, line: [P, P]): P {\n const lv = kvector.subtract(line[1], line[0]);\n const pv = kvector.subtract(point, line[0]);\n const projectedPv = kvector.projection(pv, lv);\n const reflectedPv = kvector.subtract(kvector.scale(projectedPv, 2), pv);\n return kvector.add(line[0], reflectedPv);\n}\n\n/**\n * Compares two points, returning -1, 0, or 1, for use with\n * Array.prototype.sort\n *\n * Note: This technically doesn't satisfy the total-ordering\n * requirements of Array.prototype.sort unless equalityTolerance\n * is 0. In some cases very close points that compare within a\n * few equalityTolerances could appear in the wrong order.\n */\nexport function compare(\n point1: Point,\n point2: Point,\n equalityTolerance?: number,\n): number /* TODO: convert to -1 | 0 | 1 type */ {\n if (point1.length !== point2.length) {\n return point1.length - point2.length;\n }\n for (let i = 0; i < point1.length; i++) {\n if (!knumber.equal(point1[i], point2[i], equalityTolerance)) {\n return point1[i] - point2[i];\n }\n }\n return 0;\n}\n\n// Check if a value is a point\nexport const is = kvector.is;\n\n// Add and subtract vector(s)\nexport const addVector = kvector.add;\nexport const addVectors = kvector.add;\nexport const subtractVector = kvector.subtract;\nexport const equal = kvector.equal;\n\n// Convert from cartesian to polar and back\nexport const polarRadFromCart = kvector.polarRadFromCart;\nexport const polarDegFromCart = kvector.polarDegFromCart;\nexport const cartFromPolarRad = kvector.cartFromPolarRad;\nexport const cartFromPolarDeg = kvector.cartFromPolarDeg;\n\n// Rounding\nexport const round = kvector.round;\nexport const roundTo = kvector.roundTo;\nexport const floorTo = kvector.floorTo;\nexport const ceilTo = kvector.ceilTo;\n","/**\n * Line Utils\n * A line is an array of two points e.g. [[-5, 0], [5, 0]].\n */\n\nimport * as kpoint from \"./point\";\nimport * as kvector from \"./vector\";\n\nimport type {Point} from \"./point\";\n\nexport type Line = [Point, Point];\n\nexport function distanceToPoint(line: Line, point: Point): number {\n return kpoint.distanceToLine(point, line);\n}\n\nexport function reflectPoint(line: Line, point: Point): Point {\n return kpoint.reflectOverLine(point, line);\n}\n\nexport function midpoint(line: Line): Point {\n return [(line[0][0] + line[1][0]) / 2, (line[0][1] + line[1][1]) / 2];\n}\n\nexport function equal(line1: Line, line2: Line, tolerance?: number): boolean {\n // TODO: A nicer implementation might just check collinearity of\n // vectors using underscore magick\n // Compare the directions of the lines\n const v1 = kvector.subtract(line1[1], line1[0]);\n const v2 = kvector.subtract(line2[1], line2[0]);\n if (!kvector.collinear(v1, v2, tolerance)) {\n return false;\n }\n // If the start point is the same for the two lines, then they are the same\n if (kpoint.equal(line1[0], line2[0])) {\n return true;\n }\n // Make sure that the direction to get from line1 to\n // line2 is the same as the direction of the lines\n const line1ToLine2Vector = kvector.subtract(line2[0], line1[0]);\n return kvector.collinear(v1, line1ToLine2Vector, tolerance);\n}\n","/**\n * Ray Utils\n * A ray (→) is an array of an endpoint and another point along the ray.\n * For example, [[0, 0], [1, 0]] is the ray starting at the origin and\n * traveling along the positive x-axis.\n */\n\nimport * as kpoint from \"./point\";\nimport * as kvector from \"./vector\";\n\nimport type {Point} from \"./point\";\n\nexport type Ray = [Point, Point];\n\nexport function equal(ray1: Ray, ray2: Ray, tolerance?: number): boolean {\n // Compare the directions of the rays\n const v1 = kvector.subtract(ray1[1], ray1[0]);\n const v2 = kvector.subtract(ray2[1], ray2[0]);\n\n const sameOrigin = kpoint.equal(ray1[0], ray2[0]);\n const codirectional = kvector.codirectional(v1, v2, tolerance);\n\n return sameOrigin && codirectional;\n}\n","import $ from \"jquery\";\nimport _ from \"underscore\";\n\nimport * as knumber from \"./number\";\n\nimport type {MathFormat} from \"@khanacademy/perseus-core\";\n\nconst KhanMath = {\n // Simplify formulas before display\n cleanMath: function (expr: string): string {\n return typeof expr === \"string\"\n ? expr\n .replace(/\\+\\s*-/g, \"- \")\n .replace(/-\\s*-/g, \"+ \")\n .replace(/\\^1/g, \"\")\n : expr;\n },\n\n // Bound a number by 1e-6 and 1e20 to avoid exponents after toString\n bound: function (num: number): number {\n if (num === 0) {\n return num;\n }\n if (num < 0) {\n return -KhanMath.bound(-num);\n }\n return Math.max(1e-6, Math.min(num, 1e20));\n },\n\n factorial: function (x: number): number {\n if (x <= 1) {\n return x;\n }\n return x * KhanMath.factorial(x - 1);\n },\n\n getGCD: function (a: number, b: number): number {\n if (arguments.length > 2) {\n // TODO(kevinb): rewrite using rest args instead of arguments\n // eslint-disable-next-line prefer-rest-params\n const rest = [].slice.call(arguments, 1);\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return KhanMath.getGCD(a, KhanMath.getGCD(...rest));\n }\n let mod;\n\n a = Math.abs(a);\n b = Math.abs(b);\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n while (b) {\n mod = a % b;\n a = b;\n b = mod;\n }\n\n return a;\n },\n\n getLCM: function (a: number, b: number): number {\n if (arguments.length > 2) {\n // TODO(kevinb): rewrite using rest args instead of arguments\n // eslint-disable-next-line prefer-rest-params\n const rest = [].slice.call(arguments, 1);\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return KhanMath.getLCM(a, KhanMath.getLCM(...rest));\n }\n return Math.abs(a * b) / KhanMath.getGCD(a, b);\n },\n\n primes: [\n 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,\n 71, 73, 79, 83, 89, 97,\n ],\n\n isPrime: function (n: number): boolean {\n if (n <= 1) {\n return false;\n }\n if (n < 101) {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n return !!$.grep(KhanMath.primes, function (p, i) {\n return Math.abs(p - n) <= 0.5;\n }).length;\n }\n if (n <= 1 || (n > 2 && n % 2 === 0)) {\n return false;\n }\n for (let i = 3, sqrt = Math.sqrt(n); i <= sqrt; i += 2) {\n if (n % i === 0) {\n return false;\n }\n }\n\n return true;\n },\n // @ts-expect-error - TS2366 - Function lacks ending return statement and return type does not include 'undefined'.\n getPrimeFactorization: function (number: number): ReadonlyArray<number> {\n if (number === 1) {\n return [];\n }\n if (KhanMath.isPrime(number)) {\n return [number];\n }\n\n const maxf = Math.sqrt(number);\n for (let f = 2; f <= maxf; f++) {\n if (number % f === 0) {\n return $.merge(\n KhanMath.getPrimeFactorization(f),\n KhanMath.getPrimeFactorization(number / f),\n );\n }\n }\n },\n\n // Round a number to the nearest increment\n // E.g., if increment = 30 and num = 40, return 30. if increment = 30 and\n // num = 45, return 60.\n roundToNearest: function (increment: number, num: number): number {\n return Math.round(num / increment) * increment;\n },\n\n // Round a number to a certain number of decimal places\n roundTo: function (precision: number, num: number): number {\n const factor = Math.pow(10, precision).toFixed(5);\n // @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type 'number'. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.\n return Math.round((num * factor).toFixed(5)) / factor;\n },\n\n /**\n * Return a string of num rounded to a fixed precision decimal places,\n * with an approx symbol if num had to be rounded, and trailing 0s\n */\n toFixedApprox: function (num: number, precision: number): string {\n // TODO(aria): Make this locale-dependent\n const fixedStr = num.toFixed(precision);\n if (knumber.equal(+fixedStr, num)) {\n return fixedStr;\n }\n return \"\\\\approx \" + fixedStr;\n },\n\n /**\n * Return a string of num rounded to precision decimal places, with an\n * approx symbol if num had to be rounded, but no trailing 0s if it was\n * not rounded.\n */\n roundToApprox: function (num: number, precision: number): string {\n const fixed = KhanMath.roundTo(precision, num);\n if (knumber.equal(fixed, num)) {\n return String(fixed);\n }\n return KhanMath.toFixedApprox(num, precision);\n },\n\n // toFraction(4/8) => [1, 2]\n // toFraction(0.666) => [333, 500]\n // toFraction(0.666, 0.001) => [2, 3]\n //\n // tolerance can't be bigger than 1, sorry\n toFraction: function (\n decimal: number,\n tolerance?: number,\n ): [number, number] {\n if (tolerance == null) {\n tolerance = Math.pow(2, -46);\n }\n\n if (decimal < 0 || decimal > 1) {\n let fract = decimal % 1;\n fract += fract < 0 ? 1 : 0;\n\n const nd = KhanMath.toFraction(fract, tolerance);\n nd[0] += Math.round(decimal - fract) * nd[1];\n return nd;\n }\n if (Math.abs(Math.round(Number(decimal)) - decimal) <= tolerance) {\n return [Math.round(decimal), 1];\n }\n let loN = 0;\n let loD = 1;\n let hiN = 1;\n let hiD = 1;\n let midN = 1;\n let midD = 2;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (Math.abs(Number(midN / midD) - decimal) <= tolerance) {\n return [midN, midD];\n }\n if (midN / midD < decimal) {\n loN = midN;\n loD = midD;\n } else {\n hiN = midN;\n hiD = midD;\n }\n\n midN = loN + hiN;\n midD = loD + hiD;\n }\n },\n\n // Returns the format (string) of a given numeric string\n // Note: purposively more inclusive than answer-types' predicate.forms\n // That is, it is not necessarily true that interpreted input are numeric\n getNumericFormat: function (text: string): MathFormat | null | undefined {\n text = $.trim(text);\n text = text.replace(/\\u2212/, \"-\").replace(/([+-])\\s+/g, \"$1\");\n if (text.match(/^[+-]?\\d+$/)) {\n return \"integer\";\n }\n if (text.match(/^[+-]?\\d+\\s+\\d+\\s*\\/\\s*\\d+$/)) {\n return \"mixed\";\n }\n const fraction = text.match(/^[+-]?(\\d+)\\s*\\/\\s*(\\d+)$/);\n if (fraction) {\n return parseFloat(fraction[1]) > parseFloat(fraction[2])\n ? \"improper\"\n : \"proper\";\n }\n if (text.replace(/[,. ]/g, \"\").match(/^\\d+$/)) {\n return \"decimal\";\n }\n if (text.match(/(pi?|\\u03c0|t(?:au)?|\\u03c4|pau)/)) {\n return \"pi\";\n }\n return null;\n },\n\n // Returns a string of the number in a specified format\n toNumericString: function (number: number, format?: MathFormat): string {\n if (number == null) {\n return \"\";\n }\n if (number === 0) {\n return \"0\"; // otherwise it might end up as 0% or 0pi\n }\n\n if (format === \"percent\") {\n return number * 100 + \"%\";\n }\n\n if (format === \"pi\") {\n const fraction = knumber.toFraction(number / Math.PI);\n const numerator = Math.abs(fraction[0]);\n const denominator = fraction[1];\n if (knumber.isInteger(numerator)) {\n const sign = number < 0 ? \"-\" : \"\";\n const pi = \"\\u03C0\";\n return (\n sign +\n (numerator === 1 ? \"\" : numerator) +\n pi +\n (denominator === 1 ? \"\" : \"/\" + denominator)\n );\n }\n }\n\n if (_([\"proper\", \"improper\", \"mixed\", \"fraction\"]).contains(format)) {\n const fraction = knumber.toFraction(number);\n const numerator = Math.abs(fraction[0]);\n const denominator = fraction[1];\n const sign = number < 0 ? \"-\" : \"\";\n if (denominator === 1) {\n return sign + numerator; // for integers, irrational, d > 1000\n }\n if (format === \"mixed\") {\n const modulus = numerator % denominator;\n const integer = (numerator - modulus) / denominator;\n return (\n sign +\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n (integer ? integer + \" \" : \"\") +\n modulus +\n \"/\" +\n denominator\n );\n } // otherwise proper, improper, or fraction\n return sign + numerator + \"/\" + denominator;\n }\n\n // otherwise (decimal, float, long long)\n return String(number);\n },\n} as const;\n\nexport function sum(array: number[]): number {\n return array.reduce(add, 0);\n}\n\nfunction add(a: number, b: number): number {\n return a + b;\n}\n\nexport default KhanMath;\n","/**\n * A collection of geomtry-related utility functions\n */\n\nimport {\n approximateDeepEqual,\n approximateEqual,\n type Coord,\n} from \"@khanacademy/perseus-core\";\nimport _ from \"underscore\";\n\nimport {sum} from \"./math\";\nimport * as knumber from \"./number\";\nimport * as kpoint from \"./point\";\n\ntype Line = [Coord, Coord];\n\n// This should really be a readonly tuple of [number, number]\nexport type Range = [number, number];\n\nexport type SineCoefficient = [\n number, // amplitude\n number, // angularFrequency\n number, // phase\n number, // verticalOffset\n];\n\n// Given a number, return whether it is positive (1), negative (-1), or zero (0)\nexport function sign(val: number): 0 | 1 | -1 {\n if (approximateEqual(val, 0)) {\n return 0;\n }\n return val > 0 ? 1 : -1;\n}\n\n// Determine whether three points are collinear (0), for a clockwise turn (negative),\n// or counterclockwise turn (positive)\nexport function ccw(a: Coord, b: Coord, c: Coord): number {\n return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]);\n}\n\nexport function collinear(a: Coord, b: Coord, c: Coord): boolean {\n return approximateEqual(ccw(a, b, c), 0);\n}\n\n// Given rect bounding points A and B, whether point C is inside the rect\nfunction pointInRect(a: Coord, b: Coord, c: Coord): boolean {\n return (\n c[0] <= Math.max(a[0], b[0]) &&\n c[0] >= Math.min(a[0], b[0]) &&\n c[1] <= Math.max(a[1], b[1]) &&\n c[1] >= Math.min(a[1], b[1])\n );\n}\n\n// Whether line segment AB intersects line segment CD\n// http://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/\nexport function intersects(ab: Line, cd: Line): boolean {\n const triplets = [\n [ab[0], ab[1], cd[0]] as const,\n [ab[0], ab[1], cd[1]] as const,\n [cd[0], cd[1], ab[0]] as const,\n [cd[0], cd[1], ab[1]] as const,\n ];\n\n const orientations = _.map(triplets, function (triplet) {\n return sign(ccw(...triplet));\n });\n\n if (\n orientations[0] !== orientations[1] &&\n orientations[2] !== orientations[3]\n ) {\n return true;\n }\n\n for (let i = 0; i < 4; i++) {\n if (orientations[i] === 0 && pointInRect(...triplets[i])) {\n return true;\n }\n }\n\n return false;\n}\n\n// Whether any two sides of a polygon intersect each other\nexport function polygonSidesIntersect(vertices: Coord[]): boolean {\n for (let i = 0; i < vertices.length; i++) {\n for (let k = i + 1; k < vertices.length; k++) {\n // If any two vertices are the same point, sides overlap\n if (kpoint.equal(vertices[i], vertices[k])) {\n return true;\n }\n\n // Find the other end of the sides starting at vertices i and k\n const iNext = (i + 1) % vertices.length;\n const kNext = (k + 1) % vertices.length;\n\n // Adjacent sides always intersect (at the vertex); skip those\n if (iNext === k || kNext === i) {\n continue;\n }\n\n const side1: Line = [vertices[i], vertices[iNext]];\n const side2: Line = [vertices[k], vertices[kNext]];\n if (intersects(side1, side2)) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function vector(a, b) {\n return _.map(_.zip(a, b), function (pair) {\n return pair[0] - pair[1];\n });\n}\n\nexport function reverseVector(vector: Coord): Coord {\n return [-vector[0], -vector[1]];\n}\n\n// Returns whether connecting the given sequence of `points` forms a clockwise\n// path (assuming a closed loop, where the last point connects back to the\n// first).\nexport function clockwise(points: Coord[]): boolean {\n const segments = _.zip(points, points.slice(1).concat(points.slice(0, 1)));\n const areas = _.map(segments, function (segment) {\n const p1 = segment[0];\n const p2 = segment[1];\n return (p2[0] - p1[0]) * (p2[1] + p1[1]);\n });\n return sum(areas) > 0;\n}\n\nexport function magnitude(v: ReadonlyArray<Coord>): number {\n return Math.sqrt(\n _.reduce(\n v,\n function (memo, el) {\n // @ts-expect-error - TS2345 - Argument of type 'Coord' is not assignable to parameter of type 'number'.\n return memo + Math.pow(el, 2);\n },\n 0,\n ),\n );\n}\n\nfunction dotProduct(a: Coord, b: Coord): number {\n return _.reduce(\n _.zip(a, b),\n function (memo, pair) {\n return memo + pair[0] * pair[1];\n },\n 0,\n );\n}\n\nfunction sideLengths(coords: ReadonlyArray<Coord>): ReadonlyArray<number> {\n const segments = _.zip(coords, rotate(coords));\n return segments.map(function (segment) {\n // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'. | TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return magnitude(vector(...segment));\n });\n}\n\n// Based on http://math.stackexchange.com/a/151149\nexport function angleMeasures(\n coords: ReadonlyArray<Coord>,\n): ReadonlyArray<number> {\n const triplets = _.zip(rotate(coords, -1), coords, rotate(coords, 1));\n\n const offsets = _.map(triplets, function (triplet) {\n const p = vector(triplet[1], triplet[0]);\n const q = vector(triplet[2], triplet[1]);\n // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'Coord'. | TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'. | TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'.\n const raw = Math.acos(dotProduct(p, q) / (magnitude(p) * magnitude(q)));\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return sign(ccw(...triplet)) > 0 ? raw : -raw;\n });\n\n const sum = _.reduce(\n offsets,\n function (memo, arg) {\n return memo + arg;\n },\n 0,\n );\n\n return _.map(offsets, function (offset) {\n return sum > 0 ? Math.PI - offset : Math.PI + offset;\n });\n}\n\n// Whether two polygons are similar (or if specified, congruent)\nexport function similar(\n coords1: ReadonlyArray<Coord>,\n coords2: ReadonlyArray<Coord>,\n tolerance: number,\n): boolean {\n if (coords1.length !== coords2.length) {\n return false;\n }\n\n const n = coords1.length;\n\n const angles1 = angleMeasures(coords1);\n const angles2 = angleMeasures(coords2);\n\n const sides1 = sideLengths(coords1);\n const sides2 = sideLengths(coords2);\n\n for (let i = 0; i < 2 * n; i++) {\n let angles = angles2.slice();\n let sides = sides2.slice();\n\n // Reverse angles and sides to allow matching reflected polygons\n if (i >= n) {\n angles.reverse();\n sides.reverse();\n // Since sides are calculated from two coordinates,\n // simply reversing results in an off by one error\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n sides = rotate(sides, 1);\n }\n\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n angles = rotate(angles, i);\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n sides = rotate(sides, i);\n\n if (approximateDeepEqual(angles1, angles)) {\n const sidePairs = _.zip(sides1, sides);\n\n const factors = _.map(sidePairs, function (pair) {\n return pair[0] / pair[1];\n });\n\n const same = _.all(factors, function (factor) {\n return approximateEqual(factors[0], factor);\n });\n\n const congruentEnough = _.all(sidePairs, function (pair) {\n return knumber.equal(pair[0], pair[1], tolerance);\n });\n\n if (same && congruentEnough) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n// Given triangle with sides ABC return angle opposite side C in degrees\nexport function lawOfCosines(a: number, b: number, c: number): number {\n return (Math.acos((a * a + b * b - c * c) / (2 * a * b)) * 180) / Math.PI;\n}\n\nexport function canonicalSineCoefficients([\n amplitude,\n angularFrequency,\n phase,\n verticalOffset,\n]: [any, any, any, any]) {\n // For a curve of the form f(x) = a * Sin(b * x - c) + d,\n // this function ensures that a, b > 0, and c is its\n // smallest possible positive value.\n\n // Guarantee a > 0\n if (amplitude < 0) {\n amplitude *= -1;\n angularFrequency *= -1;\n phase *= -1;\n }\n\n const period = 2 * Math.PI;\n // Guarantee b > 0\n if (angularFrequency < 0) {\n angularFrequency *= -1;\n phase *= -1;\n phase += period / 2;\n }\n\n // Guarantee c is smallest possible positive value\n while (phase > 0) {\n phase -= period;\n }\n while (phase < 0) {\n phase += period;\n }\n\n return [amplitude, angularFrequency, phase, verticalOffset];\n}\n\n// e.g. rotate([1, 2, 3]) -> [2, 3, 1]\nexport function rotate<T>(\n array: ReadonlyArray<T>,\n n?: number,\n): ReadonlyArray<T> {\n n = typeof n === \"undefined\" ? 1 : n % array.length;\n return array.slice(n).concat(array.slice(0, n));\n}\n\nexport function getLineEquation(first: Coord, second: Coord): string {\n if (approximateEqual(first[0], second[0])) {\n return \"x = \" + first[0].toFixed(3);\n }\n const m = (second[1] - first[1]) / (second[0] - first[0]);\n const b = first[1] - m * first[0];\n return \"y = \" + m.toFixed(3) + \"x + \" + b.toFixed(3);\n}\n\n// Stolen from the wikipedia article\n// http://en.wikipedia.org/wiki/Line-line_intersection\nexport function getLineIntersection(\n // TODO(LP-10725): update these to be 2-tuples\n firstPoints: ReadonlyArray<Coord>,\n secondPoints: ReadonlyArray<Coord>,\n): [number, number] | null {\n const x1 = firstPoints[0][0];\n const y1 = firstPoints[0][1];\n const x2 = firstPoints[1][0];\n const y2 = firstPoints[1][1];\n const x3 = secondPoints[0][0];\n const y3 = secondPoints[0][1];\n const x4 = secondPoints[1][0];\n const y4 = secondPoints[1][1];\n\n const determinant = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n if (Math.abs(determinant) < 1e-9) {\n // Lines are parallel\n return null;\n }\n const x =\n ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) /\n determinant;\n const y =\n ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) /\n determinant;\n return [x, y];\n}\n\nexport function getLineIntersectionString(\n firstPoints: ReadonlyArray<Coord>,\n secondPoints: ReadonlyArray<Coord>,\n): string {\n const intersection = getLineIntersection(firstPoints, secondPoints);\n\n if (intersection === null) {\n return \"Lines are parallel\";\n }\n\n const [x, y] = intersection;\n return \"Intersection: (\" + x.toFixed(3) + \", \" + y.toFixed(3) + \")\";\n}\n","// This file contains helper functions for working with angles.\n\nimport {clockwise} from \"./geometry\";\n\nimport type {Coord} from \"@khanacademy/perseus-core\";\n\nexport function convertDegreesToRadians(degrees: number): number {\n return (degrees / 180) * Math.PI;\n}\n\nexport function convertRadiansToDegrees(radians: number): number {\n const degree = (radians / Math.PI) * 180;\n // Account for floating point errors.\n return Number(degree.toPrecision(15));\n}\n\n// Returns a value between -180 and 180, inclusive. The angle is measured\n// between the positive x-axis and the given vector.\nexport function calculateAngleInDegrees([x, y]: Coord): number {\n return (Math.atan2(y, x) * 180) / Math.PI;\n}\n\n// Converts polar coordinates to cartesian. The th(eta) parameter is in degrees.\nexport function polar(r: number | Coord, th: number): Coord {\n if (typeof r === \"number\") {\n r = [r, r];\n }\n th = (th * Math.PI) / 180;\n return [r[0] * Math.cos(th), r[1] * Math.sin(th)];\n}\n// This function calculates the angle between two points and an optional vertex.\n// If the vertex is not provided, the angle is measured between the two points.\n// This does not account for reflex angles or clockwise position.\nexport const getAngleFromVertex = (point: Coord, vertex: Coord): number => {\n const x = point[0] - vertex[0];\n const y = point[1] - vertex[1];\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (!x && !y) {\n return 0;\n }\n return (180 + (Math.atan2(-y, -x) * 180) / Math.PI + 360) % 360;\n};\n\n// This function calculates the clockwise angle between three points,\n// and is used to generate the labels and equation strings of the\n// current angle for the interactive graph.\nexport const getClockwiseAngle = (\n coords: [Coord, Coord, Coord],\n allowReflexAngles: boolean = false,\n): number => {\n const coordsCopy = [...coords];\n // The coords are saved as [point1, vertex, point2] in the interactive graph\n const areClockwise = clockwise([\n coordsCopy[0],\n coordsCopy[2],\n coordsCopy[1],\n ]);\n\n // We may need to reverse the coordinates if we allow\n // reflex angles and the points are not in clockwise order.\n const shouldReverseCoords = !areClockwise || allowReflexAngles;\n\n // Reverse the coordinates accordingly to ensure the angle is calculated correctly\n const clockwiseCoords = shouldReverseCoords\n ? coordsCopy.reverse()\n : coordsCopy;\n\n // Calculate the angles between the two points and get the difference\n // between the two angles to get the clockwise angle.\n const startAngle = getAngleFromVertex(\n clockwiseCoords[0],\n clockwiseCoords[1],\n );\n const endAngle = getAngleFromVertex(clockwiseCoords[2], clockwiseCoords[1]);\n const angle = (startAngle + 360 - endAngle) % 360;\n return angle;\n};\n","import type {SineCoefficient} from \"./geometry\";\nimport type {Coord} from \"@khanacademy/perseus-core\";\n\nexport type NamedSineCoefficient = {\n amplitude: number;\n angularFrequency: number;\n phase: number;\n verticalOffset: number;\n};\n\n// TODO: there's another, very similar getSinusoidCoefficients function\n// they should probably be merged\nexport function getSinusoidCoefficients(\n coords: ReadonlyArray<Coord>,\n): SineCoefficient {\n // It's assumed that p1 is the root and p2 is the first peak\n const p1 = coords[0];\n const p2 = coords[1];\n\n // Resulting coefficients are canonical for this sine curve\n const amplitude = p2[1] - p1[1];\n const angularFrequency = Math.PI / (2 * (p2[0] - p1[0]));\n const phase = p1[0] * angularFrequency;\n const verticalOffset = p1[1];\n\n return [amplitude, angularFrequency, phase, verticalOffset];\n}\n\nexport type QuadraticCoefficient = [number, number, number];\n\n// TODO: there's another, very similar getQuadraticCoefficients function\n// they should probably be merged\nexport function getQuadraticCoefficients(\n coords: ReadonlyArray<Coord>,\n): QuadraticCoefficient {\n const p1 = coords[0];\n const p2 = coords[1];\n const p3 = coords[2];\n\n const denom = (p1[0] - p2[0]) * (p1[0] - p3[0]) * (p2[0] - p3[0]);\n if (denom === 0) {\n // Many of the callers assume that the return value is always defined.\n // @ts-expect-error - TS2322 - Type 'undefined' is not assignable to type 'QuadraticCoefficient'.\n return;\n }\n const a =\n (p3[0] * (p2[1] - p1[1]) +\n p2[0] * (p1[1] - p3[1]) +\n p1[0] * (p3[1] - p2[1])) /\n denom;\n const b =\n (p3[0] * p3[0] * (p1[1] - p2[1]) +\n p2[0] * p2[0] * (p3[1] - p1[1]) +\n p1[0] * p1[0] * (p2[1] - p3[1])) /\n denom;\n const c =\n (p2[0] * p3[0] * (p2[0] - p3[0]) * p1[1] +\n p3[0] * p1[0] * (p3[0] - p1[0]) * p2[1] +\n p1[0] * p2[0] * (p1[0] - p2[0]) * p3[1]) /\n denom;\n return [a, b, c];\n}\n"],"names":["libName","libVersion","addLibraryVersionToPerseusDebug","DEFAULT_TOLERANCE","EPSILON","Math","pow","is","x","_","isNumber","isNaN","equal","y","tolerance","abs","sign","isInteger","num","round","precision","factor","roundTo","increment","floorTo","floor","ceilTo","ceil","toFraction","decimal","maxDenominator","n","d","a","rem","arraySum","array","reduce","memo","arg","arrayProduct","zip","arrays","min","map","length","results","i","push","pair","f","vec","dimension","Array","isArray","undefined","every","knumber","normalize","v","scale","sqrt","dot","b","zipped","multiplied","add","vecs","subtract","v1","v2","dim","negate","scalar","codirectional","collinear","polarRadFromCart","radius","theta","atan2","PI","polarDegFromCart","polar","cartFromPolarRad","cos","sin","cartFromPolarDeg","rotateRad","angle","rotateDeg","angleRad","acos","angleDeg","projection","elem","point","center","kvector","distanceToPoint","point1","point2","distanceToLine","line","lv","pv","projectedPv","distancePv","reflectOverLine","reflectedPv","compare","equalityTolerance","addVector","addVectors","subtractVector","kpoint","reflectPoint","midpoint","line1","line2","line1ToLine2Vector","ray1","ray2","sameOrigin","KhanMath","cleanMath","expr","replace","bound","max","factorial","getGCD","arguments","rest","slice","call","mod","getLCM","primes","isPrime","$","grep","p","getPrimeFactorization","number","maxf","merge","roundToNearest","toFixed","toFixedApprox","fixedStr","roundToApprox","fixed","String","fract","nd","Number","loN","loD","hiN","hiD","midN","midD","getNumericFormat","text","trim","match","fraction","parseFloat","toNumericString","format","numerator","denominator","pi","contains","modulus","integer","sum","val","approximateEqual","ccw","c","pointInRect","intersects","ab","cd","triplets","orientations","triplet","polygonSidesIntersect","vertices","k","iNext","kNext","side1","side2","vector","reverseVector","clockwise","points","segments","concat","areas","segment","p1","p2","magnitude","el","dotProduct","sideLengths","coords","rotate","angleMeasures","offsets","q","raw","offset","similar","coords1","coords2","angles1","angles2","sides1","sides2","angles","sides","reverse","approximateDeepEqual","sidePairs","factors","same","all","congruentEnough","lawOfCosines","canonicalSineCoefficients","amplitude","angularFrequency","phase","verticalOffset","period","getLineEquation","first","second","m","getLineIntersection","firstPoints","secondPoints","x1","y1","x2","y2","x3","y3","x4","y4","determinant","getLineIntersectionString","intersection","convertDegreesToRadians","degrees","convertRadiansToDegrees","radians","degree","toPrecision","calculateAngleInDegrees","r","th","getAngleFromVertex","vertex","getClockwiseAngle","allowReflexAngles","coordsCopy","areClockwise","shouldReverseCoords","clockwiseCoords","startAngle","endAngle","getSinusoidCoefficients","getQuadraticCoefficients","p3","denom"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -12,7 +12,7 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
12
12
  var ___default = /*#__PURE__*/_interopDefaultCompat(_);
13
13
  var $__default = /*#__PURE__*/_interopDefaultCompat($);
14
14
 
15
- const libName="@khanacademy/kmath";const libVersion="2.0.9";perseusUtils.addLibraryVersionToPerseusDebug(libName,libVersion);
15
+ const libName="@khanacademy/kmath";const libVersion="2.0.11";perseusUtils.addLibraryVersionToPerseusDebug(libName,libVersion);
16
16
 
17
17
  const DEFAULT_TOLERANCE=1e-9;const EPSILON=Math.pow(2,-42);function is$2(x){return ___default.default.isNumber(x)&&!___default.default.isNaN(x)}function equal$4(x,y,tolerance){if(x==null||y==null){return x===y}if(x===y){return true}if(tolerance==null){tolerance=DEFAULT_TOLERANCE;}return Math.abs(x-y)<tolerance}function sign$1(x,tolerance){return equal$4(x,0,tolerance)?0:Math.abs(x)/x}function isInteger(num,tolerance){return equal$4(Math.round(num),num,tolerance)}function round$2(num,precision){const factor=Math.pow(10,precision);return Math.round(num*factor)/factor}function roundTo$2(num,increment){return Math.round(num/increment)*increment}function floorTo$2(num,increment){return Math.floor(num/increment)*increment}function ceilTo$2(num,increment){return Math.ceil(num/increment)*increment}function toFraction(decimal,tolerance=EPSILON,maxDenominator=1e3){let n=[1,0];let d=[0,1];let a=Math.floor(decimal);let rem=decimal-a;while(d[0]<=maxDenominator){if(equal$4(n[0]/d[0],decimal,tolerance)){return [n[0],d[0]]}n=[a*n[0]+n[1],n[0]];d=[a*d[0]+d[1],d[0]];a=Math.floor(1/rem);rem=1/rem-a;}return [decimal,1]}
18
18
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/version.ts","../src/number.ts","../src/vector.ts","../src/point.ts","../src/line.ts","../src/ray.ts","../src/math.ts","../src/geometry.ts","../src/angles.ts","../src/coefficients.ts"],"sourcesContent":["// This file is processed by a Rollup plugin (replace) to inject the production\n// version number during the release build.\n// In dev, you'll never see the version number.\n\nimport {addLibraryVersionToPerseusDebug} from \"@khanacademy/perseus-utils\";\n\nconst libName = \"@khanacademy/kmath\";\nexport const libVersion = \"__lib_version__\";\n\naddLibraryVersionToPerseusDebug(libName, libVersion);\n","/**\n * Number Utils\n * A number is a js-number, e.g. 5.12\n */\n\nimport _ from \"underscore\";\n\nexport const DEFAULT_TOLERANCE = 1e-9;\n\n// TODO: Should this just be Number.Epsilon\nexport const EPSILON: number = Math.pow(2, -42);\n\nexport function is(x: any): boolean {\n return _.isNumber(x) && !_.isNaN(x);\n}\n\nexport function equal(x: number, y: number, tolerance?: number): boolean {\n // Checking for undefined makes this function behave nicely\n // with vectors of different lengths that are _.zip'd together\n if (x == null || y == null) {\n return x === y;\n }\n // We check === here so that +/-Infinity comparisons work correctly\n if (x === y) {\n return true;\n }\n if (tolerance == null) {\n tolerance = DEFAULT_TOLERANCE;\n }\n return Math.abs(x - y) < tolerance;\n}\n\nexport function sign(\n x: number,\n tolerance?: number,\n): number /* Should be: 0 | 1 | -1 */ {\n return equal(x, 0, tolerance) ? 0 : Math.abs(x) / x;\n}\n\nexport function isInteger(num: number, tolerance?: number): boolean {\n return equal(Math.round(num), num, tolerance);\n}\n\n// Round a number to a certain number of decimal places\nexport function round(num: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round(num * factor) / factor;\n}\n\n// Round num to the nearest multiple of increment\n// i.e. roundTo(83, 5) -> 85\nexport function roundTo(num: number, increment: number): number {\n return Math.round(num / increment) * increment;\n}\n\nexport function floorTo(num: number, increment: number): number {\n return Math.floor(num / increment) * increment;\n}\n\nexport function ceilTo(num: number, increment: number): number {\n return Math.ceil(num / increment) * increment;\n}\n\n/**\n * toFraction\n *\n * Returns a [numerator, denominator] array rational representation\n * of `decimal`\n *\n * See http://en.wikipedia.org/wiki/Continued_fraction for implementation\n * details\n *\n * toFraction(4/8) => [1, 2]\n * toFraction(0.66) => [33, 50]\n * toFraction(0.66, 0.01) => [2/3]\n * toFraction(283 + 1/3) => [850, 3]\n */\nexport function toFraction(\n decimal: number,\n // can't be 0\n tolerance: number = EPSILON,\n maxDenominator = 1000,\n): [number, number] {\n // Initialize everything to compute successive terms of\n // continued-fraction approximations via recurrence relation\n let n = [1, 0];\n let d = [0, 1];\n let a = Math.floor(decimal);\n let rem = decimal - a;\n\n while (d[0] <= maxDenominator) {\n if (equal(n[0] / d[0], decimal, tolerance)) {\n return [n[0], d[0]];\n }\n n = [a * n[0] + n[1], n[0]];\n d = [a * d[0] + d[1], d[0]];\n a = Math.floor(1 / rem);\n rem = 1 / rem - a;\n }\n\n // We failed to find a nice rational representation,\n // so return an irrational \"fraction\"\n return [decimal, 1];\n}\n","/**\n * Vector Utils\n * A vector is an array of numbers e.g. [0, 3, 4].\n */\n\nimport * as knumber from \"./number\";\n\ntype Vector = ReadonlyArray<number>;\n\nfunction arraySum(array: ReadonlyArray<number>): number {\n return array.reduce((memo, arg) => memo + arg, 0);\n}\n\nfunction arrayProduct(array: ReadonlyArray<number>): number {\n return array.reduce((memo, arg) => memo * arg, 1);\n}\n\nexport function zip<T>(xs: ReadonlyArray<T>, ys: ReadonlyArray<T>): [T, T][];\nexport function zip<T>(...arrays: ReadonlyArray<T>[]): T[][];\nexport function zip<T>(...arrays: ReadonlyArray<T>[]): T[][] {\n const n = Math.min(...arrays.map((a) => a.length));\n const results: T[][] = [];\n for (let i = 0; i < n; i++) {\n results.push(arrays.map((a) => a[i]));\n }\n return results;\n}\n\nexport function map<T, U>(pair: [T, T], f: (a: T, i: number) => U): [U, U] {\n return [f(pair[0], 0), f(pair[1], 1)];\n}\n\n/**\n * Checks if the given vector contains only numbers and, optionally, is of the\n * right dimension (length).\n *\n * is([1, 2, 3]) -> true\n * is([1, \"Hello\", 3]) -> false\n * is([1, 2, 3], 1) -> false\n */\nexport function is(vec: unknown, dimension: 2): vec is [number, number];\nexport function is(vec: unknown, dimension?: number): vec is Vector;\nexport function is(vec: unknown, dimension?: number) {\n if (!Array.isArray(vec)) {\n return false;\n }\n if (dimension !== undefined && vec.length !== dimension) {\n return false;\n }\n return vec.every(knumber.is);\n}\n\n// Normalize to a unit vector\nexport function normalize<V extends Vector>(v: V): V {\n return scale(v, 1 / length(v));\n}\n\n// Length/magnitude of a vector\nexport function length(v: Vector): number {\n return Math.sqrt(dot(v, v));\n}\n// Dot product of two vectors\nexport function dot(a: Vector, b: Vector): number {\n const zipped = zip(a, b);\n const multiplied = zipped.map(arrayProduct);\n return arraySum(multiplied);\n}\n\n/* vector-add multiple [x, y] coords/vectors\n *\n * add([1, 2], [3, 4]) -> [4, 6]\n */\nexport function add<V extends Vector>(...vecs: ReadonlyArray<V>): V {\n const zipped = zip(...vecs);\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return zipped.map(arraySum);\n}\n\nexport function subtract<V extends Vector>(v1: V, v2: V): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return zip(v1, v2).map((dim) => dim[0] - dim[1]);\n}\n\nexport function negate<V extends Vector>(v: V): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return v.map((x) => {\n return -x;\n });\n}\n\n// Scale a vector\nexport function scale<V extends Vector>(v1: V, scalar: number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return v1.map((x) => {\n return x * scalar;\n });\n}\n\nexport function equal(v1: Vector, v2: Vector, tolerance?: number): boolean {\n return (\n v1.length === v2.length &&\n zip(v1, v2).every((pair) => knumber.equal(pair[0], pair[1], tolerance))\n );\n}\n\nexport function codirectional(\n v1: Vector,\n v2: Vector,\n tolerance?: number,\n): boolean {\n // The origin is trivially codirectional with all other vectors.\n // This gives nice semantics for codirectionality between points when\n // comparing their difference vectors.\n if (\n knumber.equal(length(v1), 0, tolerance) ||\n knumber.equal(length(v2), 0, tolerance)\n ) {\n return true;\n }\n\n v1 = normalize(v1);\n v2 = normalize(v2);\n\n return equal(v1, v2, tolerance);\n}\n\nexport function collinear(v1: Vector, v2: Vector, tolerance?: number): boolean {\n return (\n codirectional(v1, v2, tolerance) ||\n codirectional(v1, negate(v2), tolerance)\n );\n}\n\n// TODO(jeremy) These coordinate conversion functions really only handle 2D points (ie. [number, number])\n\n// Convert a cartesian coordinate into a radian polar coordinate\nexport function polarRadFromCart(\n v: ReadonlyArray<number>,\n): ReadonlyArray<number> {\n const radius = length(v);\n let theta = Math.atan2(v[1], v[0]);\n\n // Convert angle range from [-pi, pi] to [0, 2pi]\n if (theta < 0) {\n theta += 2 * Math.PI;\n }\n\n return [radius, theta];\n}\n\n// Converts a cartesian coordinate into a degree polar coordinate\nexport function polarDegFromCart(\n v: ReadonlyArray<number>,\n): ReadonlyArray<number> /* TODO: convert to tuple/Point */ {\n const polar = polarRadFromCart(v);\n return [polar[0], (polar[1] * 180) / Math.PI];\n}\n\n/* Convert a polar coordinate into a cartesian coordinate\n *\n * Examples:\n * cartFromPolarRad(5, Math.PI)\n */\nexport function cartFromPolarRad(\n radius: number,\n theta = 0,\n): ReadonlyArray<number> /* TODO: convert to tuple/Point */ {\n return [radius * Math.cos(theta), radius * Math.sin(theta)];\n}\n\n/* Convert a polar coordinate into a cartesian coordinate\n *\n * Examples:\n * cartFromPolarDeg(5, 30)\n */\nexport function cartFromPolarDeg(\n radius: number,\n theta = 0,\n): ReadonlyArray<number> {\n return cartFromPolarRad(radius, (theta * Math.PI) / 180);\n}\n\n// Rotate vector\nexport function rotateRad(\n v: ReadonlyArray<number>,\n theta: number,\n): ReadonlyArray<number> {\n const polar = polarRadFromCart(v);\n const angle = polar[1] + theta;\n return cartFromPolarRad(polar[0], angle);\n}\n\nexport function rotateDeg(\n v: ReadonlyArray<number>,\n theta: number,\n): ReadonlyArray<number> {\n const polar = polarDegFromCart(v);\n const angle = polar[1] + theta;\n return cartFromPolarDeg(polar[0], angle);\n}\n\n// Angle between two vectors\nexport function angleRad(v1: Vector, v2: Vector): number {\n return Math.acos(dot(v1, v2) / (length(v1) * length(v2)));\n}\n\nexport function angleDeg(v1: Vector, v2: Vector): number {\n return (angleRad(v1, v2) * 180) / Math.PI;\n}\n\n// Vector projection of v1 onto v2\nexport function projection<V extends Vector>(v1: V, v2: V): V {\n const scalar = dot(v1, v2) / dot(v2, v2);\n return scale(v2, scalar);\n}\n\n// Round each number to a certain number of decimal places\nexport function round<V extends Vector>(vec: V, precision: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) => knumber.round(elem, precision[i] || precision));\n}\n\n// Round each number to the nearest increment\nexport function roundTo(\n coord: [number, number],\n increment: [number, number] | number,\n): [number, number];\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V;\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.roundTo(elem, increment[i] || increment),\n );\n}\n\nexport function floorTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.floorTo(elem, increment[i] || increment),\n );\n}\n\nexport function ceilTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.ceilTo(elem, increment[i] || increment),\n );\n}\n","/**\n * Point Utils\n * A point is an array of two numbers e.g. [0, 0].\n */\n\nimport * as knumber from \"./number\";\nimport * as kvector from \"./vector\";\n\n// A point, in 2D, 3D, or nD space.\nexport type Point = ReadonlyArray<number>;\n\n// Rotate point (around origin unless a center is specified)\nexport function rotateRad(point: Point, theta: number, center?: Point): Point {\n if (center === undefined) {\n return kvector.rotateRad(point, theta);\n } else {\n return kvector.add(\n center,\n kvector.rotateRad(kvector.subtract(point, center), theta),\n );\n }\n}\n\nexport function rotateDeg(point: Point, theta: number, center?: Point): Point {\n if (center === undefined) {\n return kvector.rotateDeg(point, theta);\n } else {\n return kvector.add(\n center,\n kvector.rotateDeg(kvector.subtract(point, center), theta),\n );\n }\n}\n\n// Distance between two points\nexport function distanceToPoint(point1: Point, point2: Point): number {\n return kvector.length(kvector.subtract(point1, point2));\n}\n\n// Distance between point and line\nexport function distanceToLine(point: Point, line: [Point, Point]): number {\n const lv = kvector.subtract(line[1], line[0]);\n const pv = kvector.subtract(point, line[0]);\n const projectedPv = kvector.projection(pv, lv);\n const distancePv = kvector.subtract(projectedPv, pv);\n return kvector.length(distancePv);\n}\n\n// Reflect point over line\nexport function reflectOverLine<P extends Point>(point: P, line: [P, P]): P {\n const lv = kvector.subtract(line[1], line[0]);\n const pv = kvector.subtract(point, line[0]);\n const projectedPv = kvector.projection(pv, lv);\n const reflectedPv = kvector.subtract(kvector.scale(projectedPv, 2), pv);\n return kvector.add(line[0], reflectedPv);\n}\n\n/**\n * Compares two points, returning -1, 0, or 1, for use with\n * Array.prototype.sort\n *\n * Note: This technically doesn't satisfy the total-ordering\n * requirements of Array.prototype.sort unless equalityTolerance\n * is 0. In some cases very close points that compare within a\n * few equalityTolerances could appear in the wrong order.\n */\nexport function compare(\n point1: Point,\n point2: Point,\n equalityTolerance?: number,\n): number /* TODO: convert to -1 | 0 | 1 type */ {\n if (point1.length !== point2.length) {\n return point1.length - point2.length;\n }\n for (let i = 0; i < point1.length; i++) {\n if (!knumber.equal(point1[i], point2[i], equalityTolerance)) {\n return point1[i] - point2[i];\n }\n }\n return 0;\n}\n\n// Check if a value is a point\nexport const is = kvector.is;\n\n// Add and subtract vector(s)\nexport const addVector = kvector.add;\nexport const addVectors = kvector.add;\nexport const subtractVector = kvector.subtract;\nexport const equal = kvector.equal;\n\n// Convert from cartesian to polar and back\nexport const polarRadFromCart = kvector.polarRadFromCart;\nexport const polarDegFromCart = kvector.polarDegFromCart;\nexport const cartFromPolarRad = kvector.cartFromPolarRad;\nexport const cartFromPolarDeg = kvector.cartFromPolarDeg;\n\n// Rounding\nexport const round = kvector.round;\nexport const roundTo = kvector.roundTo;\nexport const floorTo = kvector.floorTo;\nexport const ceilTo = kvector.ceilTo;\n","/**\n * Line Utils\n * A line is an array of two points e.g. [[-5, 0], [5, 0]].\n */\n\nimport * as kpoint from \"./point\";\nimport * as kvector from \"./vector\";\n\nimport type {Point} from \"./point\";\n\nexport type Line = [Point, Point];\n\nexport function distanceToPoint(line: Line, point: Point): number {\n return kpoint.distanceToLine(point, line);\n}\n\nexport function reflectPoint(line: Line, point: Point): Point {\n return kpoint.reflectOverLine(point, line);\n}\n\nexport function midpoint(line: Line): Point {\n return [(line[0][0] + line[1][0]) / 2, (line[0][1] + line[1][1]) / 2];\n}\n\nexport function equal(line1: Line, line2: Line, tolerance?: number): boolean {\n // TODO: A nicer implementation might just check collinearity of\n // vectors using underscore magick\n // Compare the directions of the lines\n const v1 = kvector.subtract(line1[1], line1[0]);\n const v2 = kvector.subtract(line2[1], line2[0]);\n if (!kvector.collinear(v1, v2, tolerance)) {\n return false;\n }\n // If the start point is the same for the two lines, then they are the same\n if (kpoint.equal(line1[0], line2[0])) {\n return true;\n }\n // Make sure that the direction to get from line1 to\n // line2 is the same as the direction of the lines\n const line1ToLine2Vector = kvector.subtract(line2[0], line1[0]);\n return kvector.collinear(v1, line1ToLine2Vector, tolerance);\n}\n","/**\n * Ray Utils\n * A ray (→) is an array of an endpoint and another point along the ray.\n * For example, [[0, 0], [1, 0]] is the ray starting at the origin and\n * traveling along the positive x-axis.\n */\n\nimport * as kpoint from \"./point\";\nimport * as kvector from \"./vector\";\n\nimport type {Point} from \"./point\";\n\nexport type Ray = [Point, Point];\n\nexport function equal(ray1: Ray, ray2: Ray, tolerance?: number): boolean {\n // Compare the directions of the rays\n const v1 = kvector.subtract(ray1[1], ray1[0]);\n const v2 = kvector.subtract(ray2[1], ray2[0]);\n\n const sameOrigin = kpoint.equal(ray1[0], ray2[0]);\n const codirectional = kvector.codirectional(v1, v2, tolerance);\n\n return sameOrigin && codirectional;\n}\n","import $ from \"jquery\";\nimport _ from \"underscore\";\n\nimport * as knumber from \"./number\";\n\nimport type {MathFormat} from \"@khanacademy/perseus-core\";\n\nconst KhanMath = {\n // Simplify formulas before display\n cleanMath: function (expr: string): string {\n return typeof expr === \"string\"\n ? expr\n .replace(/\\+\\s*-/g, \"- \")\n .replace(/-\\s*-/g, \"+ \")\n .replace(/\\^1/g, \"\")\n : expr;\n },\n\n // Bound a number by 1e-6 and 1e20 to avoid exponents after toString\n bound: function (num: number): number {\n if (num === 0) {\n return num;\n }\n if (num < 0) {\n return -KhanMath.bound(-num);\n }\n return Math.max(1e-6, Math.min(num, 1e20));\n },\n\n factorial: function (x: number): number {\n if (x <= 1) {\n return x;\n }\n return x * KhanMath.factorial(x - 1);\n },\n\n getGCD: function (a: number, b: number): number {\n if (arguments.length > 2) {\n // TODO(kevinb): rewrite using rest args instead of arguments\n // eslint-disable-next-line prefer-rest-params\n const rest = [].slice.call(arguments, 1);\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return KhanMath.getGCD(a, KhanMath.getGCD(...rest));\n }\n let mod;\n\n a = Math.abs(a);\n b = Math.abs(b);\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n while (b) {\n mod = a % b;\n a = b;\n b = mod;\n }\n\n return a;\n },\n\n getLCM: function (a: number, b: number): number {\n if (arguments.length > 2) {\n // TODO(kevinb): rewrite using rest args instead of arguments\n // eslint-disable-next-line prefer-rest-params\n const rest = [].slice.call(arguments, 1);\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return KhanMath.getLCM(a, KhanMath.getLCM(...rest));\n }\n return Math.abs(a * b) / KhanMath.getGCD(a, b);\n },\n\n primes: [\n 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,\n 71, 73, 79, 83, 89, 97,\n ],\n\n isPrime: function (n: number): boolean {\n if (n <= 1) {\n return false;\n }\n if (n < 101) {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n return !!$.grep(KhanMath.primes, function (p, i) {\n return Math.abs(p - n) <= 0.5;\n }).length;\n }\n if (n <= 1 || (n > 2 && n % 2 === 0)) {\n return false;\n }\n for (let i = 3, sqrt = Math.sqrt(n); i <= sqrt; i += 2) {\n if (n % i === 0) {\n return false;\n }\n }\n\n return true;\n },\n // @ts-expect-error - TS2366 - Function lacks ending return statement and return type does not include 'undefined'.\n getPrimeFactorization: function (number: number): ReadonlyArray<number> {\n if (number === 1) {\n return [];\n }\n if (KhanMath.isPrime(number)) {\n return [number];\n }\n\n const maxf = Math.sqrt(number);\n for (let f = 2; f <= maxf; f++) {\n if (number % f === 0) {\n return $.merge(\n KhanMath.getPrimeFactorization(f),\n KhanMath.getPrimeFactorization(number / f),\n );\n }\n }\n },\n\n // Round a number to the nearest increment\n // E.g., if increment = 30 and num = 40, return 30. if increment = 30 and\n // num = 45, return 60.\n roundToNearest: function (increment: number, num: number): number {\n return Math.round(num / increment) * increment;\n },\n\n // Round a number to a certain number of decimal places\n roundTo: function (precision: number, num: number): number {\n const factor = Math.pow(10, precision).toFixed(5);\n // @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type 'number'. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.\n return Math.round((num * factor).toFixed(5)) / factor;\n },\n\n /**\n * Return a string of num rounded to a fixed precision decimal places,\n * with an approx symbol if num had to be rounded, and trailing 0s\n */\n toFixedApprox: function (num: number, precision: number): string {\n // TODO(aria): Make this locale-dependent\n const fixedStr = num.toFixed(precision);\n if (knumber.equal(+fixedStr, num)) {\n return fixedStr;\n }\n return \"\\\\approx \" + fixedStr;\n },\n\n /**\n * Return a string of num rounded to precision decimal places, with an\n * approx symbol if num had to be rounded, but no trailing 0s if it was\n * not rounded.\n */\n roundToApprox: function (num: number, precision: number): string {\n const fixed = KhanMath.roundTo(precision, num);\n if (knumber.equal(fixed, num)) {\n return String(fixed);\n }\n return KhanMath.toFixedApprox(num, precision);\n },\n\n // toFraction(4/8) => [1, 2]\n // toFraction(0.666) => [333, 500]\n // toFraction(0.666, 0.001) => [2, 3]\n //\n // tolerance can't be bigger than 1, sorry\n toFraction: function (\n decimal: number,\n tolerance?: number,\n ): [number, number] {\n if (tolerance == null) {\n tolerance = Math.pow(2, -46);\n }\n\n if (decimal < 0 || decimal > 1) {\n let fract = decimal % 1;\n fract += fract < 0 ? 1 : 0;\n\n const nd = KhanMath.toFraction(fract, tolerance);\n nd[0] += Math.round(decimal - fract) * nd[1];\n return nd;\n }\n if (Math.abs(Math.round(Number(decimal)) - decimal) <= tolerance) {\n return [Math.round(decimal), 1];\n }\n let loN = 0;\n let loD = 1;\n let hiN = 1;\n let hiD = 1;\n let midN = 1;\n let midD = 2;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (Math.abs(Number(midN / midD) - decimal) <= tolerance) {\n return [midN, midD];\n }\n if (midN / midD < decimal) {\n loN = midN;\n loD = midD;\n } else {\n hiN = midN;\n hiD = midD;\n }\n\n midN = loN + hiN;\n midD = loD + hiD;\n }\n },\n\n // Returns the format (string) of a given numeric string\n // Note: purposively more inclusive than answer-types' predicate.forms\n // That is, it is not necessarily true that interpreted input are numeric\n getNumericFormat: function (text: string): MathFormat | null | undefined {\n text = $.trim(text);\n text = text.replace(/\\u2212/, \"-\").replace(/([+-])\\s+/g, \"$1\");\n if (text.match(/^[+-]?\\d+$/)) {\n return \"integer\";\n }\n if (text.match(/^[+-]?\\d+\\s+\\d+\\s*\\/\\s*\\d+$/)) {\n return \"mixed\";\n }\n const fraction = text.match(/^[+-]?(\\d+)\\s*\\/\\s*(\\d+)$/);\n if (fraction) {\n return parseFloat(fraction[1]) > parseFloat(fraction[2])\n ? \"improper\"\n : \"proper\";\n }\n if (text.replace(/[,. ]/g, \"\").match(/^\\d+$/)) {\n return \"decimal\";\n }\n if (text.match(/(pi?|\\u03c0|t(?:au)?|\\u03c4|pau)/)) {\n return \"pi\";\n }\n return null;\n },\n\n // Returns a string of the number in a specified format\n toNumericString: function (number: number, format?: MathFormat): string {\n if (number == null) {\n return \"\";\n }\n if (number === 0) {\n return \"0\"; // otherwise it might end up as 0% or 0pi\n }\n\n if (format === \"percent\") {\n return number * 100 + \"%\";\n }\n\n if (format === \"pi\") {\n const fraction = knumber.toFraction(number / Math.PI);\n const numerator = Math.abs(fraction[0]);\n const denominator = fraction[1];\n if (knumber.isInteger(numerator)) {\n const sign = number < 0 ? \"-\" : \"\";\n const pi = \"\\u03C0\";\n return (\n sign +\n (numerator === 1 ? \"\" : numerator) +\n pi +\n (denominator === 1 ? \"\" : \"/\" + denominator)\n );\n }\n }\n\n if (_([\"proper\", \"improper\", \"mixed\", \"fraction\"]).contains(format)) {\n const fraction = knumber.toFraction(number);\n const numerator = Math.abs(fraction[0]);\n const denominator = fraction[1];\n const sign = number < 0 ? \"-\" : \"\";\n if (denominator === 1) {\n return sign + numerator; // for integers, irrational, d > 1000\n }\n if (format === \"mixed\") {\n const modulus = numerator % denominator;\n const integer = (numerator - modulus) / denominator;\n return (\n sign +\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n (integer ? integer + \" \" : \"\") +\n modulus +\n \"/\" +\n denominator\n );\n } // otherwise proper, improper, or fraction\n return sign + numerator + \"/\" + denominator;\n }\n\n // otherwise (decimal, float, long long)\n return String(number);\n },\n} as const;\n\nexport function sum(array: number[]): number {\n return array.reduce(add, 0);\n}\n\nfunction add(a: number, b: number): number {\n return a + b;\n}\n\nexport default KhanMath;\n","/**\n * A collection of geomtry-related utility functions\n */\n\nimport {\n approximateDeepEqual,\n approximateEqual,\n type Coord,\n} from \"@khanacademy/perseus-core\";\nimport _ from \"underscore\";\n\nimport {sum} from \"./math\";\nimport * as knumber from \"./number\";\nimport * as kpoint from \"./point\";\n\ntype Line = [Coord, Coord];\n\n// This should really be a readonly tuple of [number, number]\nexport type Range = [number, number];\n\nexport type SineCoefficient = [\n number, // amplitude\n number, // angularFrequency\n number, // phase\n number, // verticalOffset\n];\n\n// Given a number, return whether it is positive (1), negative (-1), or zero (0)\nexport function sign(val: number): 0 | 1 | -1 {\n if (approximateEqual(val, 0)) {\n return 0;\n }\n return val > 0 ? 1 : -1;\n}\n\n// Determine whether three points are collinear (0), for a clockwise turn (negative),\n// or counterclockwise turn (positive)\nexport function ccw(a: Coord, b: Coord, c: Coord): number {\n return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]);\n}\n\nexport function collinear(a: Coord, b: Coord, c: Coord): boolean {\n return approximateEqual(ccw(a, b, c), 0);\n}\n\n// Given rect bounding points A and B, whether point C is inside the rect\nfunction pointInRect(a: Coord, b: Coord, c: Coord): boolean {\n return (\n c[0] <= Math.max(a[0], b[0]) &&\n c[0] >= Math.min(a[0], b[0]) &&\n c[1] <= Math.max(a[1], b[1]) &&\n c[1] >= Math.min(a[1], b[1])\n );\n}\n\n// Whether line segment AB intersects line segment CD\n// http://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/\nexport function intersects(ab: Line, cd: Line): boolean {\n const triplets = [\n [ab[0], ab[1], cd[0]] as const,\n [ab[0], ab[1], cd[1]] as const,\n [cd[0], cd[1], ab[0]] as const,\n [cd[0], cd[1], ab[1]] as const,\n ];\n\n const orientations = _.map(triplets, function (triplet) {\n return sign(ccw(...triplet));\n });\n\n if (\n orientations[0] !== orientations[1] &&\n orientations[2] !== orientations[3]\n ) {\n return true;\n }\n\n for (let i = 0; i < 4; i++) {\n if (orientations[i] === 0 && pointInRect(...triplets[i])) {\n return true;\n }\n }\n\n return false;\n}\n\n// Whether any two sides of a polygon intersect each other\nexport function polygonSidesIntersect(vertices: Coord[]): boolean {\n for (let i = 0; i < vertices.length; i++) {\n for (let k = i + 1; k < vertices.length; k++) {\n // If any two vertices are the same point, sides overlap\n if (kpoint.equal(vertices[i], vertices[k])) {\n return true;\n }\n\n // Find the other end of the sides starting at vertices i and k\n const iNext = (i + 1) % vertices.length;\n const kNext = (k + 1) % vertices.length;\n\n // Adjacent sides always intersect (at the vertex); skip those\n if (iNext === k || kNext === i) {\n continue;\n }\n\n const side1: Line = [vertices[i], vertices[iNext]];\n const side2: Line = [vertices[k], vertices[kNext]];\n if (intersects(side1, side2)) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function vector(a, b) {\n return _.map(_.zip(a, b), function (pair) {\n return pair[0] - pair[1];\n });\n}\n\nexport function reverseVector(vector: Coord): Coord {\n return [-vector[0], -vector[1]];\n}\n\n// Returns whether connecting the given sequence of `points` forms a clockwise\n// path (assuming a closed loop, where the last point connects back to the\n// first).\nexport function clockwise(points: Coord[]): boolean {\n const segments = _.zip(points, points.slice(1).concat(points.slice(0, 1)));\n const areas = _.map(segments, function (segment) {\n const p1 = segment[0];\n const p2 = segment[1];\n return (p2[0] - p1[0]) * (p2[1] + p1[1]);\n });\n return sum(areas) > 0;\n}\n\nexport function magnitude(v: ReadonlyArray<Coord>): number {\n return Math.sqrt(\n _.reduce(\n v,\n function (memo, el) {\n // @ts-expect-error - TS2345 - Argument of type 'Coord' is not assignable to parameter of type 'number'.\n return memo + Math.pow(el, 2);\n },\n 0,\n ),\n );\n}\n\nfunction dotProduct(a: Coord, b: Coord): number {\n return _.reduce(\n _.zip(a, b),\n function (memo, pair) {\n return memo + pair[0] * pair[1];\n },\n 0,\n );\n}\n\nfunction sideLengths(coords: ReadonlyArray<Coord>): ReadonlyArray<number> {\n const segments = _.zip(coords, rotate(coords));\n return segments.map(function (segment) {\n // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'. | TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return magnitude(vector(...segment));\n });\n}\n\n// Based on http://math.stackexchange.com/a/151149\nexport function angleMeasures(\n coords: ReadonlyArray<Coord>,\n): ReadonlyArray<number> {\n const triplets = _.zip(rotate(coords, -1), coords, rotate(coords, 1));\n\n const offsets = _.map(triplets, function (triplet) {\n const p = vector(triplet[1], triplet[0]);\n const q = vector(triplet[2], triplet[1]);\n // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'Coord'. | TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'. | TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'.\n const raw = Math.acos(dotProduct(p, q) / (magnitude(p) * magnitude(q)));\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return sign(ccw(...triplet)) > 0 ? raw : -raw;\n });\n\n const sum = _.reduce(\n offsets,\n function (memo, arg) {\n return memo + arg;\n },\n 0,\n );\n\n return _.map(offsets, function (offset) {\n return sum > 0 ? Math.PI - offset : Math.PI + offset;\n });\n}\n\n// Whether two polygons are similar (or if specified, congruent)\nexport function similar(\n coords1: ReadonlyArray<Coord>,\n coords2: ReadonlyArray<Coord>,\n tolerance: number,\n): boolean {\n if (coords1.length !== coords2.length) {\n return false;\n }\n\n const n = coords1.length;\n\n const angles1 = angleMeasures(coords1);\n const angles2 = angleMeasures(coords2);\n\n const sides1 = sideLengths(coords1);\n const sides2 = sideLengths(coords2);\n\n for (let i = 0; i < 2 * n; i++) {\n let angles = angles2.slice();\n let sides = sides2.slice();\n\n // Reverse angles and sides to allow matching reflected polygons\n if (i >= n) {\n angles.reverse();\n sides.reverse();\n // Since sides are calculated from two coordinates,\n // simply reversing results in an off by one error\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n sides = rotate(sides, 1);\n }\n\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n angles = rotate(angles, i);\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n sides = rotate(sides, i);\n\n if (approximateDeepEqual(angles1, angles)) {\n const sidePairs = _.zip(sides1, sides);\n\n const factors = _.map(sidePairs, function (pair) {\n return pair[0] / pair[1];\n });\n\n const same = _.all(factors, function (factor) {\n return approximateEqual(factors[0], factor);\n });\n\n const congruentEnough = _.all(sidePairs, function (pair) {\n return knumber.equal(pair[0], pair[1], tolerance);\n });\n\n if (same && congruentEnough) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n// Given triangle with sides ABC return angle opposite side C in degrees\nexport function lawOfCosines(a: number, b: number, c: number): number {\n return (Math.acos((a * a + b * b - c * c) / (2 * a * b)) * 180) / Math.PI;\n}\n\nexport function canonicalSineCoefficients([\n amplitude,\n angularFrequency,\n phase,\n verticalOffset,\n]: [any, any, any, any]) {\n // For a curve of the form f(x) = a * Sin(b * x - c) + d,\n // this function ensures that a, b > 0, and c is its\n // smallest possible positive value.\n\n // Guarantee a > 0\n if (amplitude < 0) {\n amplitude *= -1;\n angularFrequency *= -1;\n phase *= -1;\n }\n\n const period = 2 * Math.PI;\n // Guarantee b > 0\n if (angularFrequency < 0) {\n angularFrequency *= -1;\n phase *= -1;\n phase += period / 2;\n }\n\n // Guarantee c is smallest possible positive value\n while (phase > 0) {\n phase -= period;\n }\n while (phase < 0) {\n phase += period;\n }\n\n return [amplitude, angularFrequency, phase, verticalOffset];\n}\n\n// e.g. rotate([1, 2, 3]) -> [2, 3, 1]\nexport function rotate<T>(\n array: ReadonlyArray<T>,\n n?: number,\n): ReadonlyArray<T> {\n n = typeof n === \"undefined\" ? 1 : n % array.length;\n return array.slice(n).concat(array.slice(0, n));\n}\n\nexport function getLineEquation(first: Coord, second: Coord): string {\n if (approximateEqual(first[0], second[0])) {\n return \"x = \" + first[0].toFixed(3);\n }\n const m = (second[1] - first[1]) / (second[0] - first[0]);\n const b = first[1] - m * first[0];\n return \"y = \" + m.toFixed(3) + \"x + \" + b.toFixed(3);\n}\n\n// Stolen from the wikipedia article\n// http://en.wikipedia.org/wiki/Line-line_intersection\nexport function getLineIntersection(\n // TODO(LP-10725): update these to be 2-tuples\n firstPoints: ReadonlyArray<Coord>,\n secondPoints: ReadonlyArray<Coord>,\n): [number, number] | null {\n const x1 = firstPoints[0][0];\n const y1 = firstPoints[0][1];\n const x2 = firstPoints[1][0];\n const y2 = firstPoints[1][1];\n const x3 = secondPoints[0][0];\n const y3 = secondPoints[0][1];\n const x4 = secondPoints[1][0];\n const y4 = secondPoints[1][1];\n\n const determinant = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n if (Math.abs(determinant) < 1e-9) {\n // Lines are parallel\n return null;\n }\n const x =\n ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) /\n determinant;\n const y =\n ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) /\n determinant;\n return [x, y];\n}\n\nexport function getLineIntersectionString(\n firstPoints: ReadonlyArray<Coord>,\n secondPoints: ReadonlyArray<Coord>,\n): string {\n const intersection = getLineIntersection(firstPoints, secondPoints);\n\n if (intersection === null) {\n return \"Lines are parallel\";\n }\n\n const [x, y] = intersection;\n return \"Intersection: (\" + x.toFixed(3) + \", \" + y.toFixed(3) + \")\";\n}\n","// This file contains helper functions for working with angles.\n\nimport {clockwise} from \"./geometry\";\n\nimport type {Coord} from \"@khanacademy/perseus-core\";\n\nexport function convertDegreesToRadians(degrees: number): number {\n return (degrees / 180) * Math.PI;\n}\n\nexport function convertRadiansToDegrees(radians: number): number {\n const degree = (radians / Math.PI) * 180;\n // Account for floating point errors.\n return Number(degree.toPrecision(15));\n}\n\n// Returns a value between -180 and 180, inclusive. The angle is measured\n// between the positive x-axis and the given vector.\nexport function calculateAngleInDegrees([x, y]: Coord): number {\n return (Math.atan2(y, x) * 180) / Math.PI;\n}\n\n// Converts polar coordinates to cartesian. The th(eta) parameter is in degrees.\nexport function polar(r: number | Coord, th: number): Coord {\n if (typeof r === \"number\") {\n r = [r, r];\n }\n th = (th * Math.PI) / 180;\n return [r[0] * Math.cos(th), r[1] * Math.sin(th)];\n}\n// This function calculates the angle between two points and an optional vertex.\n// If the vertex is not provided, the angle is measured between the two points.\n// This does not account for reflex angles or clockwise position.\nexport const getAngleFromVertex = (point: Coord, vertex: Coord): number => {\n const x = point[0] - vertex[0];\n const y = point[1] - vertex[1];\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (!x && !y) {\n return 0;\n }\n return (180 + (Math.atan2(-y, -x) * 180) / Math.PI + 360) % 360;\n};\n\n// This function calculates the clockwise angle between three points,\n// and is used to generate the labels and equation strings of the\n// current angle for the interactive graph.\nexport const getClockwiseAngle = (\n coords: [Coord, Coord, Coord],\n allowReflexAngles: boolean = false,\n): number => {\n const coordsCopy = [...coords];\n // The coords are saved as [point1, vertex, point2] in the interactive graph\n const areClockwise = clockwise([\n coordsCopy[0],\n coordsCopy[2],\n coordsCopy[1],\n ]);\n\n // We may need to reverse the coordinates if we allow\n // reflex angles and the points are not in clockwise order.\n const shouldReverseCoords = !areClockwise || allowReflexAngles;\n\n // Reverse the coordinates accordingly to ensure the angle is calculated correctly\n const clockwiseCoords = shouldReverseCoords\n ? coordsCopy.reverse()\n : coordsCopy;\n\n // Calculate the angles between the two points and get the difference\n // between the two angles to get the clockwise angle.\n const startAngle = getAngleFromVertex(\n clockwiseCoords[0],\n clockwiseCoords[1],\n );\n const endAngle = getAngleFromVertex(clockwiseCoords[2], clockwiseCoords[1]);\n const angle = (startAngle + 360 - endAngle) % 360;\n return angle;\n};\n","import type {SineCoefficient} from \"./geometry\";\nimport type {Coord} from \"@khanacademy/perseus-core\";\n\nexport type NamedSineCoefficient = {\n amplitude: number;\n angularFrequency: number;\n phase: number;\n verticalOffset: number;\n};\n\n// TODO: there's another, very similar getSinusoidCoefficients function\n// they should probably be merged\nexport function getSinusoidCoefficients(\n coords: ReadonlyArray<Coord>,\n): SineCoefficient {\n // It's assumed that p1 is the root and p2 is the first peak\n const p1 = coords[0];\n const p2 = coords[1];\n\n // Resulting coefficients are canonical for this sine curve\n const amplitude = p2[1] - p1[1];\n const angularFrequency = Math.PI / (2 * (p2[0] - p1[0]));\n const phase = p1[0] * angularFrequency;\n const verticalOffset = p1[1];\n\n return [amplitude, angularFrequency, phase, verticalOffset];\n}\n\nexport type QuadraticCoefficient = [number, number, number];\n\n// TODO: there's another, very similar getQuadraticCoefficients function\n// they should probably be merged\nexport function getQuadraticCoefficients(\n coords: ReadonlyArray<Coord>,\n): QuadraticCoefficient {\n const p1 = coords[0];\n const p2 = coords[1];\n const p3 = coords[2];\n\n const denom = (p1[0] - p2[0]) * (p1[0] - p3[0]) * (p2[0] - p3[0]);\n if (denom === 0) {\n // Many of the callers assume that the return value is always defined.\n // @ts-expect-error - TS2322 - Type 'undefined' is not assignable to type 'QuadraticCoefficient'.\n return;\n }\n const a =\n (p3[0] * (p2[1] - p1[1]) +\n p2[0] * (p1[1] - p3[1]) +\n p1[0] * (p3[1] - p2[1])) /\n denom;\n const b =\n (p3[0] * p3[0] * (p1[1] - p2[1]) +\n p2[0] * p2[0] * (p3[1] - p1[1]) +\n p1[0] * p1[0] * (p2[1] - p3[1])) /\n denom;\n const c =\n (p2[0] * p3[0] * (p2[0] - p3[0]) * p1[1] +\n p3[0] * p1[0] * (p3[0] - p1[0]) * p2[1] +\n p1[0] * p2[0] * (p1[0] - p2[0]) * p3[1]) /\n denom;\n return [a, b, c];\n}\n"],"names":["libName","libVersion","addLibraryVersionToPerseusDebug","DEFAULT_TOLERANCE","EPSILON","Math","pow","is","x","_","isNumber","isNaN","equal","y","tolerance","abs","sign","isInteger","num","round","precision","factor","roundTo","increment","floorTo","floor","ceilTo","ceil","toFraction","decimal","maxDenominator","n","d","a","rem","arraySum","array","reduce","memo","arg","arrayProduct","zip","arrays","min","map","length","results","i","push","pair","f","vec","dimension","Array","isArray","undefined","every","knumber","normalize","v","scale","sqrt","dot","b","zipped","multiplied","add","vecs","subtract","v1","v2","dim","negate","scalar","codirectional","collinear","polarRadFromCart","radius","theta","atan2","PI","polarDegFromCart","polar","cartFromPolarRad","cos","sin","cartFromPolarDeg","rotateRad","angle","rotateDeg","angleRad","acos","angleDeg","projection","elem","point","center","kvector","distanceToPoint","point1","point2","distanceToLine","line","lv","pv","projectedPv","distancePv","reflectOverLine","reflectedPv","compare","equalityTolerance","addVector","addVectors","subtractVector","kpoint","reflectPoint","midpoint","line1","line2","line1ToLine2Vector","ray1","ray2","sameOrigin","KhanMath","cleanMath","expr","replace","bound","max","factorial","getGCD","arguments","rest","slice","call","mod","getLCM","primes","isPrime","$","grep","p","getPrimeFactorization","number","maxf","merge","roundToNearest","toFixed","toFixedApprox","fixedStr","roundToApprox","fixed","String","fract","nd","Number","loN","loD","hiN","hiD","midN","midD","getNumericFormat","text","trim","match","fraction","parseFloat","toNumericString","format","numerator","denominator","pi","contains","modulus","integer","sum","val","approximateEqual","ccw","c","pointInRect","intersects","ab","cd","triplets","orientations","triplet","polygonSidesIntersect","vertices","k","iNext","kNext","side1","side2","vector","reverseVector","clockwise","points","segments","concat","areas","segment","p1","p2","magnitude","el","dotProduct","sideLengths","coords","rotate","angleMeasures","offsets","q","raw","offset","similar","coords1","coords2","angles1","angles2","sides1","sides2","angles","sides","reverse","approximateDeepEqual","sidePairs","factors","same","all","congruentEnough","lawOfCosines","canonicalSineCoefficients","amplitude","angularFrequency","phase","verticalOffset","period","getLineEquation","first","second","m","getLineIntersection","firstPoints","secondPoints","x1","y1","x2","y2","x3","y3","x4","y4","determinant","getLineIntersectionString","intersection","convertDegreesToRadians","degrees","convertRadiansToDegrees","radians","degree","toPrecision","calculateAngleInDegrees","r","th","getAngleFromVertex","vertex","getClockwiseAngle","allowReflexAngles","coordsCopy","areClockwise","shouldReverseCoords","clockwiseCoords","startAngle","endAngle","getSinusoidCoefficients","getQuadraticCoefficients","p3","denom"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/version.ts","../src/number.ts","../src/vector.ts","../src/point.ts","../src/line.ts","../src/ray.ts","../src/math.ts","../src/geometry.ts","../src/angles.ts","../src/coefficients.ts"],"sourcesContent":["// This file is processed by a Rollup plugin (replace) to inject the production\n// version number during the release build.\n// In dev, you'll never see the version number.\n\nimport {addLibraryVersionToPerseusDebug} from \"@khanacademy/perseus-utils\";\n\nconst libName = \"@khanacademy/kmath\";\nexport const libVersion = \"__lib_version__\";\n\naddLibraryVersionToPerseusDebug(libName, libVersion);\n","/**\n * Number Utils\n * A number is a js-number, e.g. 5.12\n */\n\nimport _ from \"underscore\";\n\nexport const DEFAULT_TOLERANCE = 1e-9;\n\n// TODO: Should this just be Number.Epsilon\nexport const EPSILON: number = Math.pow(2, -42);\n\nexport function is(x: any): boolean {\n return _.isNumber(x) && !_.isNaN(x);\n}\n\nexport function equal(x: number, y: number, tolerance?: number): boolean {\n // Checking for undefined makes this function behave nicely\n // with vectors of different lengths that are _.zip'd together\n if (x == null || y == null) {\n return x === y;\n }\n // We check === here so that +/-Infinity comparisons work correctly\n if (x === y) {\n return true;\n }\n if (tolerance == null) {\n tolerance = DEFAULT_TOLERANCE;\n }\n return Math.abs(x - y) < tolerance;\n}\n\nexport function sign(\n x: number,\n tolerance?: number,\n): number /* Should be: 0 | 1 | -1 */ {\n return equal(x, 0, tolerance) ? 0 : Math.abs(x) / x;\n}\n\nexport function isInteger(num: number, tolerance?: number): boolean {\n return equal(Math.round(num), num, tolerance);\n}\n\n// Round a number to a certain number of decimal places\nexport function round(num: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round(num * factor) / factor;\n}\n\n// Round num to the nearest multiple of increment\n// i.e. roundTo(83, 5) -> 85\nexport function roundTo(num: number, increment: number): number {\n return Math.round(num / increment) * increment;\n}\n\nexport function floorTo(num: number, increment: number): number {\n return Math.floor(num / increment) * increment;\n}\n\nexport function ceilTo(num: number, increment: number): number {\n return Math.ceil(num / increment) * increment;\n}\n\n/**\n * toFraction\n *\n * Returns a [numerator, denominator] array rational representation\n * of `decimal`\n *\n * See http://en.wikipedia.org/wiki/Continued_fraction for implementation\n * details\n *\n * toFraction(4/8) => [1, 2]\n * toFraction(0.66) => [33, 50]\n * toFraction(0.66, 0.01) => [2/3]\n * toFraction(283 + 1/3) => [850, 3]\n */\nexport function toFraction(\n decimal: number,\n // can't be 0\n tolerance: number = EPSILON,\n maxDenominator = 1000,\n): [number, number] {\n // Initialize everything to compute successive terms of\n // continued-fraction approximations via recurrence relation\n let n = [1, 0];\n let d = [0, 1];\n let a = Math.floor(decimal);\n let rem = decimal - a;\n\n while (d[0] <= maxDenominator) {\n if (equal(n[0] / d[0], decimal, tolerance)) {\n return [n[0], d[0]];\n }\n n = [a * n[0] + n[1], n[0]];\n d = [a * d[0] + d[1], d[0]];\n a = Math.floor(1 / rem);\n rem = 1 / rem - a;\n }\n\n // We failed to find a nice rational representation,\n // so return an irrational \"fraction\"\n return [decimal, 1];\n}\n","/**\n * Vector Utils\n * A vector is an array of numbers e.g. [0, 3, 4].\n */\n\nimport * as knumber from \"./number\";\n\ntype Vector = ReadonlyArray<number>;\n\nfunction arraySum(array: ReadonlyArray<number>): number {\n return array.reduce((memo, arg) => memo + arg, 0);\n}\n\nfunction arrayProduct(array: ReadonlyArray<number>): number {\n return array.reduce((memo, arg) => memo * arg, 1);\n}\n\nexport function zip<T>(xs: ReadonlyArray<T>, ys: ReadonlyArray<T>): [T, T][];\nexport function zip<T>(...arrays: ReadonlyArray<T>[]): T[][];\nexport function zip<T>(...arrays: ReadonlyArray<T>[]): T[][] {\n const n = Math.min(...arrays.map((a) => a.length));\n const results: T[][] = [];\n for (let i = 0; i < n; i++) {\n results.push(arrays.map((a) => a[i]));\n }\n return results;\n}\n\nexport function map<T, U>(pair: [T, T], f: (a: T, i: number) => U): [U, U] {\n return [f(pair[0], 0), f(pair[1], 1)];\n}\n\n/**\n * Checks if the given vector contains only numbers and, optionally, is of the\n * right dimension (length).\n *\n * is([1, 2, 3]) -> true\n * is([1, \"Hello\", 3]) -> false\n * is([1, 2, 3], 1) -> false\n */\nexport function is(vec: unknown, dimension: 2): vec is [number, number];\nexport function is(vec: unknown, dimension?: number): vec is Vector;\nexport function is(vec: unknown, dimension?: number) {\n if (!Array.isArray(vec)) {\n return false;\n }\n if (dimension !== undefined && vec.length !== dimension) {\n return false;\n }\n return vec.every(knumber.is);\n}\n\n// Normalize to a unit vector\nexport function normalize<V extends Vector>(v: V): V {\n return scale(v, 1 / length(v));\n}\n\n// Length/magnitude of a vector\nexport function length(v: Vector): number {\n return Math.sqrt(dot(v, v));\n}\n// Dot product of two vectors\nexport function dot(a: Vector, b: Vector): number {\n const zipped = zip(a, b);\n const multiplied = zipped.map(arrayProduct);\n return arraySum(multiplied);\n}\n\n/* vector-add multiple [x, y] coords/vectors\n *\n * add([1, 2], [3, 4]) -> [4, 6]\n */\nexport function add<V extends Vector>(...vecs: ReadonlyArray<V>): V {\n const zipped = zip(...vecs);\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return zipped.map(arraySum);\n}\n\nexport function subtract<V extends Vector>(v1: V, v2: V): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return zip(v1, v2).map((dim) => dim[0] - dim[1]);\n}\n\nexport function negate<V extends Vector>(v: V): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return v.map((x) => {\n return -x;\n });\n}\n\n// Scale a vector\nexport function scale<V extends Vector>(v1: V, scalar: number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return v1.map((x) => {\n return x * scalar;\n });\n}\n\nexport function equal(v1: Vector, v2: Vector, tolerance?: number): boolean {\n return (\n v1.length === v2.length &&\n zip(v1, v2).every((pair) => knumber.equal(pair[0], pair[1], tolerance))\n );\n}\n\nexport function codirectional(\n v1: Vector,\n v2: Vector,\n tolerance?: number,\n): boolean {\n // The origin is trivially codirectional with all other vectors.\n // This gives nice semantics for codirectionality between points when\n // comparing their difference vectors.\n if (\n knumber.equal(length(v1), 0, tolerance) ||\n knumber.equal(length(v2), 0, tolerance)\n ) {\n return true;\n }\n\n v1 = normalize(v1);\n v2 = normalize(v2);\n\n return equal(v1, v2, tolerance);\n}\n\nexport function collinear(v1: Vector, v2: Vector, tolerance?: number): boolean {\n return (\n codirectional(v1, v2, tolerance) ||\n codirectional(v1, negate(v2), tolerance)\n );\n}\n\n// TODO(jeremy) These coordinate conversion functions really only handle 2D points (ie. [number, number])\n\n// Convert a cartesian coordinate into a radian polar coordinate\nexport function polarRadFromCart(\n v: ReadonlyArray<number>,\n): ReadonlyArray<number> {\n const radius = length(v);\n let theta = Math.atan2(v[1], v[0]);\n\n // Convert angle range from [-pi, pi] to [0, 2pi]\n if (theta < 0) {\n theta += 2 * Math.PI;\n }\n\n return [radius, theta];\n}\n\n// Converts a cartesian coordinate into a degree polar coordinate\nexport function polarDegFromCart(\n v: ReadonlyArray<number>,\n): ReadonlyArray<number> /* TODO: convert to tuple/Point */ {\n const polar = polarRadFromCart(v);\n return [polar[0], (polar[1] * 180) / Math.PI];\n}\n\n/* Convert a polar coordinate into a cartesian coordinate\n *\n * Examples:\n * cartFromPolarRad(5, Math.PI)\n */\nexport function cartFromPolarRad(\n radius: number,\n theta = 0,\n): ReadonlyArray<number> /* TODO: convert to tuple/Point */ {\n return [radius * Math.cos(theta), radius * Math.sin(theta)];\n}\n\n/* Convert a polar coordinate into a cartesian coordinate\n *\n * Examples:\n * cartFromPolarDeg(5, 30)\n */\nexport function cartFromPolarDeg(\n radius: number,\n theta = 0,\n): ReadonlyArray<number> {\n return cartFromPolarRad(radius, (theta * Math.PI) / 180);\n}\n\n// Rotate vector\nexport function rotateRad(\n v: ReadonlyArray<number>,\n theta: number,\n): ReadonlyArray<number> {\n const polar = polarRadFromCart(v);\n const angle = polar[1] + theta;\n return cartFromPolarRad(polar[0], angle);\n}\n\nexport function rotateDeg(\n v: ReadonlyArray<number>,\n theta: number,\n): ReadonlyArray<number> {\n const polar = polarDegFromCart(v);\n const angle = polar[1] + theta;\n return cartFromPolarDeg(polar[0], angle);\n}\n\n// Angle between two vectors\nexport function angleRad(v1: Vector, v2: Vector): number {\n return Math.acos(dot(v1, v2) / (length(v1) * length(v2)));\n}\n\nexport function angleDeg(v1: Vector, v2: Vector): number {\n return (angleRad(v1, v2) * 180) / Math.PI;\n}\n\n// Vector projection of v1 onto v2\nexport function projection<V extends Vector>(v1: V, v2: V): V {\n const scalar = dot(v1, v2) / dot(v2, v2);\n return scale(v2, scalar);\n}\n\n// Round each number to a certain number of decimal places\nexport function round<V extends Vector>(vec: V, precision: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) => knumber.round(elem, precision[i] || precision));\n}\n\n// Round each number to the nearest increment\nexport function roundTo(\n coord: [number, number],\n increment: [number, number] | number,\n): [number, number];\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V;\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.roundTo(elem, increment[i] || increment),\n );\n}\n\nexport function floorTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.floorTo(elem, increment[i] || increment),\n );\n}\n\nexport function ceilTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n knumber.ceilTo(elem, increment[i] || increment),\n );\n}\n","/**\n * Point Utils\n * A point is an array of two numbers e.g. [0, 0].\n */\n\nimport * as knumber from \"./number\";\nimport * as kvector from \"./vector\";\n\n// A point, in 2D, 3D, or nD space.\nexport type Point = ReadonlyArray<number>;\n\n// Rotate point (around origin unless a center is specified)\nexport function rotateRad(point: Point, theta: number, center?: Point): Point {\n if (center === undefined) {\n return kvector.rotateRad(point, theta);\n } else {\n return kvector.add(\n center,\n kvector.rotateRad(kvector.subtract(point, center), theta),\n );\n }\n}\n\nexport function rotateDeg(point: Point, theta: number, center?: Point): Point {\n if (center === undefined) {\n return kvector.rotateDeg(point, theta);\n } else {\n return kvector.add(\n center,\n kvector.rotateDeg(kvector.subtract(point, center), theta),\n );\n }\n}\n\n// Distance between two points\nexport function distanceToPoint(point1: Point, point2: Point): number {\n return kvector.length(kvector.subtract(point1, point2));\n}\n\n// Distance between point and line\nexport function distanceToLine(point: Point, line: [Point, Point]): number {\n const lv = kvector.subtract(line[1], line[0]);\n const pv = kvector.subtract(point, line[0]);\n const projectedPv = kvector.projection(pv, lv);\n const distancePv = kvector.subtract(projectedPv, pv);\n return kvector.length(distancePv);\n}\n\n// Reflect point over line\nexport function reflectOverLine<P extends Point>(point: P, line: [P, P]): P {\n const lv = kvector.subtract(line[1], line[0]);\n const pv = kvector.subtract(point, line[0]);\n const projectedPv = kvector.projection(pv, lv);\n const reflectedPv = kvector.subtract(kvector.scale(projectedPv, 2), pv);\n return kvector.add(line[0], reflectedPv);\n}\n\n/**\n * Compares two points, returning -1, 0, or 1, for use with\n * Array.prototype.sort\n *\n * Note: This technically doesn't satisfy the total-ordering\n * requirements of Array.prototype.sort unless equalityTolerance\n * is 0. In some cases very close points that compare within a\n * few equalityTolerances could appear in the wrong order.\n */\nexport function compare(\n point1: Point,\n point2: Point,\n equalityTolerance?: number,\n): number /* TODO: convert to -1 | 0 | 1 type */ {\n if (point1.length !== point2.length) {\n return point1.length - point2.length;\n }\n for (let i = 0; i < point1.length; i++) {\n if (!knumber.equal(point1[i], point2[i], equalityTolerance)) {\n return point1[i] - point2[i];\n }\n }\n return 0;\n}\n\n// Check if a value is a point\nexport const is = kvector.is;\n\n// Add and subtract vector(s)\nexport const addVector = kvector.add;\nexport const addVectors = kvector.add;\nexport const subtractVector = kvector.subtract;\nexport const equal = kvector.equal;\n\n// Convert from cartesian to polar and back\nexport const polarRadFromCart = kvector.polarRadFromCart;\nexport const polarDegFromCart = kvector.polarDegFromCart;\nexport const cartFromPolarRad = kvector.cartFromPolarRad;\nexport const cartFromPolarDeg = kvector.cartFromPolarDeg;\n\n// Rounding\nexport const round = kvector.round;\nexport const roundTo = kvector.roundTo;\nexport const floorTo = kvector.floorTo;\nexport const ceilTo = kvector.ceilTo;\n","/**\n * Line Utils\n * A line is an array of two points e.g. [[-5, 0], [5, 0]].\n */\n\nimport * as kpoint from \"./point\";\nimport * as kvector from \"./vector\";\n\nimport type {Point} from \"./point\";\n\nexport type Line = [Point, Point];\n\nexport function distanceToPoint(line: Line, point: Point): number {\n return kpoint.distanceToLine(point, line);\n}\n\nexport function reflectPoint(line: Line, point: Point): Point {\n return kpoint.reflectOverLine(point, line);\n}\n\nexport function midpoint(line: Line): Point {\n return [(line[0][0] + line[1][0]) / 2, (line[0][1] + line[1][1]) / 2];\n}\n\nexport function equal(line1: Line, line2: Line, tolerance?: number): boolean {\n // TODO: A nicer implementation might just check collinearity of\n // vectors using underscore magick\n // Compare the directions of the lines\n const v1 = kvector.subtract(line1[1], line1[0]);\n const v2 = kvector.subtract(line2[1], line2[0]);\n if (!kvector.collinear(v1, v2, tolerance)) {\n return false;\n }\n // If the start point is the same for the two lines, then they are the same\n if (kpoint.equal(line1[0], line2[0])) {\n return true;\n }\n // Make sure that the direction to get from line1 to\n // line2 is the same as the direction of the lines\n const line1ToLine2Vector = kvector.subtract(line2[0], line1[0]);\n return kvector.collinear(v1, line1ToLine2Vector, tolerance);\n}\n","/**\n * Ray Utils\n * A ray (→) is an array of an endpoint and another point along the ray.\n * For example, [[0, 0], [1, 0]] is the ray starting at the origin and\n * traveling along the positive x-axis.\n */\n\nimport * as kpoint from \"./point\";\nimport * as kvector from \"./vector\";\n\nimport type {Point} from \"./point\";\n\nexport type Ray = [Point, Point];\n\nexport function equal(ray1: Ray, ray2: Ray, tolerance?: number): boolean {\n // Compare the directions of the rays\n const v1 = kvector.subtract(ray1[1], ray1[0]);\n const v2 = kvector.subtract(ray2[1], ray2[0]);\n\n const sameOrigin = kpoint.equal(ray1[0], ray2[0]);\n const codirectional = kvector.codirectional(v1, v2, tolerance);\n\n return sameOrigin && codirectional;\n}\n","import $ from \"jquery\";\nimport _ from \"underscore\";\n\nimport * as knumber from \"./number\";\n\nimport type {MathFormat} from \"@khanacademy/perseus-core\";\n\nconst KhanMath = {\n // Simplify formulas before display\n cleanMath: function (expr: string): string {\n return typeof expr === \"string\"\n ? expr\n .replace(/\\+\\s*-/g, \"- \")\n .replace(/-\\s*-/g, \"+ \")\n .replace(/\\^1/g, \"\")\n : expr;\n },\n\n // Bound a number by 1e-6 and 1e20 to avoid exponents after toString\n bound: function (num: number): number {\n if (num === 0) {\n return num;\n }\n if (num < 0) {\n return -KhanMath.bound(-num);\n }\n return Math.max(1e-6, Math.min(num, 1e20));\n },\n\n factorial: function (x: number): number {\n if (x <= 1) {\n return x;\n }\n return x * KhanMath.factorial(x - 1);\n },\n\n getGCD: function (a: number, b: number): number {\n if (arguments.length > 2) {\n // TODO(kevinb): rewrite using rest args instead of arguments\n // eslint-disable-next-line prefer-rest-params\n const rest = [].slice.call(arguments, 1);\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return KhanMath.getGCD(a, KhanMath.getGCD(...rest));\n }\n let mod;\n\n a = Math.abs(a);\n b = Math.abs(b);\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n while (b) {\n mod = a % b;\n a = b;\n b = mod;\n }\n\n return a;\n },\n\n getLCM: function (a: number, b: number): number {\n if (arguments.length > 2) {\n // TODO(kevinb): rewrite using rest args instead of arguments\n // eslint-disable-next-line prefer-rest-params\n const rest = [].slice.call(arguments, 1);\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return KhanMath.getLCM(a, KhanMath.getLCM(...rest));\n }\n return Math.abs(a * b) / KhanMath.getGCD(a, b);\n },\n\n primes: [\n 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,\n 71, 73, 79, 83, 89, 97,\n ],\n\n isPrime: function (n: number): boolean {\n if (n <= 1) {\n return false;\n }\n if (n < 101) {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n return !!$.grep(KhanMath.primes, function (p, i) {\n return Math.abs(p - n) <= 0.5;\n }).length;\n }\n if (n <= 1 || (n > 2 && n % 2 === 0)) {\n return false;\n }\n for (let i = 3, sqrt = Math.sqrt(n); i <= sqrt; i += 2) {\n if (n % i === 0) {\n return false;\n }\n }\n\n return true;\n },\n // @ts-expect-error - TS2366 - Function lacks ending return statement and return type does not include 'undefined'.\n getPrimeFactorization: function (number: number): ReadonlyArray<number> {\n if (number === 1) {\n return [];\n }\n if (KhanMath.isPrime(number)) {\n return [number];\n }\n\n const maxf = Math.sqrt(number);\n for (let f = 2; f <= maxf; f++) {\n if (number % f === 0) {\n return $.merge(\n KhanMath.getPrimeFactorization(f),\n KhanMath.getPrimeFactorization(number / f),\n );\n }\n }\n },\n\n // Round a number to the nearest increment\n // E.g., if increment = 30 and num = 40, return 30. if increment = 30 and\n // num = 45, return 60.\n roundToNearest: function (increment: number, num: number): number {\n return Math.round(num / increment) * increment;\n },\n\n // Round a number to a certain number of decimal places\n roundTo: function (precision: number, num: number): number {\n const factor = Math.pow(10, precision).toFixed(5);\n // @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type 'number'. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.\n return Math.round((num * factor).toFixed(5)) / factor;\n },\n\n /**\n * Return a string of num rounded to a fixed precision decimal places,\n * with an approx symbol if num had to be rounded, and trailing 0s\n */\n toFixedApprox: function (num: number, precision: number): string {\n // TODO(aria): Make this locale-dependent\n const fixedStr = num.toFixed(precision);\n if (knumber.equal(+fixedStr, num)) {\n return fixedStr;\n }\n return \"\\\\approx \" + fixedStr;\n },\n\n /**\n * Return a string of num rounded to precision decimal places, with an\n * approx symbol if num had to be rounded, but no trailing 0s if it was\n * not rounded.\n */\n roundToApprox: function (num: number, precision: number): string {\n const fixed = KhanMath.roundTo(precision, num);\n if (knumber.equal(fixed, num)) {\n return String(fixed);\n }\n return KhanMath.toFixedApprox(num, precision);\n },\n\n // toFraction(4/8) => [1, 2]\n // toFraction(0.666) => [333, 500]\n // toFraction(0.666, 0.001) => [2, 3]\n //\n // tolerance can't be bigger than 1, sorry\n toFraction: function (\n decimal: number,\n tolerance?: number,\n ): [number, number] {\n if (tolerance == null) {\n tolerance = Math.pow(2, -46);\n }\n\n if (decimal < 0 || decimal > 1) {\n let fract = decimal % 1;\n fract += fract < 0 ? 1 : 0;\n\n const nd = KhanMath.toFraction(fract, tolerance);\n nd[0] += Math.round(decimal - fract) * nd[1];\n return nd;\n }\n if (Math.abs(Math.round(Number(decimal)) - decimal) <= tolerance) {\n return [Math.round(decimal), 1];\n }\n let loN = 0;\n let loD = 1;\n let hiN = 1;\n let hiD = 1;\n let midN = 1;\n let midD = 2;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (Math.abs(Number(midN / midD) - decimal) <= tolerance) {\n return [midN, midD];\n }\n if (midN / midD < decimal) {\n loN = midN;\n loD = midD;\n } else {\n hiN = midN;\n hiD = midD;\n }\n\n midN = loN + hiN;\n midD = loD + hiD;\n }\n },\n\n // Returns the format (string) of a given numeric string\n // Note: purposively more inclusive than answer-types' predicate.forms\n // That is, it is not necessarily true that interpreted input are numeric\n getNumericFormat: function (text: string): MathFormat | null | undefined {\n text = $.trim(text);\n text = text.replace(/\\u2212/, \"-\").replace(/([+-])\\s+/g, \"$1\");\n if (text.match(/^[+-]?\\d+$/)) {\n return \"integer\";\n }\n if (text.match(/^[+-]?\\d+\\s+\\d+\\s*\\/\\s*\\d+$/)) {\n return \"mixed\";\n }\n const fraction = text.match(/^[+-]?(\\d+)\\s*\\/\\s*(\\d+)$/);\n if (fraction) {\n return parseFloat(fraction[1]) > parseFloat(fraction[2])\n ? \"improper\"\n : \"proper\";\n }\n if (text.replace(/[,. ]/g, \"\").match(/^\\d+$/)) {\n return \"decimal\";\n }\n if (text.match(/(pi?|\\u03c0|t(?:au)?|\\u03c4|pau)/)) {\n return \"pi\";\n }\n return null;\n },\n\n // Returns a string of the number in a specified format\n toNumericString: function (number: number, format?: MathFormat): string {\n if (number == null) {\n return \"\";\n }\n if (number === 0) {\n return \"0\"; // otherwise it might end up as 0% or 0pi\n }\n\n if (format === \"percent\") {\n return number * 100 + \"%\";\n }\n\n if (format === \"pi\") {\n const fraction = knumber.toFraction(number / Math.PI);\n const numerator = Math.abs(fraction[0]);\n const denominator = fraction[1];\n if (knumber.isInteger(numerator)) {\n const sign = number < 0 ? \"-\" : \"\";\n const pi = \"\\u03C0\";\n return (\n sign +\n (numerator === 1 ? \"\" : numerator) +\n pi +\n (denominator === 1 ? \"\" : \"/\" + denominator)\n );\n }\n }\n\n if (_([\"proper\", \"improper\", \"mixed\", \"fraction\"]).contains(format)) {\n const fraction = knumber.toFraction(number);\n const numerator = Math.abs(fraction[0]);\n const denominator = fraction[1];\n const sign = number < 0 ? \"-\" : \"\";\n if (denominator === 1) {\n return sign + numerator; // for integers, irrational, d > 1000\n }\n if (format === \"mixed\") {\n const modulus = numerator % denominator;\n const integer = (numerator - modulus) / denominator;\n return (\n sign +\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n (integer ? integer + \" \" : \"\") +\n modulus +\n \"/\" +\n denominator\n );\n } // otherwise proper, improper, or fraction\n return sign + numerator + \"/\" + denominator;\n }\n\n // otherwise (decimal, float, long long)\n return String(number);\n },\n} as const;\n\nexport function sum(array: number[]): number {\n return array.reduce(add, 0);\n}\n\nfunction add(a: number, b: number): number {\n return a + b;\n}\n\nexport default KhanMath;\n","/**\n * A collection of geomtry-related utility functions\n */\n\nimport {\n approximateDeepEqual,\n approximateEqual,\n type Coord,\n} from \"@khanacademy/perseus-core\";\nimport _ from \"underscore\";\n\nimport {sum} from \"./math\";\nimport * as knumber from \"./number\";\nimport * as kpoint from \"./point\";\n\ntype Line = [Coord, Coord];\n\n// This should really be a readonly tuple of [number, number]\nexport type Range = [number, number];\n\nexport type SineCoefficient = [\n number, // amplitude\n number, // angularFrequency\n number, // phase\n number, // verticalOffset\n];\n\n// Given a number, return whether it is positive (1), negative (-1), or zero (0)\nexport function sign(val: number): 0 | 1 | -1 {\n if (approximateEqual(val, 0)) {\n return 0;\n }\n return val > 0 ? 1 : -1;\n}\n\n// Determine whether three points are collinear (0), for a clockwise turn (negative),\n// or counterclockwise turn (positive)\nexport function ccw(a: Coord, b: Coord, c: Coord): number {\n return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]);\n}\n\nexport function collinear(a: Coord, b: Coord, c: Coord): boolean {\n return approximateEqual(ccw(a, b, c), 0);\n}\n\n// Given rect bounding points A and B, whether point C is inside the rect\nfunction pointInRect(a: Coord, b: Coord, c: Coord): boolean {\n return (\n c[0] <= Math.max(a[0], b[0]) &&\n c[0] >= Math.min(a[0], b[0]) &&\n c[1] <= Math.max(a[1], b[1]) &&\n c[1] >= Math.min(a[1], b[1])\n );\n}\n\n// Whether line segment AB intersects line segment CD\n// http://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/\nexport function intersects(ab: Line, cd: Line): boolean {\n const triplets = [\n [ab[0], ab[1], cd[0]] as const,\n [ab[0], ab[1], cd[1]] as const,\n [cd[0], cd[1], ab[0]] as const,\n [cd[0], cd[1], ab[1]] as const,\n ];\n\n const orientations = _.map(triplets, function (triplet) {\n return sign(ccw(...triplet));\n });\n\n if (\n orientations[0] !== orientations[1] &&\n orientations[2] !== orientations[3]\n ) {\n return true;\n }\n\n for (let i = 0; i < 4; i++) {\n if (orientations[i] === 0 && pointInRect(...triplets[i])) {\n return true;\n }\n }\n\n return false;\n}\n\n// Whether any two sides of a polygon intersect each other\nexport function polygonSidesIntersect(vertices: Coord[]): boolean {\n for (let i = 0; i < vertices.length; i++) {\n for (let k = i + 1; k < vertices.length; k++) {\n // If any two vertices are the same point, sides overlap\n if (kpoint.equal(vertices[i], vertices[k])) {\n return true;\n }\n\n // Find the other end of the sides starting at vertices i and k\n const iNext = (i + 1) % vertices.length;\n const kNext = (k + 1) % vertices.length;\n\n // Adjacent sides always intersect (at the vertex); skip those\n if (iNext === k || kNext === i) {\n continue;\n }\n\n const side1: Line = [vertices[i], vertices[iNext]];\n const side2: Line = [vertices[k], vertices[kNext]];\n if (intersects(side1, side2)) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function vector(a, b) {\n return _.map(_.zip(a, b), function (pair) {\n return pair[0] - pair[1];\n });\n}\n\nexport function reverseVector(vector: Coord): Coord {\n return [-vector[0], -vector[1]];\n}\n\n// Returns whether connecting the given sequence of `points` forms a clockwise\n// path (assuming a closed loop, where the last point connects back to the\n// first).\nexport function clockwise(points: Coord[]): boolean {\n const segments = _.zip(points, points.slice(1).concat(points.slice(0, 1)));\n const areas = _.map(segments, function (segment) {\n const p1 = segment[0];\n const p2 = segment[1];\n return (p2[0] - p1[0]) * (p2[1] + p1[1]);\n });\n return sum(areas) > 0;\n}\n\nexport function magnitude(v: ReadonlyArray<Coord>): number {\n return Math.sqrt(\n _.reduce(\n v,\n function (memo, el) {\n // @ts-expect-error - TS2345 - Argument of type 'Coord' is not assignable to parameter of type 'number'.\n return memo + Math.pow(el, 2);\n },\n 0,\n ),\n );\n}\n\nfunction dotProduct(a: Coord, b: Coord): number {\n return _.reduce(\n _.zip(a, b),\n function (memo, pair) {\n return memo + pair[0] * pair[1];\n },\n 0,\n );\n}\n\nfunction sideLengths(coords: ReadonlyArray<Coord>): ReadonlyArray<number> {\n const segments = _.zip(coords, rotate(coords));\n return segments.map(function (segment) {\n // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'. | TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return magnitude(vector(...segment));\n });\n}\n\n// Based on http://math.stackexchange.com/a/151149\nexport function angleMeasures(\n coords: ReadonlyArray<Coord>,\n): ReadonlyArray<number> {\n const triplets = _.zip(rotate(coords, -1), coords, rotate(coords, 1));\n\n const offsets = _.map(triplets, function (triplet) {\n const p = vector(triplet[1], triplet[0]);\n const q = vector(triplet[2], triplet[1]);\n // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'Coord'. | TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'. | TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'readonly Coord[]'.\n const raw = Math.acos(dotProduct(p, q) / (magnitude(p) * magnitude(q)));\n // @ts-expect-error - TS2556 - A spread argument must either have a tuple type or be passed to a rest parameter.\n return sign(ccw(...triplet)) > 0 ? raw : -raw;\n });\n\n const sum = _.reduce(\n offsets,\n function (memo, arg) {\n return memo + arg;\n },\n 0,\n );\n\n return _.map(offsets, function (offset) {\n return sum > 0 ? Math.PI - offset : Math.PI + offset;\n });\n}\n\n// Whether two polygons are similar (or if specified, congruent)\nexport function similar(\n coords1: ReadonlyArray<Coord>,\n coords2: ReadonlyArray<Coord>,\n tolerance: number,\n): boolean {\n if (coords1.length !== coords2.length) {\n return false;\n }\n\n const n = coords1.length;\n\n const angles1 = angleMeasures(coords1);\n const angles2 = angleMeasures(coords2);\n\n const sides1 = sideLengths(coords1);\n const sides2 = sideLengths(coords2);\n\n for (let i = 0; i < 2 * n; i++) {\n let angles = angles2.slice();\n let sides = sides2.slice();\n\n // Reverse angles and sides to allow matching reflected polygons\n if (i >= n) {\n angles.reverse();\n sides.reverse();\n // Since sides are calculated from two coordinates,\n // simply reversing results in an off by one error\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n sides = rotate(sides, 1);\n }\n\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n angles = rotate(angles, i);\n // @ts-expect-error - TS4104 - The type 'readonly number[]' is 'readonly' and cannot be assigned to the mutable type 'number[]'.\n sides = rotate(sides, i);\n\n if (approximateDeepEqual(angles1, angles)) {\n const sidePairs = _.zip(sides1, sides);\n\n const factors = _.map(sidePairs, function (pair) {\n return pair[0] / pair[1];\n });\n\n const same = _.all(factors, function (factor) {\n return approximateEqual(factors[0], factor);\n });\n\n const congruentEnough = _.all(sidePairs, function (pair) {\n return knumber.equal(pair[0], pair[1], tolerance);\n });\n\n if (same && congruentEnough) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n// Given triangle with sides ABC return angle opposite side C in degrees\nexport function lawOfCosines(a: number, b: number, c: number): number {\n return (Math.acos((a * a + b * b - c * c) / (2 * a * b)) * 180) / Math.PI;\n}\n\nexport function canonicalSineCoefficients([\n amplitude,\n angularFrequency,\n phase,\n verticalOffset,\n]: [any, any, any, any]) {\n // For a curve of the form f(x) = a * Sin(b * x - c) + d,\n // this function ensures that a, b > 0, and c is its\n // smallest possible positive value.\n\n // Guarantee a > 0\n if (amplitude < 0) {\n amplitude *= -1;\n angularFrequency *= -1;\n phase *= -1;\n }\n\n const period = 2 * Math.PI;\n // Guarantee b > 0\n if (angularFrequency < 0) {\n angularFrequency *= -1;\n phase *= -1;\n phase += period / 2;\n }\n\n // Guarantee c is smallest possible positive value\n while (phase > 0) {\n phase -= period;\n }\n while (phase < 0) {\n phase += period;\n }\n\n return [amplitude, angularFrequency, phase, verticalOffset];\n}\n\n// e.g. rotate([1, 2, 3]) -> [2, 3, 1]\nexport function rotate<T>(\n array: ReadonlyArray<T>,\n n?: number,\n): ReadonlyArray<T> {\n n = typeof n === \"undefined\" ? 1 : n % array.length;\n return array.slice(n).concat(array.slice(0, n));\n}\n\nexport function getLineEquation(first: Coord, second: Coord): string {\n if (approximateEqual(first[0], second[0])) {\n return \"x = \" + first[0].toFixed(3);\n }\n const m = (second[1] - first[1]) / (second[0] - first[0]);\n const b = first[1] - m * first[0];\n return \"y = \" + m.toFixed(3) + \"x + \" + b.toFixed(3);\n}\n\n// Stolen from the wikipedia article\n// http://en.wikipedia.org/wiki/Line-line_intersection\nexport function getLineIntersection(\n // TODO(LP-10725): update these to be 2-tuples\n firstPoints: ReadonlyArray<Coord>,\n secondPoints: ReadonlyArray<Coord>,\n): [number, number] | null {\n const x1 = firstPoints[0][0];\n const y1 = firstPoints[0][1];\n const x2 = firstPoints[1][0];\n const y2 = firstPoints[1][1];\n const x3 = secondPoints[0][0];\n const y3 = secondPoints[0][1];\n const x4 = secondPoints[1][0];\n const y4 = secondPoints[1][1];\n\n const determinant = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n if (Math.abs(determinant) < 1e-9) {\n // Lines are parallel\n return null;\n }\n const x =\n ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) /\n determinant;\n const y =\n ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) /\n determinant;\n return [x, y];\n}\n\nexport function getLineIntersectionString(\n firstPoints: ReadonlyArray<Coord>,\n secondPoints: ReadonlyArray<Coord>,\n): string {\n const intersection = getLineIntersection(firstPoints, secondPoints);\n\n if (intersection === null) {\n return \"Lines are parallel\";\n }\n\n const [x, y] = intersection;\n return \"Intersection: (\" + x.toFixed(3) + \", \" + y.toFixed(3) + \")\";\n}\n","// This file contains helper functions for working with angles.\n\nimport {clockwise} from \"./geometry\";\n\nimport type {Coord} from \"@khanacademy/perseus-core\";\n\nexport function convertDegreesToRadians(degrees: number): number {\n return (degrees / 180) * Math.PI;\n}\n\nexport function convertRadiansToDegrees(radians: number): number {\n const degree = (radians / Math.PI) * 180;\n // Account for floating point errors.\n return Number(degree.toPrecision(15));\n}\n\n// Returns a value between -180 and 180, inclusive. The angle is measured\n// between the positive x-axis and the given vector.\nexport function calculateAngleInDegrees([x, y]: Coord): number {\n return (Math.atan2(y, x) * 180) / Math.PI;\n}\n\n// Converts polar coordinates to cartesian. The th(eta) parameter is in degrees.\nexport function polar(r: number | Coord, th: number): Coord {\n if (typeof r === \"number\") {\n r = [r, r];\n }\n th = (th * Math.PI) / 180;\n return [r[0] * Math.cos(th), r[1] * Math.sin(th)];\n}\n// This function calculates the angle between two points and an optional vertex.\n// If the vertex is not provided, the angle is measured between the two points.\n// This does not account for reflex angles or clockwise position.\nexport const getAngleFromVertex = (point: Coord, vertex: Coord): number => {\n const x = point[0] - vertex[0];\n const y = point[1] - vertex[1];\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (!x && !y) {\n return 0;\n }\n return (180 + (Math.atan2(-y, -x) * 180) / Math.PI + 360) % 360;\n};\n\n// This function calculates the clockwise angle between three points,\n// and is used to generate the labels and equation strings of the\n// current angle for the interactive graph.\nexport const getClockwiseAngle = (\n coords: [Coord, Coord, Coord],\n allowReflexAngles: boolean = false,\n): number => {\n const coordsCopy = [...coords];\n // The coords are saved as [point1, vertex, point2] in the interactive graph\n const areClockwise = clockwise([\n coordsCopy[0],\n coordsCopy[2],\n coordsCopy[1],\n ]);\n\n // We may need to reverse the coordinates if we allow\n // reflex angles and the points are not in clockwise order.\n const shouldReverseCoords = !areClockwise || allowReflexAngles;\n\n // Reverse the coordinates accordingly to ensure the angle is calculated correctly\n const clockwiseCoords = shouldReverseCoords\n ? coordsCopy.reverse()\n : coordsCopy;\n\n // Calculate the angles between the two points and get the difference\n // between the two angles to get the clockwise angle.\n const startAngle = getAngleFromVertex(\n clockwiseCoords[0],\n clockwiseCoords[1],\n );\n const endAngle = getAngleFromVertex(clockwiseCoords[2], clockwiseCoords[1]);\n const angle = (startAngle + 360 - endAngle) % 360;\n return angle;\n};\n","import type {SineCoefficient} from \"./geometry\";\nimport type {Coord} from \"@khanacademy/perseus-core\";\n\nexport type NamedSineCoefficient = {\n amplitude: number;\n angularFrequency: number;\n phase: number;\n verticalOffset: number;\n};\n\n// TODO: there's another, very similar getSinusoidCoefficients function\n// they should probably be merged\nexport function getSinusoidCoefficients(\n coords: ReadonlyArray<Coord>,\n): SineCoefficient {\n // It's assumed that p1 is the root and p2 is the first peak\n const p1 = coords[0];\n const p2 = coords[1];\n\n // Resulting coefficients are canonical for this sine curve\n const amplitude = p2[1] - p1[1];\n const angularFrequency = Math.PI / (2 * (p2[0] - p1[0]));\n const phase = p1[0] * angularFrequency;\n const verticalOffset = p1[1];\n\n return [amplitude, angularFrequency, phase, verticalOffset];\n}\n\nexport type QuadraticCoefficient = [number, number, number];\n\n// TODO: there's another, very similar getQuadraticCoefficients function\n// they should probably be merged\nexport function getQuadraticCoefficients(\n coords: ReadonlyArray<Coord>,\n): QuadraticCoefficient {\n const p1 = coords[0];\n const p2 = coords[1];\n const p3 = coords[2];\n\n const denom = (p1[0] - p2[0]) * (p1[0] - p3[0]) * (p2[0] - p3[0]);\n if (denom === 0) {\n // Many of the callers assume that the return value is always defined.\n // @ts-expect-error - TS2322 - Type 'undefined' is not assignable to type 'QuadraticCoefficient'.\n return;\n }\n const a =\n (p3[0] * (p2[1] - p1[1]) +\n p2[0] * (p1[1] - p3[1]) +\n p1[0] * (p3[1] - p2[1])) /\n denom;\n const b =\n (p3[0] * p3[0] * (p1[1] - p2[1]) +\n p2[0] * p2[0] * (p3[1] - p1[1]) +\n p1[0] * p1[0] * (p2[1] - p3[1])) /\n denom;\n const c =\n (p2[0] * p3[0] * (p2[0] - p3[0]) * p1[1] +\n p3[0] * p1[0] * (p3[0] - p1[0]) * p2[1] +\n p1[0] * p2[0] * (p1[0] - p2[0]) * p3[1]) /\n denom;\n return [a, b, c];\n}\n"],"names":["libName","libVersion","addLibraryVersionToPerseusDebug","DEFAULT_TOLERANCE","EPSILON","Math","pow","is","x","_","isNumber","isNaN","equal","y","tolerance","abs","sign","isInteger","num","round","precision","factor","roundTo","increment","floorTo","floor","ceilTo","ceil","toFraction","decimal","maxDenominator","n","d","a","rem","arraySum","array","reduce","memo","arg","arrayProduct","zip","arrays","min","map","length","results","i","push","pair","f","vec","dimension","Array","isArray","undefined","every","knumber","normalize","v","scale","sqrt","dot","b","zipped","multiplied","add","vecs","subtract","v1","v2","dim","negate","scalar","codirectional","collinear","polarRadFromCart","radius","theta","atan2","PI","polarDegFromCart","polar","cartFromPolarRad","cos","sin","cartFromPolarDeg","rotateRad","angle","rotateDeg","angleRad","acos","angleDeg","projection","elem","point","center","kvector","distanceToPoint","point1","point2","distanceToLine","line","lv","pv","projectedPv","distancePv","reflectOverLine","reflectedPv","compare","equalityTolerance","addVector","addVectors","subtractVector","kpoint","reflectPoint","midpoint","line1","line2","line1ToLine2Vector","ray1","ray2","sameOrigin","KhanMath","cleanMath","expr","replace","bound","max","factorial","getGCD","arguments","rest","slice","call","mod","getLCM","primes","isPrime","$","grep","p","getPrimeFactorization","number","maxf","merge","roundToNearest","toFixed","toFixedApprox","fixedStr","roundToApprox","fixed","String","fract","nd","Number","loN","loD","hiN","hiD","midN","midD","getNumericFormat","text","trim","match","fraction","parseFloat","toNumericString","format","numerator","denominator","pi","contains","modulus","integer","sum","val","approximateEqual","ccw","c","pointInRect","intersects","ab","cd","triplets","orientations","triplet","polygonSidesIntersect","vertices","k","iNext","kNext","side1","side2","vector","reverseVector","clockwise","points","segments","concat","areas","segment","p1","p2","magnitude","el","dotProduct","sideLengths","coords","rotate","angleMeasures","offsets","q","raw","offset","similar","coords1","coords2","angles1","angles2","sides1","sides2","angles","sides","reverse","approximateDeepEqual","sidePairs","factors","same","all","congruentEnough","lawOfCosines","canonicalSineCoefficients","amplitude","angularFrequency","phase","verticalOffset","period","getLineEquation","first","second","m","getLineIntersection","firstPoints","secondPoints","x1","y1","x2","y2","x3","y3","x4","y4","determinant","getLineIntersectionString","intersection","convertDegreesToRadians","degrees","convertRadiansToDegrees","radians","degree","toPrecision","calculateAngleInDegrees","r","th","getAngleFromVertex","vertex","getClockwiseAngle","allowReflexAngles","coordsCopy","areClockwise","shouldReverseCoords","clockwiseCoords","startAngle","endAngle","getSinusoidCoefficients","getQuadraticCoefficients","p3","denom"],"mappings":"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"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Khan Academy's Javascript Numeric Math Utilities",
4
4
  "author": "Khan Academy",
5
5
  "license": "MIT",
6
- "version": "2.0.9",
6
+ "version": "2.0.11",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
@@ -22,13 +22,13 @@
22
22
  "dist"
23
23
  ],
24
24
  "dependencies": {
25
- "@khanacademy/perseus-core": "11.0.0",
26
- "@khanacademy/perseus-utils": "2.0.3"
25
+ "@khanacademy/perseus-core": "12.1.0",
26
+ "@khanacademy/perseus-utils": "2.0.4"
27
27
  },
28
28
  "devDependencies": {
29
29
  "jquery": "^2.1.1",
30
30
  "underscore": "^1.4.4",
31
- "perseus-build-settings": "0.6.1"
31
+ "perseus-build-settings": "0.6.2"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "jquery": "^2.1.1",