@js-draw/math 1.21.3 → 1.23.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. package/build-config.json +1 -1
  2. package/dist/cjs/Color4.d.ts +24 -1
  3. package/dist/cjs/Color4.js +35 -3
  4. package/dist/cjs/Mat33.d.ts +21 -11
  5. package/dist/cjs/Mat33.js +28 -24
  6. package/dist/cjs/Vec3.d.ts +12 -3
  7. package/dist/cjs/Vec3.js +20 -9
  8. package/dist/cjs/lib.d.ts +3 -0
  9. package/dist/cjs/lib.js +3 -0
  10. package/dist/cjs/shapes/BezierJSWrapper.d.ts +2 -0
  11. package/dist/cjs/shapes/BezierJSWrapper.js +22 -13
  12. package/dist/cjs/shapes/LineSegment2.js +13 -17
  13. package/dist/cjs/shapes/Parameterized2DShape.js +1 -1
  14. package/dist/cjs/shapes/Path.d.ts +1 -0
  15. package/dist/cjs/shapes/Path.js +50 -47
  16. package/dist/cjs/shapes/QuadraticBezier.d.ts +19 -2
  17. package/dist/cjs/shapes/QuadraticBezier.js +26 -3
  18. package/dist/cjs/shapes/Rect2.d.ts +13 -0
  19. package/dist/cjs/shapes/Rect2.js +35 -16
  20. package/dist/cjs/shapes/Triangle.js +4 -5
  21. package/dist/cjs/utils/convexHull2Of.js +3 -3
  22. package/dist/mjs/Color4.d.ts +24 -1
  23. package/dist/mjs/Color4.mjs +35 -3
  24. package/dist/mjs/Mat33.d.ts +21 -11
  25. package/dist/mjs/Mat33.mjs +28 -24
  26. package/dist/mjs/Vec3.d.ts +12 -3
  27. package/dist/mjs/Vec3.mjs +20 -9
  28. package/dist/mjs/lib.d.ts +3 -0
  29. package/dist/mjs/lib.mjs +3 -0
  30. package/dist/mjs/shapes/BezierJSWrapper.d.ts +2 -0
  31. package/dist/mjs/shapes/BezierJSWrapper.mjs +22 -13
  32. package/dist/mjs/shapes/LineSegment2.mjs +13 -17
  33. package/dist/mjs/shapes/Parameterized2DShape.mjs +1 -1
  34. package/dist/mjs/shapes/Path.d.ts +1 -0
  35. package/dist/mjs/shapes/Path.mjs +50 -47
  36. package/dist/mjs/shapes/QuadraticBezier.d.ts +19 -2
  37. package/dist/mjs/shapes/QuadraticBezier.mjs +26 -3
  38. package/dist/mjs/shapes/Rect2.d.ts +13 -0
  39. package/dist/mjs/shapes/Rect2.mjs +35 -16
  40. package/dist/mjs/shapes/Triangle.mjs +4 -5
  41. package/dist/mjs/utils/convexHull2Of.mjs +3 -3
  42. package/dist-test/test_imports/test-require.cjs +1 -1
  43. package/package.json +3 -3
  44. package/src/Color4.test.ts +21 -21
  45. package/src/Color4.ts +61 -18
  46. package/src/Mat33.fromCSSMatrix.test.ts +32 -46
  47. package/src/Mat33.test.ts +64 -102
  48. package/src/Mat33.ts +81 -104
  49. package/src/Vec2.test.ts +3 -3
  50. package/src/Vec3.test.ts +2 -3
  51. package/src/Vec3.ts +46 -61
  52. package/src/lib.ts +3 -2
  53. package/src/polynomial/solveQuadratic.test.ts +39 -13
  54. package/src/polynomial/solveQuadratic.ts +5 -6
  55. package/src/rounding/cleanUpNumber.test.ts +1 -1
  56. package/src/rounding/constants.ts +1 -3
  57. package/src/rounding/getLenAfterDecimal.ts +1 -2
  58. package/src/rounding/lib.ts +1 -2
  59. package/src/rounding/toRoundedString.test.ts +1 -1
  60. package/src/rounding/toStringOfSamePrecision.test.ts +1 -2
  61. package/src/rounding/toStringOfSamePrecision.ts +1 -1
  62. package/src/shapes/BezierJSWrapper.ts +56 -37
  63. package/src/shapes/CubicBezier.ts +3 -3
  64. package/src/shapes/LineSegment2.test.ts +24 -17
  65. package/src/shapes/LineSegment2.ts +26 -29
  66. package/src/shapes/Parameterized2DShape.ts +5 -4
  67. package/src/shapes/Path.fromString.test.ts +5 -5
  68. package/src/shapes/Path.test.ts +122 -120
  69. package/src/shapes/Path.toString.test.ts +7 -7
  70. package/src/shapes/Path.ts +379 -352
  71. package/src/shapes/PointShape2D.ts +3 -3
  72. package/src/shapes/QuadraticBezier.test.ts +27 -21
  73. package/src/shapes/QuadraticBezier.ts +26 -11
  74. package/src/shapes/Rect2.test.ts +44 -75
  75. package/src/shapes/Rect2.ts +47 -35
  76. package/src/shapes/Triangle.test.ts +31 -29
  77. package/src/shapes/Triangle.ts +17 -18
  78. package/src/utils/convexHull2Of.test.ts +54 -15
  79. package/src/utils/convexHull2Of.ts +9 -7
  80. package/tsconfig.json +1 -3
  81. package/typedoc.json +2 -2
