@khanacademy/kmath 0.0.0-PR443-20230328215601

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.
@@ -0,0 +1,499 @@
1
+ import _ from 'underscore';
2
+
3
+ /**
4
+ * Number Utils
5
+ * A number is a js-number, e.g. 5.12
6
+ */
7
+ var DEFAULT_TOLERANCE = 1e-9;
8
+
9
+ // TODO: Should this just be Number.Epsilon
10
+ var EPSILON = Math.pow(2, -42);
11
+ function is$2(x) {
12
+ return _.isNumber(x) && !_.isNaN(x);
13
+ }
14
+ function equal$4(x, y, tolerance) {
15
+ // Checking for undefined makes this function behave nicely
16
+ // with vectors of different lengths that are _.zip'd together
17
+ if (x == null || y == null) {
18
+ return x === y;
19
+ }
20
+ // We check === here so that +/-Infinity comparisons work correctly
21
+ if (x === y) {
22
+ return true;
23
+ }
24
+ if (tolerance == null) {
25
+ tolerance = DEFAULT_TOLERANCE;
26
+ }
27
+ return Math.abs(x - y) < tolerance;
28
+ }
29
+ function sign(x, tolerance) /* Should be: 0 | 1 | -1 */{
30
+ return equal$4(x, 0, tolerance) ? 0 : Math.abs(x) / x;
31
+ }
32
+ function isInteger(num, tolerance) {
33
+ return equal$4(Math.round(num), num, tolerance);
34
+ }
35
+
36
+ // Round a number to a certain number of decimal places
37
+ function round$2(num, precision) {
38
+ var factor = Math.pow(10, precision);
39
+ return Math.round(num * factor) / factor;
40
+ }
41
+
42
+ // Round num to the nearest multiple of increment
43
+ // i.e. roundTo(83, 5) -> 85
44
+ function roundTo$2(num, increment) {
45
+ return Math.round(num / increment) * increment;
46
+ }
47
+ function floorTo$2(num, increment) {
48
+ return Math.floor(num / increment) * increment;
49
+ }
50
+ function ceilTo$2(num, increment) {
51
+ return Math.ceil(num / increment) * increment;
52
+ }
53
+
54
+ /**
55
+ * toFraction
56
+ *
57
+ * Returns a [numerator, denominator] array rational representation
58
+ * of `decimal`
59
+ *
60
+ * See http://en.wikipedia.org/wiki/Continued_fraction for implementation
61
+ * details
62
+ *
63
+ * toFraction(4/8) => [1, 2]
64
+ * toFraction(0.66) => [33, 50]
65
+ * toFraction(0.66, 0.01) => [2/3]
66
+ * toFraction(283 + 1/3) => [850, 3]
67
+ */
68
+ function toFraction(decimal) {
69
+ var tolerance = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EPSILON;
70
+ var maxDenominator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
71
+ // Initialize everything to compute successive terms of
72
+ // continued-fraction approximations via recurrence relation
73
+ var n = [1, 0];
74
+ var d = [0, 1];
75
+ var a = Math.floor(decimal);
76
+ var rem = decimal - a;
77
+ while (d[0] <= maxDenominator) {
78
+ if (equal$4(n[0] / d[0], decimal, tolerance)) {
79
+ return [n[0], d[0]];
80
+ }
81
+ n = [a * n[0] + n[1], n[0]];
82
+ d = [a * d[0] + d[1], d[0]];
83
+ a = Math.floor(1 / rem);
84
+ rem = 1 / rem - a;
85
+ }
86
+
87
+ // We failed to find a nice rational representation,
88
+ // so return an irrational "fraction"
89
+ return [decimal, 1];
90
+ }
91
+
92
+ var number = /*#__PURE__*/Object.freeze({
93
+ __proto__: null,
94
+ DEFAULT_TOLERANCE: DEFAULT_TOLERANCE,
95
+ EPSILON: EPSILON,
96
+ is: is$2,
97
+ equal: equal$4,
98
+ sign: sign,
99
+ isInteger: isInteger,
100
+ round: round$2,
101
+ roundTo: roundTo$2,
102
+ floorTo: floorTo$2,
103
+ ceilTo: ceilTo$2,
104
+ toFraction: toFraction
105
+ });
106
+
107
+ /**
108
+ * Vector Utils
109
+ * A vector is an array of numbers e.g. [0, 3, 4].
110
+ */
111
+ function arraySum(array) {
112
+ return array.reduce((memo, arg) => memo + arg, 0);
113
+ }
114
+ function arrayProduct(array) {
115
+ return array.reduce((memo, arg) => memo * arg, 1);
116
+ }
117
+
118
+ /**
119
+ * Checks if the given vector contains only numbers and, optionally, is of the
120
+ * right dimension (length).
121
+ *
122
+ * is([1, 2, 3]) -> true
123
+ * is([1, "Hello", 3]) -> false
124
+ * is([1, 2, 3], 1) -> false
125
+ */
126
+ function is$1(vec, dimension) {
127
+ if (!_.isArray(vec)) {
128
+ return false;
129
+ }
130
+ if (dimension !== undefined && vec.length !== dimension) {
131
+ return false;
132
+ }
133
+ return vec.every(is$2);
134
+ }
135
+
136
+ // Normalize to a unit vector
137
+ function normalize(v) {
138
+ return scale(v, 1 / length(v));
139
+ }
140
+
141
+ // Length/magnitude of a vector
142
+ function length(v) {
143
+ return Math.sqrt(dot(v, v));
144
+ }
145
+ // Dot product of two vectors
146
+ function dot(a, b) {
147
+ var zipped = _.zip(a, b);
148
+ var multiplied = zipped.map(arrayProduct);
149
+ return arraySum(multiplied);
150
+ }
151
+
152
+ /* vector-add multiple [x, y] coords/vectors
153
+ *
154
+ * add([1, 2], [3, 4]) -> [4, 6]
155
+ */
156
+ function add() {
157
+ var zipped = _.zip(...arguments);
158
+ // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.
159
+ return zipped.map(arraySum);
160
+ }
161
+ function subtract(v1, v2) {
162
+ // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.
163
+ return _.zip(v1, v2).map(dim => dim[0] - dim[1]);
164
+ }
165
+ function negate(v) {
166
+ // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.
167
+ return v.map(x => {
168
+ return -x;
169
+ });
170
+ }
171
+
172
+ // Scale a vector
173
+ function scale(v1, scalar) {
174
+ // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.
175
+ return v1.map(x => {
176
+ return x * scalar;
177
+ });
178
+ }
179
+ function equal$3(v1, v2, tolerance) {
180
+ // _.zip will nicely deal with the lengths, going through
181
+ // the length of the longest vector. knumber.equal then
182
+ // returns false for any number compared to the undefined
183
+ // passed in if one of the vectors is shorter.
184
+ return _.zip(v1, v2).every(pair => equal$4(pair[0], pair[1], tolerance));
185
+ }
186
+ function codirectional(v1, v2, tolerance) {
187
+ // The origin is trivially codirectional with all other vectors.
188
+ // This gives nice semantics for codirectionality between points when
189
+ // comparing their difference vectors.
190
+ if (equal$4(length(v1), 0, tolerance) || equal$4(length(v2), 0, tolerance)) {
191
+ return true;
192
+ }
193
+ v1 = normalize(v1);
194
+ v2 = normalize(v2);
195
+ return equal$3(v1, v2, tolerance);
196
+ }
197
+ function collinear(v1, v2, tolerance) {
198
+ return codirectional(v1, v2, tolerance) || codirectional(v1, negate(v2), tolerance);
199
+ }
200
+
201
+ // TODO(jeremy) These coordinate conversion functions really only handle 2D points (ie. [number, number])
202
+
203
+ // Convert a cartesian coordinate into a radian polar coordinate
204
+ function polarRadFromCart$1(v) {
205
+ var radius = length(v);
206
+ var theta = Math.atan2(v[1], v[0]);
207
+
208
+ // Convert angle range from [-pi, pi] to [0, 2pi]
209
+ if (theta < 0) {
210
+ theta += 2 * Math.PI;
211
+ }
212
+ return [radius, theta];
213
+ }
214
+
215
+ // Converts a cartesian coordinate into a degree polar coordinate
216
+ function polarDegFromCart$1(v) /* TODO: convert to tuple/Point */{
217
+ var polar = polarRadFromCart$1(v);
218
+ return [polar[0], polar[1] * 180 / Math.PI];
219
+ }
220
+
221
+ /* Convert a polar coordinate into a cartesian coordinate
222
+ *
223
+ * Examples:
224
+ * cartFromPolarRad(5, Math.PI)
225
+ */
226
+ function cartFromPolarRad$1(radius) /* TODO: convert to tuple/Point */{
227
+ var theta = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
228
+ return [radius * Math.cos(theta), radius * Math.sin(theta)];
229
+ }
230
+
231
+ /* Convert a polar coordinate into a cartesian coordinate
232
+ *
233
+ * Examples:
234
+ * cartFromPolarDeg(5, 30)
235
+ */
236
+ function cartFromPolarDeg$1(radius) {
237
+ var theta = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
238
+ return cartFromPolarRad$1(radius, theta * Math.PI / 180);
239
+ }
240
+
241
+ // Rotate vector
242
+ function rotateRad$1(v, theta) {
243
+ var polar = polarRadFromCart$1(v);
244
+ var angle = polar[1] + theta;
245
+ return cartFromPolarRad$1(polar[0], angle);
246
+ }
247
+ function rotateDeg$1(v, theta) {
248
+ var polar = polarDegFromCart$1(v);
249
+ var angle = polar[1] + theta;
250
+ return cartFromPolarDeg$1(polar[0], angle);
251
+ }
252
+
253
+ // Angle between two vectors
254
+ function angleRad(v1, v2) {
255
+ return Math.acos(dot(v1, v2) / (length(v1) * length(v2)));
256
+ }
257
+ function angleDeg(v1, v2) {
258
+ return angleRad(v1, v2) * 180 / Math.PI;
259
+ }
260
+
261
+ // Vector projection of v1 onto v2
262
+ function projection(v1, v2) {
263
+ var scalar = dot(v1, v2) / dot(v2, v2);
264
+ return scale(v2, scalar);
265
+ }
266
+
267
+ // Round each number to a certain number of decimal places
268
+ function round$1(vec, precision) {
269
+ // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.
270
+ return vec.map((elem, i) =>
271
+ // $FlowFixMe[prop-missing]
272
+ // $FlowFixMe[incompatible-call]
273
+ round$2(elem, precision[i] || precision));
274
+ }
275
+
276
+ // Round each number to the nearest increment
277
+ function roundTo$1(vec, increment) {
278
+ // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.
279
+ return vec.map((elem, i) =>
280
+ // $FlowFixMe[prop-missing]
281
+ // $FlowFixMe[incompatible-call]
282
+ roundTo$2(elem, increment[i] || increment));
283
+ }
284
+ function floorTo$1(vec, increment) {
285
+ // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.
286
+ return vec.map((elem, i) =>
287
+ // $FlowFixMe[prop-missing]
288
+ // $FlowFixMe[incompatible-call]
289
+ floorTo$2(elem, increment[i] || increment));
290
+ }
291
+ function ceilTo$1(vec, increment) {
292
+ // @ts-expect-error [FEI-5003] - TS2322 - Type 'number[]' is not assignable to type 'V'.
293
+ return vec.map((elem, i) =>
294
+ // $FlowFixMe[prop-missing]
295
+ // $FlowFixMe[incompatible-call]
296
+ ceilTo$2(elem, increment[i] || increment));
297
+ }
298
+
299
+ var vector = /*#__PURE__*/Object.freeze({
300
+ __proto__: null,
301
+ is: is$1,
302
+ normalize: normalize,
303
+ length: length,
304
+ dot: dot,
305
+ add: add,
306
+ subtract: subtract,
307
+ negate: negate,
308
+ scale: scale,
309
+ equal: equal$3,
310
+ codirectional: codirectional,
311
+ collinear: collinear,
312
+ polarRadFromCart: polarRadFromCart$1,
313
+ polarDegFromCart: polarDegFromCart$1,
314
+ cartFromPolarRad: cartFromPolarRad$1,
315
+ cartFromPolarDeg: cartFromPolarDeg$1,
316
+ rotateRad: rotateRad$1,
317
+ rotateDeg: rotateDeg$1,
318
+ angleRad: angleRad,
319
+ angleDeg: angleDeg,
320
+ projection: projection,
321
+ round: round$1,
322
+ roundTo: roundTo$1,
323
+ floorTo: floorTo$1,
324
+ ceilTo: ceilTo$1
325
+ });
326
+
327
+ /**
328
+ * Point Utils
329
+ * A point is an array of two numbers e.g. [0, 0].
330
+ */
331
+
332
+ // A point, in 2D, 3D, or nD space.
333
+
334
+ // Rotate point (around origin unless a center is specified)
335
+ function rotateRad(point, theta, center) {
336
+ if (center === undefined) {
337
+ return rotateRad$1(point, theta);
338
+ } else {
339
+ return add(center, rotateRad$1(subtract(point, center), theta));
340
+ }
341
+ }
342
+ function rotateDeg(point, theta, center) {
343
+ if (center === undefined) {
344
+ return rotateDeg$1(point, theta);
345
+ } else {
346
+ return add(center, rotateDeg$1(subtract(point, center), theta));
347
+ }
348
+ }
349
+
350
+ // Distance between two points
351
+ function distanceToPoint$1(point1, point2) {
352
+ return length(subtract(point1, point2));
353
+ }
354
+
355
+ // Distance between point and line
356
+ function distanceToLine(point, line) {
357
+ var lv = subtract(line[1], line[0]);
358
+ var pv = subtract(point, line[0]);
359
+ var projectedPv = projection(pv, lv);
360
+ var distancePv = subtract(projectedPv, pv);
361
+ return length(distancePv);
362
+ }
363
+
364
+ // Reflect point over line
365
+ function reflectOverLine(point, line) {
366
+ var lv = subtract(line[1], line[0]);
367
+ var pv = subtract(point, line[0]);
368
+ var projectedPv = projection(pv, lv);
369
+ var reflectedPv = subtract(scale(projectedPv, 2), pv);
370
+ return add(line[0], reflectedPv);
371
+ }
372
+
373
+ /**
374
+ * Compares two points, returning -1, 0, or 1, for use with
375
+ * Array.prototype.sort
376
+ *
377
+ * Note: This technically doesn't satisfy the total-ordering
378
+ * requirements of Array.prototype.sort unless equalityTolerance
379
+ * is 0. In some cases very close points that compare within a
380
+ * few equalityTolerances could appear in the wrong order.
381
+ */
382
+ function compare(point1, point2, equalityTolerance) /* TODO: convert to -1 | 0 | 1 type */{
383
+ if (point1.length !== point2.length) {
384
+ return point1.length - point2.length;
385
+ }
386
+ for (var i = 0; i < point1.length; i++) {
387
+ if (!equal$4(point1[i], point2[i], equalityTolerance)) {
388
+ return point1[i] - point2[i];
389
+ }
390
+ }
391
+ return 0;
392
+ }
393
+
394
+ // Check if a value is a point
395
+ var is = is$1;
396
+
397
+ // Add and subtract vector(s)
398
+ var addVector = add;
399
+ var addVectors = add;
400
+ var subtractVector = subtract;
401
+ var equal$2 = equal$3;
402
+
403
+ // Convert from cartesian to polar and back
404
+ var polarRadFromCart = polarRadFromCart$1;
405
+ var polarDegFromCart = polarDegFromCart$1;
406
+ var cartFromPolarRad = cartFromPolarRad$1;
407
+ var cartFromPolarDeg = cartFromPolarDeg$1;
408
+
409
+ // Rounding
410
+ var round = round$1;
411
+ var roundTo = roundTo$1;
412
+ var floorTo = floorTo$1;
413
+ var ceilTo = ceilTo$1;
414
+
415
+ var point = /*#__PURE__*/Object.freeze({
416
+ __proto__: null,
417
+ rotateRad: rotateRad,
418
+ rotateDeg: rotateDeg,
419
+ distanceToPoint: distanceToPoint$1,
420
+ distanceToLine: distanceToLine,
421
+ reflectOverLine: reflectOverLine,
422
+ compare: compare,
423
+ is: is,
424
+ addVector: addVector,
425
+ addVectors: addVectors,
426
+ subtractVector: subtractVector,
427
+ equal: equal$2,
428
+ polarRadFromCart: polarRadFromCart,
429
+ polarDegFromCart: polarDegFromCart,
430
+ cartFromPolarRad: cartFromPolarRad,
431
+ cartFromPolarDeg: cartFromPolarDeg,
432
+ round: round,
433
+ roundTo: roundTo,
434
+ floorTo: floorTo,
435
+ ceilTo: ceilTo
436
+ });
437
+
438
+ /**
439
+ * Line Utils
440
+ * A line is an array of two points e.g. [[-5, 0], [5, 0]].
441
+ */
442
+ function distanceToPoint(line, point$1) {
443
+ return distanceToLine(point$1, line);
444
+ }
445
+ function reflectPoint(line, point$1) {
446
+ return reflectOverLine(point$1, line);
447
+ }
448
+ function midpoint(line) {
449
+ return [(line[0][0] + line[1][0]) / 2, (line[0][1] + line[1][1]) / 2];
450
+ }
451
+ function equal$1(line1, line2, tolerance) {
452
+ // TODO: A nicer implementation might just check collinearity of
453
+ // vectors using underscore magick
454
+ // Compare the directions of the lines
455
+ var v1 = subtract(line1[1], line1[0]);
456
+ var v2 = subtract(line2[1], line2[0]);
457
+ if (!collinear(v1, v2, tolerance)) {
458
+ return false;
459
+ }
460
+ // If the start point is the same for the two lines, then they are the same
461
+ if (equal$2(line1[0], line2[0])) {
462
+ return true;
463
+ }
464
+ // Make sure that the direction to get from line1 to
465
+ // line2 is the same as the direction of the lines
466
+ var line1ToLine2Vector = subtract(line2[0], line1[0]);
467
+ return collinear(v1, line1ToLine2Vector, tolerance);
468
+ }
469
+
470
+ var line = /*#__PURE__*/Object.freeze({
471
+ __proto__: null,
472
+ distanceToPoint: distanceToPoint,
473
+ reflectPoint: reflectPoint,
474
+ midpoint: midpoint,
475
+ equal: equal$1
476
+ });
477
+
478
+ /**
479
+ * Ray Utils
480
+ * A ray (→) is an array of an endpoint and another point along the ray.
481
+ * For example, [[0, 0], [1, 0]] is the ray starting at the origin and
482
+ * traveling along the positive x-axis.
483
+ */
484
+ function equal(ray1, ray2, tolerance) {
485
+ // Compare the directions of the rays
486
+ var v1 = subtract(ray1[1], ray1[0]);
487
+ var v2 = subtract(ray2[1], ray2[0]);
488
+ var sameOrigin = equal$2(ray1[0], ray2[0]);
489
+ var codirectional$1 = codirectional(v1, v2, tolerance);
490
+ return sameOrigin && codirectional$1;
491
+ }
492
+
493
+ var ray = /*#__PURE__*/Object.freeze({
494
+ __proto__: null,
495
+ equal: equal
496
+ });
497
+
498
+ export { line, number, point, ray, vector };
499
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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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"}