@khanacademy/kmath 0.1.0 → 0.1.1
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/CHANGELOG.md +6 -0
- package/dist/es/index.js +53 -55
- package/dist/es/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
package/dist/es/index.js
CHANGED
|
@@ -4,10 +4,10 @@ import _ from 'underscore';
|
|
|
4
4
|
* Number Utils
|
|
5
5
|
* A number is a js-number, e.g. 5.12
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
const DEFAULT_TOLERANCE = 1e-9;
|
|
8
8
|
|
|
9
9
|
// TODO: Should this just be Number.Epsilon
|
|
10
|
-
|
|
10
|
+
const EPSILON = Math.pow(2, -42);
|
|
11
11
|
function is$2(x) {
|
|
12
12
|
return _.isNumber(x) && !_.isNaN(x);
|
|
13
13
|
}
|
|
@@ -35,7 +35,7 @@ function isInteger(num, tolerance) {
|
|
|
35
35
|
|
|
36
36
|
// Round a number to a certain number of decimal places
|
|
37
37
|
function round$2(num, precision) {
|
|
38
|
-
|
|
38
|
+
const factor = Math.pow(10, precision);
|
|
39
39
|
return Math.round(num * factor) / factor;
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -65,15 +65,15 @@ function ceilTo$2(num, increment) {
|
|
|
65
65
|
* toFraction(0.66, 0.01) => [2/3]
|
|
66
66
|
* toFraction(283 + 1/3) => [850, 3]
|
|
67
67
|
*/
|
|
68
|
-
function toFraction(decimal
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
function toFraction(decimal,
|
|
69
|
+
// can't be 0
|
|
70
|
+
tolerance = EPSILON, maxDenominator = 1000) {
|
|
71
71
|
// Initialize everything to compute successive terms of
|
|
72
72
|
// continued-fraction approximations via recurrence relation
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
let n = [1, 0];
|
|
74
|
+
let d = [0, 1];
|
|
75
|
+
let a = Math.floor(decimal);
|
|
76
|
+
let rem = decimal - a;
|
|
77
77
|
while (d[0] <= maxDenominator) {
|
|
78
78
|
if (equal$4(n[0] / d[0], decimal, tolerance)) {
|
|
79
79
|
return [n[0], d[0]];
|
|
@@ -144,8 +144,8 @@ function length(v) {
|
|
|
144
144
|
}
|
|
145
145
|
// Dot product of two vectors
|
|
146
146
|
function dot(a, b) {
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
const zipped = _.zip(a, b);
|
|
148
|
+
const multiplied = zipped.map(arrayProduct);
|
|
149
149
|
return arraySum(multiplied);
|
|
150
150
|
}
|
|
151
151
|
|
|
@@ -153,8 +153,8 @@ function dot(a, b) {
|
|
|
153
153
|
*
|
|
154
154
|
* add([1, 2], [3, 4]) -> [4, 6]
|
|
155
155
|
*/
|
|
156
|
-
function add() {
|
|
157
|
-
|
|
156
|
+
function add(...vecs) {
|
|
157
|
+
const zipped = _.zip(...vecs);
|
|
158
158
|
// @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.
|
|
159
159
|
return zipped.map(arraySum);
|
|
160
160
|
}
|
|
@@ -202,8 +202,8 @@ function collinear(v1, v2, tolerance) {
|
|
|
202
202
|
|
|
203
203
|
// Convert a cartesian coordinate into a radian polar coordinate
|
|
204
204
|
function polarRadFromCart$1(v) {
|
|
205
|
-
|
|
206
|
-
|
|
205
|
+
const radius = length(v);
|
|
206
|
+
let theta = Math.atan2(v[1], v[0]);
|
|
207
207
|
|
|
208
208
|
// Convert angle range from [-pi, pi] to [0, 2pi]
|
|
209
209
|
if (theta < 0) {
|
|
@@ -214,7 +214,7 @@ function polarRadFromCart$1(v) {
|
|
|
214
214
|
|
|
215
215
|
// Converts a cartesian coordinate into a degree polar coordinate
|
|
216
216
|
function polarDegFromCart$1(v) /* TODO: convert to tuple/Point */{
|
|
217
|
-
|
|
217
|
+
const polar = polarRadFromCart$1(v);
|
|
218
218
|
return [polar[0], polar[1] * 180 / Math.PI];
|
|
219
219
|
}
|
|
220
220
|
|
|
@@ -223,8 +223,7 @@ function polarDegFromCart$1(v) /* TODO: convert to tuple/Point */{
|
|
|
223
223
|
* Examples:
|
|
224
224
|
* cartFromPolarRad(5, Math.PI)
|
|
225
225
|
*/
|
|
226
|
-
function cartFromPolarRad$1(radius) /* TODO: convert to tuple/Point */{
|
|
227
|
-
var theta = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
226
|
+
function cartFromPolarRad$1(radius, theta = 0) /* TODO: convert to tuple/Point */{
|
|
228
227
|
return [radius * Math.cos(theta), radius * Math.sin(theta)];
|
|
229
228
|
}
|
|
230
229
|
|
|
@@ -233,20 +232,19 @@ function cartFromPolarRad$1(radius) /* TODO: convert to tuple/Point */{
|
|
|
233
232
|
* Examples:
|
|
234
233
|
* cartFromPolarDeg(5, 30)
|
|
235
234
|
*/
|
|
236
|
-
function cartFromPolarDeg$1(radius) {
|
|
237
|
-
var theta = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
235
|
+
function cartFromPolarDeg$1(radius, theta = 0) {
|
|
238
236
|
return cartFromPolarRad$1(radius, theta * Math.PI / 180);
|
|
239
237
|
}
|
|
240
238
|
|
|
241
239
|
// Rotate vector
|
|
242
240
|
function rotateRad$1(v, theta) {
|
|
243
|
-
|
|
244
|
-
|
|
241
|
+
const polar = polarRadFromCart$1(v);
|
|
242
|
+
const angle = polar[1] + theta;
|
|
245
243
|
return cartFromPolarRad$1(polar[0], angle);
|
|
246
244
|
}
|
|
247
245
|
function rotateDeg$1(v, theta) {
|
|
248
|
-
|
|
249
|
-
|
|
246
|
+
const polar = polarDegFromCart$1(v);
|
|
247
|
+
const angle = polar[1] + theta;
|
|
250
248
|
return cartFromPolarDeg$1(polar[0], angle);
|
|
251
249
|
}
|
|
252
250
|
|
|
@@ -260,7 +258,7 @@ function angleDeg(v1, v2) {
|
|
|
260
258
|
|
|
261
259
|
// Vector projection of v1 onto v2
|
|
262
260
|
function projection(v1, v2) {
|
|
263
|
-
|
|
261
|
+
const scalar = dot(v1, v2) / dot(v2, v2);
|
|
264
262
|
return scale(v2, scalar);
|
|
265
263
|
}
|
|
266
264
|
|
|
@@ -354,19 +352,19 @@ function distanceToPoint$1(point1, point2) {
|
|
|
354
352
|
|
|
355
353
|
// Distance between point and line
|
|
356
354
|
function distanceToLine(point, line) {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
355
|
+
const lv = subtract(line[1], line[0]);
|
|
356
|
+
const pv = subtract(point, line[0]);
|
|
357
|
+
const projectedPv = projection(pv, lv);
|
|
358
|
+
const distancePv = subtract(projectedPv, pv);
|
|
361
359
|
return length(distancePv);
|
|
362
360
|
}
|
|
363
361
|
|
|
364
362
|
// Reflect point over line
|
|
365
363
|
function reflectOverLine(point, line) {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
364
|
+
const lv = subtract(line[1], line[0]);
|
|
365
|
+
const pv = subtract(point, line[0]);
|
|
366
|
+
const projectedPv = projection(pv, lv);
|
|
367
|
+
const reflectedPv = subtract(scale(projectedPv, 2), pv);
|
|
370
368
|
return add(line[0], reflectedPv);
|
|
371
369
|
}
|
|
372
370
|
|
|
@@ -383,7 +381,7 @@ function compare(point1, point2, equalityTolerance) /* TODO: convert to -1 | 0 |
|
|
|
383
381
|
if (point1.length !== point2.length) {
|
|
384
382
|
return point1.length - point2.length;
|
|
385
383
|
}
|
|
386
|
-
for (
|
|
384
|
+
for (let i = 0; i < point1.length; i++) {
|
|
387
385
|
if (!equal$4(point1[i], point2[i], equalityTolerance)) {
|
|
388
386
|
return point1[i] - point2[i];
|
|
389
387
|
}
|
|
@@ -392,25 +390,25 @@ function compare(point1, point2, equalityTolerance) /* TODO: convert to -1 | 0 |
|
|
|
392
390
|
}
|
|
393
391
|
|
|
394
392
|
// Check if a value is a point
|
|
395
|
-
|
|
393
|
+
const is = is$1;
|
|
396
394
|
|
|
397
395
|
// Add and subtract vector(s)
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
396
|
+
const addVector = add;
|
|
397
|
+
const addVectors = add;
|
|
398
|
+
const subtractVector = subtract;
|
|
399
|
+
const equal$2 = equal$3;
|
|
402
400
|
|
|
403
401
|
// Convert from cartesian to polar and back
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
402
|
+
const polarRadFromCart = polarRadFromCart$1;
|
|
403
|
+
const polarDegFromCart = polarDegFromCart$1;
|
|
404
|
+
const cartFromPolarRad = cartFromPolarRad$1;
|
|
405
|
+
const cartFromPolarDeg = cartFromPolarDeg$1;
|
|
408
406
|
|
|
409
407
|
// Rounding
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
408
|
+
const round = round$1;
|
|
409
|
+
const roundTo = roundTo$1;
|
|
410
|
+
const floorTo = floorTo$1;
|
|
411
|
+
const ceilTo = ceilTo$1;
|
|
414
412
|
|
|
415
413
|
var point = /*#__PURE__*/Object.freeze({
|
|
416
414
|
__proto__: null,
|
|
@@ -452,8 +450,8 @@ function equal$1(line1, line2, tolerance) {
|
|
|
452
450
|
// TODO: A nicer implementation might just check collinearity of
|
|
453
451
|
// vectors using underscore magick
|
|
454
452
|
// Compare the directions of the lines
|
|
455
|
-
|
|
456
|
-
|
|
453
|
+
const v1 = subtract(line1[1], line1[0]);
|
|
454
|
+
const v2 = subtract(line2[1], line2[0]);
|
|
457
455
|
if (!collinear(v1, v2, tolerance)) {
|
|
458
456
|
return false;
|
|
459
457
|
}
|
|
@@ -463,7 +461,7 @@ function equal$1(line1, line2, tolerance) {
|
|
|
463
461
|
}
|
|
464
462
|
// Make sure that the direction to get from line1 to
|
|
465
463
|
// line2 is the same as the direction of the lines
|
|
466
|
-
|
|
464
|
+
const line1ToLine2Vector = subtract(line2[0], line1[0]);
|
|
467
465
|
return collinear(v1, line1ToLine2Vector, tolerance);
|
|
468
466
|
}
|
|
469
467
|
|
|
@@ -483,10 +481,10 @@ var line = /*#__PURE__*/Object.freeze({
|
|
|
483
481
|
*/
|
|
484
482
|
function equal(ray1, ray2, tolerance) {
|
|
485
483
|
// Compare the directions of the rays
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
484
|
+
const v1 = subtract(ray1[1], ray1[0]);
|
|
485
|
+
const v2 = subtract(ray2[1], ray2[0]);
|
|
486
|
+
const sameOrigin = equal$2(ray1[0], ray2[0]);
|
|
487
|
+
const codirectional$1 = codirectional(v1, v2, tolerance);
|
|
490
488
|
return sameOrigin && codirectional$1;
|
|
491
489
|
}
|
|
492
490
|
|
package/dist/es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/number.ts","../../src/vector.ts","../../src/point.ts","../../src/line.ts","../../src/ray.ts"],"sourcesContent":["/**\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 _ from \"underscore\";\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\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<T>(vec: ReadonlyArray<T>, dimension?: number): boolean {\n if (!_.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 [FEI-5003] - 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 [FEI-5003] - 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 [FEI-5003] - 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 [FEI-5003] - 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 // _.zip will nicely deal with the lengths, going through\n // the length of the longest vector. knumber.equal then\n // returns false for any number compared to the undefined\n // passed in if one of the vectors is shorter.\n return _.zip(v1, v2).every((pair) =>\n 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 [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n // $FlowFixMe[prop-missing]\n // $FlowFixMe[incompatible-call]\n knumber.round(elem, precision[i] || precision),\n );\n}\n\n// Round each number to the nearest increment\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n // $FlowFixMe[prop-missing]\n // $FlowFixMe[incompatible-call]\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 [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n // $FlowFixMe[prop-missing]\n // $FlowFixMe[incompatible-call]\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 [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n // $FlowFixMe[prop-missing]\n // $FlowFixMe[incompatible-call]\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 _ from \"underscore\";\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"],"names":["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","arguments","length","undefined","maxDenominator","n","d","a","rem","arraySum","array","reduce","memo","arg","arrayProduct","vec","dimension","isArray","every","knumber","normalize","v","scale","sqrt","dot","b","zipped","zip","multiplied","map","add","subtract","v1","v2","dim","negate","scalar","pair","codirectional","collinear","polarRadFromCart","radius","theta","atan2","PI","polarDegFromCart","polar","cartFromPolarRad","cos","sin","cartFromPolarDeg","rotateRad","angle","rotateDeg","angleRad","acos","angleDeg","projection","elem","i","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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/number.ts","../../src/vector.ts","../../src/point.ts","../../src/line.ts","../../src/ray.ts"],"sourcesContent":["/**\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 _ from \"underscore\";\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\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<T>(vec: ReadonlyArray<T>, dimension?: number): boolean {\n if (!_.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 [FEI-5003] - 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 [FEI-5003] - 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 [FEI-5003] - 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 [FEI-5003] - 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 // _.zip will nicely deal with the lengths, going through\n // the length of the longest vector. knumber.equal then\n // returns false for any number compared to the undefined\n // passed in if one of the vectors is shorter.\n return _.zip(v1, v2).every((pair) =>\n 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 [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n // $FlowFixMe[prop-missing]\n // $FlowFixMe[incompatible-call]\n knumber.round(elem, precision[i] || precision),\n );\n}\n\n// Round each number to the nearest increment\nexport function roundTo<V extends Vector>(vec: V, increment: V | number): V {\n // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n // $FlowFixMe[prop-missing]\n // $FlowFixMe[incompatible-call]\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 [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n // $FlowFixMe[prop-missing]\n // $FlowFixMe[incompatible-call]\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 [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.\n return vec.map((elem, i) =>\n // $FlowFixMe[prop-missing]\n // $FlowFixMe[incompatible-call]\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 _ from \"underscore\";\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"],"names":["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","vec","dimension","isArray","undefined","length","every","knumber","normalize","v","scale","sqrt","dot","b","zipped","zip","multiplied","map","add","vecs","subtract","v1","v2","dim","negate","scalar","pair","codirectional","collinear","polarRadFromCart","radius","theta","atan2","PI","polarDegFromCart","polar","cartFromPolarRad","cos","sin","cartFromPolarDeg","rotateRad","angle","rotateDeg","angleRad","acos","angleDeg","projection","elem","i","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"],"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": "0.1.
|
|
6
|
+
"version": "0.1.1",
|
|
7
7
|
"publishConfig": {
|
|
8
8
|
"access": "public"
|
|
9
9
|
},
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"perseus-build-settings": "^0.0
|
|
25
|
+
"perseus-build-settings": "^0.1.0",
|
|
26
26
|
"underscore": "1.4.4"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|