@@ -70,11 +70,7 @@ export class Mat33 {
70
70
  this.c2 = c2;
71
71
  this.c3 = c3;
72
72
  this.cachedInverse = undefined;
73
- this.rows = [
74
- Vec3.of(a1, a2, a3),
75
- Vec3.of(b1, b2, b3),
76
- Vec3.of(c1, c2, c3),
77
- ];
73
+ this.rows = [Vec3.of(a1, a2, a3), Vec3.of(b1, b2, b3), Vec3.of(c1, c2, c3)];
78
74
  }
79
75
  /**
80
76
  * Creates a matrix from the given rows:
@@ -106,16 +102,8 @@ export class Mat33 {
106
102
  if (this.cachedInverse !== undefined) {
107
103
  return this.cachedInverse;
108
104
  }
109
- const toIdentity = [
110
- this.rows[0],
111
- this.rows[1],
112
- this.rows[2],
113
- ];
114
- const toResult = [
115
- Vec3.unitX,
116
- Vec3.unitY,
117
- Vec3.unitZ,
118
- ];
105
+ const toIdentity = [this.rows[0], this.rows[1], this.rows[2]];
106
+ const toResult = [Vec3.unitX, Vec3.unitY, Vec3.unitZ];
119
107
  // Convert toIdentity to the identity matrix and
120
108
  // toResult to the inverse through elementary row operations
121
109
  for (let cursor = 0; cursor < 3; cursor++) {
@@ -311,11 +299,7 @@ export class Mat33 {
311
299
  * ```
312
300
  */
313
301
  toArray() {
314
- return [
315
- this.a1, this.a2, this.a3,
316
- this.b1, this.b2, this.b3,
317
- this.c1, this.c2, this.c3,
318
- ];
302
+ return [this.a1, this.a2, this.a3, this.b1, this.b2, this.b3, this.c1, this.c2, this.c3];
319
303
  }
320
304
  /**
321
305
  * Returns a new `Mat33` where each entry is the output of the function
@@ -372,6 +356,26 @@ export class Mat33 {
372
356
  // ...
373
357
  return new Mat33(1, 0, amount.x, 0, 1, amount.y, 0, 0, 1);
374
358
  }
359
+ /**
360
+ * Creates a matrix for rotating `Vec2`s about `center` by some number of `radians`.
361
+ *
362
+ * For this function, {@link Vec2}s are considered to be points in 2D space.
363
+ *
364
+ * For example,
365
+ * ```ts,runnable,console
366
+ * import { Mat33, Vec2 } from '@js-draw/math';
367
+ *
368
+ * const halfCircle = Math.PI; // PI radians = 180 degrees = 1/2 circle
369
+ * const center = Vec2.of(1, 1); // The point (1,1)
370
+ * const rotationMatrix = Mat33.zRotation(halfCircle, center);
371
+ *
372
+ * console.log(
373
+ * 'Rotating (0,0) 180deg about', center, 'results in',
374
+ * // Rotates (0,0)
375
+ * rotationMatrix.transformVec2(Vec2.zero),
376
+ * );
377
+ * ```
378
+ */
375
379
  static zRotation(radians, center = Vec2.zero) {
376
380
  if (radians === 0) {
377
381
  return Mat33.identity;
@@ -421,7 +425,7 @@ export class Mat33 {
421
425
  return Mat33.identity;
422
426
  }
423
427
  const parseArguments = (argumentString) => {
424
- const parsed = argumentString.split(/[, \t\n]+/g).map(argString => {
428
+ const parsed = argumentString.split(/[, \t\n]+/g).map((argString) => {
425
429
  // Handle trailing spaces/commands
426
430
  if (argString.trim() === '') {
427
431
  return null;
@@ -432,7 +436,7 @@ export class Mat33 {
432
436
  argString = argString.substring(0, argString.length - 1);
433
437
  }
434
438
  // Remove trailing px units.
435
- argString = argString.replace(/px$/ig, '');
439
+ argString = argString.replace(/px$/gi, '');
436
440
  const numberExp = /^[-]?\d*(?:\.\d*)?(?:[eE][-+]?\d+)?$/i;
437
441
  if (!numberExp.exec(argString)) {
438
442
  throw new Error(`All arguments to transform functions must be numeric (state: ${JSON.stringify({
@@ -446,7 +450,7 @@ export class Mat33 {
446
450
  }
447
451
  return argNumber;
448
452
  });
449
- return parsed.filter(n => n !== null);
453
+ return parsed.filter((n) => n !== null);
450
454
  };
451
455
  const keywordToAction = {
452
456
  matrix: (matrixData) => {
@@ -496,7 +500,7 @@ export class Mat33 {
496
500
  };
497
501
  // A command (\w+)
498
502
  // followed by a set of arguments ([ \t\n0-9eE.,\-%]+)
499
- const partRegex = /\s*(\w+)\s*\(([^)]*)\)/ig;
503
+ const partRegex = /\s*(\w+)\s*\(([^)]*)\)/gi;
500
504
  let match;
501
505
  let matrix = null;
502
506
  while ((match = partRegex.exec(cssString)) !== null) {
@@ -150,7 +150,7 @@ export interface Vec3 {
150
150
  map(fn: (component: number, index: number) => number): Vec3;
151
151
  asArray(): [number, number, number];
152
152
  /**
153
- * [fuzz] The maximum difference between two components for this and [other]
153
+ * @param tolerance The maximum difference between two components for this and [other]
154
154
  * to be considered equal.
155
155
  *
156
156
  * @example
@@ -200,12 +200,16 @@ declare class Vec2Impl implements Vec3 {
200
200
  toString(): string;
201
201
  }
202
202
  /**
203
- * A `Vec2` is a `Vec3` optimized for working in a plane. As such, they have an
203
+ * A `Vec2` is a {@link Vec3} optimized for working in a plane. `Vec2`s have an
204
204
  * always-zero `z` component.
205
205
  *
206
206
  * ```ts,runnable,console
207
207
  * import { Vec2 } from '@js-draw/math';
208
- * console.log(Vec2.of(1, 2));
208
+ *
209
+ * const v = Vec2.of(1, 2);
210
+ * console.log('a Vec2:', v);
211
+ * console.log('x component:', v.x);
212
+ * console.log('z component:', v.z);
209
213
  * ```
210
214
  */
211
215
  export declare namespace Vec2 {
@@ -240,6 +244,7 @@ export declare namespace Vec2 {
240
244
  /** The zero vector: A vector with x=0, y=0. */
241
245
  const zero: Vec2Impl;
242
246
  }
247
+ /** Contains static methods for constructing a {@link Vec3}. */
243
248
  export declare namespace Vec3 {
244
249
  /**
245
250
  * Construct a vector from three components.
@@ -248,11 +253,15 @@ export declare namespace Vec3 {
248
253
  * ```ts,runnable,console
249
254
  * import { Vec3 } from '@js-draw/math';
250
255
  * const v1 = Vec3.of(1, 2, 3);
256
+ * console.log(v1.plus(Vec3.of(0, 100, 0)));
251
257
  * ```
252
258
  */
253
259
  const of: (x: number, y: number, z: number) => Vec3;
260
+ /** A unit vector in the x direction (`[1, 0, 0]`). */
254
261
  const unitX: Vec2Impl;
262
+ /** A unit vector in the y direction (`[0, 1, 0]`). */
255
263
  const unitY: Vec2Impl;
264
+ /** The zero vector (`[0, 0, 0]`). */
256
265
  const zero: Vec2Impl;
257
266
  /** A vector of length 1 in the z direction. */
258
267
  const unitZ: Vec3;
package/dist/mjs/Vec3.mjs CHANGED
@@ -103,9 +103,9 @@ class Vec3Impl {
103
103
  return [this.x, this.y, this.z];
104
104
  }
105
105
  eq(other, fuzz = defaultEqlTolerance) {
106
- return (Math.abs(other.x - this.x) <= fuzz
107
- && Math.abs(other.y - this.y) <= fuzz
108
- && Math.abs(other.z - this.z) <= fuzz);
106
+ return (Math.abs(other.x - this.x) <= fuzz &&
107
+ Math.abs(other.y - this.y) <= fuzz &&
108
+ Math.abs(other.z - this.z) <= fuzz);
109
109
  }
110
110
  toString() {
111
111
  return `Vec(${this.x}, ${this.y}, ${this.z})`;
@@ -116,7 +116,9 @@ class Vec2Impl {
116
116
  this.x = x;
117
117
  this.y = y;
118
118
  }
119
- get z() { return 0; }
119
+ get z() {
120
+ return 0;
121
+ }
120
122
  get xy() {
121
123
  // Useful for APIs that behave differently if .z is present.
122
124
  return {
@@ -213,21 +215,25 @@ class Vec2Impl {
213
215
  return [this.x, this.y, 0];
214
216
  }
215
217
  eq(other, fuzz = defaultEqlTolerance) {
216
- return (Math.abs(other.x - this.x) <= fuzz
217
- && Math.abs(other.y - this.y) <= fuzz
218
- && Math.abs(other.z) <= fuzz);
218
+ return (Math.abs(other.x - this.x) <= fuzz &&
219
+ Math.abs(other.y - this.y) <= fuzz &&
220
+ Math.abs(other.z) <= fuzz);
219
221
  }
220
222
  toString() {
221
223
  return `Vec(${this.x}, ${this.y})`;
222
224
  }
223
225
  }
224
226
  /**
225
- * A `Vec2` is a `Vec3` optimized for working in a plane. As such, they have an
227
+ * A `Vec2` is a {@link Vec3} optimized for working in a plane. `Vec2`s have an
226
228
  * always-zero `z` component.
227
229
  *
228
230
  * ```ts,runnable,console
229
231
  * import { Vec2 } from '@js-draw/math';
230
- * console.log(Vec2.of(1, 2));
232
+ *
233
+ * const v = Vec2.of(1, 2);
234
+ * console.log('a Vec2:', v);
235
+ * console.log('x component:', v.x);
236
+ * console.log('z component:', v.z);
231
237
  * ```
232
238
  */
233
239
  export var Vec2;
@@ -264,6 +270,7 @@ export var Vec2;
264
270
  /** The zero vector: A vector with x=0, y=0. */
265
271
  Vec2.zero = Vec2.of(0, 0);
266
272
  })(Vec2 || (Vec2 = {}));
273
+ /** Contains static methods for constructing a {@link Vec3}. */
267
274
  export var Vec3;
268
275
  (function (Vec3) {
269
276
  /**
@@ -273,6 +280,7 @@ export var Vec3;
273
280
  * ```ts,runnable,console
274
281
  * import { Vec3 } from '@js-draw/math';
275
282
  * const v1 = Vec3.of(1, 2, 3);
283
+ * console.log(v1.plus(Vec3.of(0, 100, 0)));
276
284
  * ```
277
285
  */
278
286
  Vec3.of = (x, y, z) => {
@@ -283,8 +291,11 @@ export var Vec3;
283
291
  return new Vec3Impl(x, y, z);
284
292
  }
285
293
  };
294
+ /** A unit vector in the x direction (`[1, 0, 0]`). */
286
295
  Vec3.unitX = Vec2.unitX;
296
+ /** A unit vector in the y direction (`[0, 1, 0]`). */
287
297
  Vec3.unitY = Vec2.unitY;
298
+ /** The zero vector (`[0, 0, 0]`). */
288
299
  Vec3.zero = Vec2.zero;
289
300
  /** A vector of length 1 in the z direction. */
290
301
  Vec3.unitZ = Vec3.of(0, 0, 1);
package/dist/mjs/lib.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * This package contains general math utilities used by `js-draw`.
3
+ * These include 2D and 3D vectors, 2D paths, and 3x3 matrices.
4
+ *
2
5
  * ```ts,runnable,console
3
6
  * import { Vec2, Mat33, Rect2 } from '@js-draw/math';
4
7
  *
package/dist/mjs/lib.mjs CHANGED
@@ -1,4 +1,7 @@
1
1
  /**
2
+ * This package contains general math utilities used by `js-draw`.
3
+ * These include 2D and 3D vectors, 2D paths, and 3x3 matrices.
4
+ *
2
5
  * ```ts,runnable,console
3
6
  * import { Vec2, Mat33, Rect2 } from '@js-draw/math';
4
7
  *
@@ -29,8 +29,10 @@ export declare abstract class BezierJSWrapper extends Parameterized2DShape {
29
29
  * @returns the curve evaluated at `t`.
30
30
  */
31
31
  at(t: number): Point2;
32
+ /** @returns the curve's directional derivative at `t`. */
32
33
  derivativeAt(t: number): Point2;
33
34
  secondDerivativeAt(t: number): Point2;
35
+ /** @returns the [normal vector](https://en.wikipedia.org/wiki/Normal_(geometry)) to this curve at `t`. */
34
36
  normal(t: number): Vec2;
35
37
  normalAt(t: number): Vec2;
36
38
  tangentAt(t: number): Vec2;
@@ -34,7 +34,7 @@ export class BezierJSWrapper extends Parameterized2DShape {
34
34
  }
35
35
  getBezier() {
36
36
  if (!__classPrivateFieldGet(this, _BezierJSWrapper_bezierJs, "f")) {
37
- __classPrivateFieldSet(this, _BezierJSWrapper_bezierJs, new Bezier(this.getPoints().map(p => p.xy)), "f");
37
+ __classPrivateFieldSet(this, _BezierJSWrapper_bezierJs, new Bezier(this.getPoints().map((p) => p.xy)), "f");
38
38
  }
39
39
  return __classPrivateFieldGet(this, _BezierJSWrapper_bezierJs, "f");
40
40
  }
@@ -57,12 +57,14 @@ export class BezierJSWrapper extends Parameterized2DShape {
57
57
  at(t) {
58
58
  return Vec2.ofXY(this.getBezier().get(t));
59
59
  }
60
+ /** @returns the curve's directional derivative at `t`. */
60
61
  derivativeAt(t) {
61
62
  return Vec2.ofXY(this.getBezier().derivative(t));
62
63
  }
63
64
  secondDerivativeAt(t) {
64
65
  return Vec2.ofXY(this.getBezier().dderivative(t));
65
66
  }
67
+ /** @returns the [normal vector](https://en.wikipedia.org/wiki/Normal_(geometry)) to this curve at `t`. */
66
68
  normal(t) {
67
69
  return Vec2.ofXY(this.getBezier().normal(t));
68
70
  }
@@ -88,10 +90,12 @@ export class BezierJSWrapper extends Parameterized2DShape {
88
90
  const asLine = LineSegment2.ofSmallestContainingPoints(this.getPoints());
89
91
  if (asLine) {
90
92
  const intersection = asLine.intersectsLineSegment(line);
91
- return intersection.map(p => this.nearestPointTo(p).parameterValue);
93
+ return intersection.map((p) => this.nearestPointTo(p).parameterValue);
92
94
  }
93
95
  const bezier = this.getBezier();
94
- return bezier.intersects(line).map(t => {
96
+ return bezier
97
+ .intersects(line)
98
+ .map((t) => {
95
99
  // We're using the .intersects(line) function, which is documented
96
100
  // to always return numbers. However, to satisfy the type checker (and
97
101
  // possibly improperly-defined types),
@@ -100,12 +104,12 @@ export class BezierJSWrapper extends Parameterized2DShape {
100
104
  }
101
105
  const point = Vec2.ofXY(this.at(t));
102
106
  // Ensure that the intersection is on the line segment
103
- if (point.distanceTo(line.p1) > line.length
104
- || point.distanceTo(line.p2) > line.length) {
107
+ if (point.distanceTo(line.p1) > line.length || point.distanceTo(line.p2) > line.length) {
105
108
  return null;
106
109
  }
107
110
  return t;
108
- }).filter(entry => entry !== null);
111
+ })
112
+ .filter((entry) => entry !== null);
109
113
  }
110
114
  splitAt(t) {
111
115
  if (t <= 0 || t >= 1) {
@@ -114,8 +118,8 @@ export class BezierJSWrapper extends Parameterized2DShape {
114
118
  const bezier = this.getBezier();
115
119
  const split = bezier.split(t);
116
120
  return [
117
- new BezierJSWrapperImpl(split.left.points.map(point => Vec2.ofXY(point)), split.left),
118
- new BezierJSWrapperImpl(split.right.points.map(point => Vec2.ofXY(point)), split.right),
121
+ new BezierJSWrapperImpl(split.left.points.map((point) => Vec2.ofXY(point)), split.left),
122
+ new BezierJSWrapperImpl(split.right.points.map((point) => Vec2.ofXY(point)), split.right),
119
123
  ];
120
124
  }
121
125
  nearestPointTo(point) {
@@ -159,16 +163,19 @@ export class BezierJSWrapper extends Parameterized2DShape {
159
163
  const b = this.at(t);
160
164
  const bPrime = this.derivativeAt(t);
161
165
  const bPrimePrime = this.secondDerivativeAt(t);
162
- return (2 * bPrime.x * bPrime.x + 2 * b.x * bPrimePrime.x - 2 * point.x * bPrimePrime.x
163
- + 2 * bPrime.y * bPrime.y + 2 * b.y * bPrimePrime.y - 2 * point.y * bPrimePrime.y);
166
+ return (2 * bPrime.x * bPrime.x +
167
+ 2 * b.x * bPrimePrime.x -
168
+ 2 * point.x * bPrimePrime.x +
169
+ 2 * bPrime.y * bPrime.y +
170
+ 2 * b.y * bPrimePrime.y -
171
+ 2 * point.y * bPrimePrime.y);
164
172
  };
165
173
  // Because we're zeroing f'(t), we also need to be able to compute it:
166
174
  const derivativeAt = (t) => {
167
175
  // f'(t) = 2Bₓ(t)Bₓ'(t) - 2pₓBₓ'(t) + 2Bᵧ(t)Bᵧ'(t) - 2pᵧBᵧ'(t)
168
176
  const b = this.at(t);
169
177
  const bPrime = this.derivativeAt(t);
170
- return (2 * b.x * bPrime.x - 2 * point.x * bPrime.x
171
- + 2 * b.y * bPrime.y - 2 * point.y * bPrime.y);
178
+ return (2 * b.x * bPrime.x - 2 * point.x * bPrime.x + 2 * b.y * bPrime.y - 2 * point.y * bPrime.y);
172
179
  };
173
180
  const iterate = () => {
174
181
  const slope = secondDerivativeAt(t);
@@ -219,7 +226,9 @@ export class BezierJSWrapper extends Parameterized2DShape {
219
226
  return result;
220
227
  }
221
228
  toString() {
222
- return `Bézier(${this.getPoints().map(point => point.toString()).join(', ')})`;
229
+ return `Bézier(${this.getPoints()
230
+ .map((point) => point.toString())
231
+ .join(', ')})`;
223
232
  }
224
233
  }
225
234
  _BezierJSWrapper_bezierJs = new WeakMap();
@@ -40,7 +40,7 @@ export class LineSegment2 extends Parameterized2DShape {
40
40
  static ofSmallestContainingPoints(points) {
41
41
  if (points.length <= 1)
42
42
  return null;
43
- const sorted = [...points].sort((a, b) => a.x !== b.x ? a.x - b.x : a.y - b.y);
43
+ const sorted = [...points].sort((a, b) => (a.x !== b.x ? a.x - b.x : a.y - b.y));
44
44
  const line = new LineSegment2(sorted[0], sorted[sorted.length - 1]);
45
45
  for (const point of sorted) {
46
46
  if (!line.containsPoint(point)) {
@@ -90,10 +90,7 @@ export class LineSegment2 extends Parameterized2DShape {
90
90
  if (t <= 0 || t >= 1) {
91
91
  return [this];
92
92
  }
93
- return [
94
- new LineSegment2(this.point1, this.at(t)),
95
- new LineSegment2(this.at(t), this.point2),
96
- ];
93
+ return [new LineSegment2(this.point1, this.at(t)), new LineSegment2(this.at(t), this.point2)];
97
94
  }
98
95
  /**
99
96
  * Returns the intersection of this with another line segment.
@@ -143,18 +140,17 @@ export class LineSegment2 extends Parameterized2DShape {
143
140
  return null;
144
141
  }
145
142
  const xIntersect = this.point1.x;
146
- const yIntersect = (this.point1.x - other.point1.x) * other.direction.y / other.direction.x + other.point1.y;
143
+ const yIntersect = ((this.point1.x - other.point1.x) * other.direction.y) / other.direction.x + other.point1.y;
147
144
  resultPoint = Vec2.of(xIntersect, yIntersect);
148
145
  resultT = (yIntersect - this.point1.y) / this.direction.y;
149
146
  }
150
147
  else {
151
148
  // From above,
152
149
  // x = ((o₁ᵧ - o₂ᵧ)(d₁ₓd₂ₓ) + (d₂ᵧd₁ₓ)(o₂ₓ) - (d₁ᵧd₂ₓ)(o₁ₓ))/(d₂ᵧd₁ₓ - d₁ᵧd₂ₓ)
153
- const numerator = ((this.point1.y - other.point1.y) * this.direction.x * other.direction.x
154
- + this.direction.x * other.direction.y * other.point1.x
155
- - this.direction.y * other.direction.x * this.point1.x);
156
- const denominator = (other.direction.y * this.direction.x
157
- - this.direction.y * other.direction.x);
150
+ const numerator = (this.point1.y - other.point1.y) * this.direction.x * other.direction.x +
151
+ this.direction.x * other.direction.y * other.point1.x -
152
+ this.direction.y * other.direction.x * this.point1.x;
153
+ const denominator = other.direction.y * this.direction.x - this.direction.y * other.direction.x;
158
154
  // Avoid dividing by zero. It means there is no intersection
159
155
  if (denominator === 0) {
160
156
  return null;
@@ -170,10 +166,10 @@ export class LineSegment2 extends Parameterized2DShape {
170
166
  const resultToP2 = resultPoint.distanceTo(this.point2);
171
167
  const resultToP3 = resultPoint.distanceTo(other.point1);
172
168
  const resultToP4 = resultPoint.distanceTo(other.point2);
173
- if (resultToP1 > this.length
174
- || resultToP2 > this.length
175
- || resultToP3 > other.length
176
- || resultToP4 > other.length) {
169
+ if (resultToP1 > this.length ||
170
+ resultToP2 > this.length ||
171
+ resultToP3 > other.length ||
172
+ resultToP4 > other.length) {
177
173
  return null;
178
174
  }
179
175
  return {
@@ -258,8 +254,8 @@ export class LineSegment2 extends Parameterized2DShape {
258
254
  }
259
255
  const tolerance = options?.tolerance;
260
256
  const ignoreDirection = options?.ignoreDirection ?? true;
261
- return ((other.p1.eq(this.p1, tolerance) && other.p2.eq(this.p2, tolerance))
262
- || (ignoreDirection && other.p1.eq(this.p2, tolerance) && other.p2.eq(this.p1, tolerance)));
257
+ return ((other.p1.eq(this.p1, tolerance) && other.p2.eq(this.p2, tolerance)) ||
258
+ (ignoreDirection && other.p1.eq(this.p2, tolerance) && other.p2.eq(this.p1, tolerance)));
263
259
  }
264
260
  }
265
261
  export default LineSegment2;
@@ -7,7 +7,7 @@ import Abstract2DShape from './Abstract2DShape.mjs';
7
7
  */
8
8
  export class Parameterized2DShape extends Abstract2DShape {
9
9
  intersectsLineSegment(line) {
10
- return this.argIntersectsLineSegment(line).map(t => this.at(t));
10
+ return this.argIntersectsLineSegment(line).map((t) => this.at(t));
11
11
  }
12
12
  }
13
13
  export default Parameterized2DShape;
@@ -3,6 +3,7 @@ import Mat33 from '../Mat33';
3
3
  import Rect2 from './Rect2';
4
4
  import { Point2 } from '../Vec2';
5
5
  import Parameterized2DShape from './Parameterized2DShape';
6
+ /** Identifiers for different path commands. These commands can make up a {@link Path}. */
6
7
  export declare enum PathCommandType {
7
8
  LineTo = 0,
8
9
  MoveTo = 1,