@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
package/src/Color4.ts CHANGED
@@ -25,9 +25,8 @@ export class Color4 {
25
25
  public readonly b: number,
26
26
 
27
27
  /** Alpha/transparent component. ${\tt a} \in [0, 1]$. 0 = transparent */
28
- public readonly a: number
29
- ) {
30
- }
28
+ public readonly a: number,
29
+ ) {}
31
30
 
32
31
  /**
33
32
  * Create a color from red, green, blue components. The color is fully opaque (`a = 1.0`).
@@ -38,6 +37,10 @@ export class Color4 {
38
37
  return Color4.ofRGBA(red, green, blue, 1.0);
39
38
  }
40
39
 
40
+ /**
41
+ * Creates a color from red, green, blue, and transparency components. Each component should
42
+ * be in the range $[0, 1]$.
43
+ */
41
44
  public static ofRGBA(red: number, green: number, blue: number, alpha: number): Color4 {
42
45
  red = Math.max(0, Math.min(red, 1));
43
46
  green = Math.max(0, Math.min(green, 1));
@@ -47,6 +50,40 @@ export class Color4 {
47
50
  return new Color4(red, green, blue, alpha);
48
51
  }
49
52
 
53
+ /**
54
+ * Creates a color from an RGB (or RGBA) array.
55
+ *
56
+ * This is similar to {@link ofRGB} and {@link ofRGBA}, but, by default, takes values
57
+ * that range from 0 to 255.
58
+ *
59
+ * If the array values instead range from 0-1, pass `maxValue` as `1`.
60
+ */
61
+ public static fromRGBArray(
62
+ array: Uint8Array | Uint8ClampedArray | number[],
63
+ maxValue: number = 255,
64
+ ) {
65
+ const red = array[0];
66
+ const green = array[1] ?? red;
67
+ const blue = array[2] ?? red;
68
+
69
+ let alpha = 255;
70
+ if (3 < array.length) {
71
+ alpha = array[3];
72
+ }
73
+
74
+ return Color4.ofRGBA(red / maxValue, green / maxValue, blue / maxValue, alpha / maxValue);
75
+ }
76
+
77
+ /**
78
+ * Creates a `Color4` from a three or four-component hexadecimal
79
+ * [color string](https://en.wikipedia.org/wiki/Web_colors#Hex_triplet).
80
+ *
81
+ * Example:
82
+ * ```ts,runnable,console
83
+ * import { Color4 } from '@js-draw/math';
84
+ * console.log(Color4.fromHex('#ff0'));
85
+ * ```
86
+ */
50
87
  public static fromHex(hexString: string): Color4 {
51
88
  // Remove starting '#' (if present)
52
89
  hexString = (hexString.match(/^[#]?(.*)$/) ?? [])[1];
@@ -62,7 +99,7 @@ export class Color4 {
62
99
  const components = hexString.split('');
63
100
 
64
101
  // Convert to RRGGBBAA or RRGGBB format
65
- hexString = components.map(component => `${component}0`).join('');
102
+ hexString = components.map((component) => `${component}0`).join('');
66
103
  }
67
104
 
68
105
  if (hexString.length === 6) {
@@ -83,7 +120,7 @@ export class Color4 {
83
120
  return Color4.ofRGBA(components[0], components[1], components[2], components[3]);
84
121
  }
85
122
 
86
- /** Like fromHex, but can handle additional colors if an `HTMLCanvasElement` is available. */
123
+ /** Like {@link fromHex}, but can handle additional colors if an `HTMLCanvasElement` is available. */
87
124
  public static fromString(text: string): Color4 {
88
125
  if (text.startsWith('#')) {
89
126
  return Color4.fromHex(text);
@@ -108,14 +145,21 @@ export class Color4 {
108
145
 
109
146
  if (componentsList.length === 3) {
110
147
  return Color4.ofRGB(
111
- componentsList[0] / 255, componentsList[1] / 255, componentsList[2] / 255
148
+ componentsList[0] / 255,
149
+ componentsList[1] / 255,
150
+ componentsList[2] / 255,
112
151
  );
113
152
  } else if (componentsList.length === 4) {
114
153
  return Color4.ofRGBA(
115
- componentsList[0] / 255, componentsList[1] / 255, componentsList[2] / 255, componentsList[3]
154
+ componentsList[0] / 255,
155
+ componentsList[1] / 255,
156
+ componentsList[2] / 255,
157
+ componentsList[3],
116
158
  );
117
159
  } else {
118
- throw new Error(`RGB string, ${text}, has wrong number of components: ${componentsList.length}`);
160
+ throw new Error(
161
+ `RGB string, ${text}, has wrong number of components: ${componentsList.length}`,
162
+ );
119
163
  }
120
164
  }
121
165
 
@@ -145,7 +189,7 @@ export class Color4 {
145
189
  }
146
190
 
147
191
  /** @returns true if `this` and `other` are approximately equal. */
148
- public eq(other: Color4|null|undefined): boolean {
192
+ public eq(other: Color4 | null | undefined): boolean {
149
193
  if (other == null) {
150
194
  return false;
151
195
  }
@@ -202,7 +246,7 @@ export class Color4 {
202
246
  // - https://stackoverflow.com/a/9733420
203
247
 
204
248
  // Normalize the components, as per above
205
- const components = [ this.r, this.g, this.b ].map(component => {
249
+ const components = [this.r, this.g, this.b].map((component) => {
206
250
  if (component < 0.03928) {
207
251
  return component / 12.92;
208
252
  } else {
@@ -358,24 +402,23 @@ export class Color4 {
358
402
 
359
403
  let rgb;
360
404
  if (huePrime < 1) {
361
- rgb = [ chroma, secondLargestComponent, 0 ];
405
+ rgb = [chroma, secondLargestComponent, 0];
362
406
  } else if (huePrime < 2) {
363
- rgb = [ secondLargestComponent, chroma, 0 ];
407
+ rgb = [secondLargestComponent, chroma, 0];
364
408
  } else if (huePrime < 3) {
365
- rgb = [ 0, chroma, secondLargestComponent ];
409
+ rgb = [0, chroma, secondLargestComponent];
366
410
  } else if (huePrime < 4) {
367
- rgb = [ 0, secondLargestComponent, chroma ];
411
+ rgb = [0, secondLargestComponent, chroma];
368
412
  } else if (huePrime < 5) {
369
- rgb = [ secondLargestComponent, 0, chroma ];
413
+ rgb = [secondLargestComponent, 0, chroma];
370
414
  } else {
371
- rgb = [ chroma, 0, secondLargestComponent ];
415
+ rgb = [chroma, 0, secondLargestComponent];
372
416
  }
373
417
 
374
418
  const adjustment = value - chroma;
375
419
  return Color4.ofRGB(rgb[0] + adjustment, rgb[1] + adjustment, rgb[2] + adjustment);
376
420
  }
377
421
 
378
-
379
422
  /**
380
423
  * Equivalent to `ofRGB(rgb.x, rgb.y, rgb.z)`.
381
424
  *
@@ -385,7 +428,7 @@ export class Color4 {
385
428
  return Color4.ofRGBA(rgb.x, rgb.y, rgb.z, alpha ?? 1);
386
429
  }
387
430
 
388
- private hexString: string|null = null;
431
+ private hexString: string | null = null;
389
432
 
390
433
  /**
391
434
  * @returns a hexadecimal color string representation of `this`, in the form `#rrggbbaa`.
@@ -2,65 +2,51 @@ import Mat33 from './Mat33';
2
2
  import { Vec2 } from './Vec2';
3
3
 
4
4
  describe('Mat33.fromCSSMatrix', () => {
5
- it('should convert CSS matrix(...) strings to matricies', () => {
5
+ it('should convert CSS matrix(...) strings to matrices', () => {
6
6
  // From MDN:
7
7
  // ⎡ a c e ⎤
8
8
  // ⎢ b d f ⎥ = matrix(a,b,c,d,e,f)
9
9
  // ⎣ 0 0 1 ⎦
10
10
  const identity = Mat33.fromCSSMatrix('matrix(1, 0, 0, 1, 0, 0)');
11
11
  expect(identity).objEq(Mat33.identity);
12
- expect(Mat33.fromCSSMatrix('matrix(1, 2, 3, 4, 5, 6)')).objEq(new Mat33(
13
- 1, 3, 5,
14
- 2, 4, 6,
15
- 0, 0, 1,
16
- ));
17
- expect(Mat33.fromCSSMatrix('matrix(1e2, 2, 3, 4, 5, 6)')).objEq(new Mat33(
18
- 1e2, 3, 5,
19
- 2, 4, 6,
20
- 0, 0, 1,
21
- ));
22
- expect(Mat33.fromCSSMatrix('matrix(1.6, 2, .3, 4, 5, 6)')).objEq(new Mat33(
23
- 1.6, .3, 5,
24
- 2, 4, 6,
25
- 0, 0, 1,
26
- ));
27
- expect(Mat33.fromCSSMatrix('matrix(-1, 2, 3.E-2, 4, -5.123, -6.5)')).objEq(new Mat33(
28
- -1, 0.03, -5.123,
29
- 2, 4, -6.5,
30
- 0, 0, 1,
31
- ));
32
- expect(Mat33.fromCSSMatrix('matrix(1.6,\n\t2, .3, 4, 5, 6)')).objEq(new Mat33(
33
- 1.6, .3, 5,
34
- 2, 4, 6,
35
- 0, 0, 1,
36
- ));
37
- expect(Mat33.fromCSSMatrix('matrix(1.6,2, .3E-2, 4, 5, 6)')).objEq(new Mat33(
38
- 1.6, 3e-3, 5,
39
- 2, 4, 6,
40
- 0, 0, 1,
41
- ));
42
- expect(Mat33.fromCSSMatrix('matrix(-1, 2e6, 3E-2,-5.123, -6.5e-1, 0.01)')).objEq(new Mat33(
43
- -1, 3E-2, -6.5e-1,
44
- 2e6, -5.123, 0.01,
45
- 0, 0, 1,
46
- ));
12
+ expect(Mat33.fromCSSMatrix('matrix(1, 2, 3, 4, 5, 6)')).objEq(
13
+ new Mat33(1, 3, 5, 2, 4, 6, 0, 0, 1),
14
+ );
15
+ expect(Mat33.fromCSSMatrix('matrix(1e2, 2, 3, 4, 5, 6)')).objEq(
16
+ new Mat33(1e2, 3, 5, 2, 4, 6, 0, 0, 1),
17
+ );
18
+ expect(Mat33.fromCSSMatrix('matrix(1.6, 2, .3, 4, 5, 6)')).objEq(
19
+ new Mat33(1.6, 0.3, 5, 2, 4, 6, 0, 0, 1),
20
+ );
21
+ expect(Mat33.fromCSSMatrix('matrix(-1, 2, 3.E-2, 4, -5.123, -6.5)')).objEq(
22
+ new Mat33(-1, 0.03, -5.123, 2, 4, -6.5, 0, 0, 1),
23
+ );
24
+ expect(Mat33.fromCSSMatrix('matrix(1.6,\n\t2, .3, 4, 5, 6)')).objEq(
25
+ new Mat33(1.6, 0.3, 5, 2, 4, 6, 0, 0, 1),
26
+ );
27
+ expect(Mat33.fromCSSMatrix('matrix(1.6,2, .3E-2, 4, 5, 6)')).objEq(
28
+ new Mat33(1.6, 3e-3, 5, 2, 4, 6, 0, 0, 1),
29
+ );
30
+ expect(Mat33.fromCSSMatrix('matrix(-1, 2e6, 3E-2,-5.123, -6.5e-1, 0.01)')).objEq(
31
+ new Mat33(-1, 3e-2, -6.5e-1, 2e6, -5.123, 0.01, 0, 0, 1),
32
+ );
47
33
  });
48
34
 
49
35
  it('should convert multi-matrix arguments into a single CSS matrix', () => {
50
36
  const identity = Mat33.fromCSSMatrix('matrix(1, 0, 0, 1, 0, 0) matrix(1, 0, 0, 1, 0, 0)');
51
37
  expect(identity).objEq(Mat33.identity);
52
38
 
53
- expect(Mat33.fromCSSMatrix('matrix(1, 0, 0, 1, 0, 0) matrix(1, 2, 3, 4, 5, 6) matrix(1, 0, 0, 1, 0, 0)')).objEq(new Mat33(
54
- 1, 3, 5,
55
- 2, 4, 6,
56
- 0, 0, 1,
57
- ));
39
+ expect(
40
+ Mat33.fromCSSMatrix(
41
+ 'matrix(1, 0, 0, 1, 0, 0) matrix(1, 2, 3, 4, 5, 6) matrix(1, 0, 0, 1, 0, 0)',
42
+ ),
43
+ ).objEq(new Mat33(1, 3, 5, 2, 4, 6, 0, 0, 1));
58
44
 
59
- expect(Mat33.fromCSSMatrix('matrix(2,\n\t 0, 0, 2, 0, 0) matrix(1, 2, 3, 4, 5, 6) matrix(1, 0, 0, 1, 0, 0)')).objEq(new Mat33(
60
- 2, 6, 10,
61
- 4, 8, 12,
62
- 0, 0, 1,
63
- ));
45
+ expect(
46
+ Mat33.fromCSSMatrix(
47
+ 'matrix(2,\n\t 0, 0, 2, 0, 0) matrix(1, 2, 3, 4, 5, 6) matrix(1, 0, 0, 1, 0, 0)',
48
+ ),
49
+ ).objEq(new Mat33(2, 6, 10, 4, 8, 12, 0, 0, 1));
64
50
  });
65
51
 
66
52
  it('should convert scale()s with a single argument', () => {
package/src/Mat33.test.ts CHANGED
@@ -2,76 +2,44 @@ import Mat33 from './Mat33';
2
2
  import { Point2, Vec2 } from './Vec2';
3
3
  import Vec3 from './Vec3';
4
4
 
5
-
6
5
  describe('Mat33 tests', () => {
7
6
  it('equality', () => {
8
7
  expect(Mat33.identity).objEq(Mat33.identity);
9
- expect(new Mat33(
10
- 0.1, 0.2, 0.3,
11
- 0.4, 0.5, 0.6,
12
- 0.7, 0.8, -0.9
13
- )).objEq(new Mat33(
14
- 0.2, 0.1, 0.4,
15
- 0.5, 0.5, 0.7,
16
- 0.7, 0.8, -0.9
17
- ), 0.2);
8
+ expect(new Mat33(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, -0.9)).objEq(
9
+ new Mat33(0.2, 0.1, 0.4, 0.5, 0.5, 0.7, 0.7, 0.8, -0.9),
10
+ 0.2,
11
+ );
18
12
  });
19
13
 
20
14
  it('transposition', () => {
21
15
  expect(Mat33.identity.transposed()).objEq(Mat33.identity);
22
- expect(new Mat33(
23
- 1, 2, 0,
24
- 0, 0, 0,
25
- 0, 1, 0
26
- ).transposed()).objEq(new Mat33(
27
- 1, 0, 0,
28
- 2, 0, 1,
29
- 0, 0, 0
30
- ));
16
+ expect(new Mat33(1, 2, 0, 0, 0, 0, 0, 1, 0).transposed()).objEq(
17
+ new Mat33(1, 0, 0, 2, 0, 1, 0, 0, 0),
18
+ );
31
19
  });
32
20
 
33
21
  it('multiplication', () => {
34
- const M = new Mat33(
35
- 1, 2, 3,
36
- 4, 5, 6,
37
- 7, 8, 9
38
- );
22
+ const M = new Mat33(1, 2, 3, 4, 5, 6, 7, 8, 9);
39
23
 
40
24
  expect(Mat33.identity.rightMul(Mat33.identity)).objEq(Mat33.identity);
41
25
  expect(M.rightMul(Mat33.identity)).objEq(M);
42
- expect(M.rightMul(new Mat33(
43
- 1, 0, 0,
44
- 0, 2, 0,
45
- 0, 0, 1
46
- ))).objEq(new Mat33(
47
- 1, 4, 3,
48
- 4, 10, 6,
49
- 7, 16, 9
50
- ));
51
- expect(M.rightMul(new Mat33(
52
- 2, 0, 1,
53
- 0, 1, 0,
54
- 0, 0, 3
55
- ))).objEq(new Mat33(
56
- 2, 2, 10,
57
- 8, 5, 22,
58
- 14, 8, 34
59
- ));
26
+ expect(M.rightMul(new Mat33(1, 0, 0, 0, 2, 0, 0, 0, 1))).objEq(
27
+ new Mat33(1, 4, 3, 4, 10, 6, 7, 16, 9),
28
+ );
29
+ expect(M.rightMul(new Mat33(2, 0, 1, 0, 1, 0, 0, 0, 3))).objEq(
30
+ new Mat33(2, 2, 10, 8, 5, 22, 14, 8, 34),
31
+ );
60
32
  });
61
33
 
62
34
  it('the inverse of the identity matrix should be the identity matrix', () => {
63
35
  const fuzz = 0.01;
64
36
  expect(Mat33.identity.inverse()).objEq(Mat33.identity, fuzz);
65
37
 
66
- const M = new Mat33(
67
- 1, 2, 3,
68
- 4, 1, 0,
69
- 2, 3, 0
70
- );
38
+ const M = new Mat33(1, 2, 3, 4, 1, 0, 2, 3, 0);
71
39
  expect(M.inverse().rightMul(M)).objEq(Mat33.identity, fuzz);
72
40
  });
73
41
 
74
- it('90 degree z-rotation matricies should rotate 90 degrees counter clockwise', () => {
42
+ it('90 degree z-rotation matrices should rotate 90 degrees counter clockwise', () => {
75
43
  const fuzz = 0.001;
76
44
 
77
45
  const M = Mat33.zRotation(Math.PI / 2);
@@ -80,19 +48,19 @@ describe('Mat33 tests', () => {
80
48
  expect(M.transformVec2(rotated)).objEq(Vec2.unitX.times(-1), fuzz);
81
49
  });
82
50
 
83
- it('z-rotation matricies should preserve the given origin', () => {
51
+ it('z-rotation matrices should preserve the given origin', () => {
84
52
  const testPairs: Array<[number, Vec2]> = [
85
- [ Math.PI / 2, Vec2.zero ],
86
- [ -Math.PI / 2, Vec2.zero ],
87
- [ -Math.PI / 2, Vec2.of(10, 10) ],
53
+ [Math.PI / 2, Vec2.zero],
54
+ [-Math.PI / 2, Vec2.zero],
55
+ [-Math.PI / 2, Vec2.of(10, 10)],
88
56
  ];
89
57
 
90
- for (const [ angle, center ] of testPairs) {
58
+ for (const [angle, center] of testPairs) {
91
59
  expect(Mat33.zRotation(angle, center).transformVec2(center)).objEq(center);
92
60
  }
93
61
  });
94
62
 
95
- it('translation matricies should translate Vec2s', () => {
63
+ it('translation matrices should translate Vec2s', () => {
96
64
  const fuzz = 0.01;
97
65
 
98
66
  const M = Mat33.translation(Vec2.of(1, -4));
@@ -100,7 +68,7 @@ describe('Mat33 tests', () => {
100
68
  expect(M.transformVec2(Vec2.of(-1, 3))).objEq(Vec2.of(0, -1), fuzz);
101
69
  });
102
70
 
103
- it('scaling matricies should scale about the provided center', () => {
71
+ it('scaling matrices should scale about the provided center', () => {
104
72
  const fuzz = 0.01;
105
73
 
106
74
  const center = Vec2.of(1, -4);
@@ -109,29 +77,29 @@ describe('Mat33 tests', () => {
109
77
  expect(M.transformVec2(Vec2.of(0, 0))).objEq(Vec2.of(-1, 4), fuzz);
110
78
  });
111
79
 
112
- it('calling inverse on singular matricies should result in the identity matrix', () => {
80
+ it('calling inverse on singular matrices should result in the identity matrix', () => {
113
81
  const fuzz = 0.001;
114
- const singularMat = Mat33.ofRows(
115
- Vec3.of(0, 0, 1),
116
- Vec3.of(0, 1, 0),
117
- Vec3.of(0, 1, 1)
118
- );
82
+ const singularMat = Mat33.ofRows(Vec3.of(0, 0, 1), Vec3.of(0, 1, 0), Vec3.of(0, 1, 1));
119
83
  expect(singularMat.invertable()).toBe(false);
120
84
  expect(singularMat.inverse()).objEq(Mat33.identity, fuzz);
121
85
  });
122
86
 
123
- it('z-rotation matricies should be invertable', () => {
87
+ it('z-rotation matrices should be invertable', () => {
124
88
  const fuzz = 0.01;
125
89
  const M = Mat33.zRotation(-0.2617993877991494, Vec2.of(481, 329.5));
126
- expect(
127
- M.inverse().transformVec2(M.transformVec2(Vec2.unitX))
128
- ).objEq(Vec2.unitX, fuzz);
90
+ expect(M.inverse().transformVec2(M.transformVec2(Vec2.unitX))).objEq(Vec2.unitX, fuzz);
129
91
  expect(M.invertable());
130
92
 
131
93
  const starterTransform = new Mat33(
132
- -0.2588190451025205, -0.9659258262890688, 923.7645204565603,
133
- 0.9659258262890688, -0.2588190451025205, -49.829447083761465,
134
- 0, 0, 1
94
+ -0.2588190451025205,
95
+ -0.9659258262890688,
96
+ 923.7645204565603,
97
+ 0.9659258262890688,
98
+ -0.2588190451025205,
99
+ -49.829447083761465,
100
+ 0,
101
+ 0,
102
+ 1,
135
103
  );
136
104
  expect(starterTransform.invertable()).toBe(true);
137
105
 
@@ -139,32 +107,32 @@ describe('Mat33 tests', () => {
139
107
  const fullTransformInverse = fullTransform.inverse();
140
108
  expect(fullTransform.invertable()).toBe(true);
141
109
 
142
- expect(
143
- fullTransformInverse.rightMul(fullTransform)
144
- ).objEq(Mat33.identity, fuzz);
110
+ expect(fullTransformInverse.rightMul(fullTransform)).objEq(Mat33.identity, fuzz);
145
111
 
146
- expect(
147
- fullTransform.transformVec2(fullTransformInverse.transformVec2(Vec2.unitX))
148
- ).objEq(Vec2.unitX, fuzz);
112
+ expect(fullTransform.transformVec2(fullTransformInverse.transformVec2(Vec2.unitX))).objEq(
113
+ Vec2.unitX,
114
+ fuzz,
115
+ );
149
116
 
150
- expect(
151
- fullTransformInverse.transformVec2(fullTransform.transformVec2(Vec2.unitX))
152
- ).objEq(Vec2.unitX, fuzz);
117
+ expect(fullTransformInverse.transformVec2(fullTransform.transformVec2(Vec2.unitX))).objEq(
118
+ Vec2.unitX,
119
+ fuzz,
120
+ );
153
121
  });
154
122
 
155
123
  it('z-rotation matrix inverses should undo the z-rotation', () => {
156
- const testCases: Array<[ number, Point2 ]> = [
157
- [ Math.PI / 2, Vec2.zero ],
158
- [ Math.PI, Vec2.of(1, 1) ],
159
- [ -Math.PI, Vec2.of(1, 1) ],
160
- [ -Math.PI * 2, Vec2.of(1, 1) ],
161
- [ -Math.PI * 2, Vec2.of(123, 456) ],
162
- [ -Math.PI / 4, Vec2.of(123, 456) ],
163
- [ 0.1, Vec2.of(1, 2) ],
124
+ const testCases: Array<[number, Point2]> = [
125
+ [Math.PI / 2, Vec2.zero],
126
+ [Math.PI, Vec2.of(1, 1)],
127
+ [-Math.PI, Vec2.of(1, 1)],
128
+ [-Math.PI * 2, Vec2.of(1, 1)],
129
+ [-Math.PI * 2, Vec2.of(123, 456)],
130
+ [-Math.PI / 4, Vec2.of(123, 456)],
131
+ [0.1, Vec2.of(1, 2)],
164
132
  ];
165
133
 
166
134
  const fuzz = 0.00001;
167
- for (const [ angle, center ] of testCases) {
135
+ for (const [angle, center] of testCases) {
168
136
  const mat = Mat33.zRotation(angle, center);
169
137
  expect(mat.inverse().rightMul(mat)).objEq(Mat33.identity, fuzz);
170
138
  expect(mat.rightMul(mat.inverse())).objEq(Mat33.identity, fuzz);
@@ -172,30 +140,24 @@ describe('Mat33 tests', () => {
172
140
  });
173
141
 
174
142
  it('z-rotation should preserve given origin', () => {
175
- const testCases: Array<[ number, Point2 ]> = [
176
- [ 6.205048847547065, Vec2.of(75.16363373235318, 104.29870408043762) ],
177
- [ 1.234, Vec2.of(-56, 789) ],
178
- [ -Math.PI, Vec2.of(-56, 789) ],
179
- [ -Math.PI / 2, Vec2.of(-0.001, 1.0002) ],
143
+ const testCases: Array<[number, Point2]> = [
144
+ [6.205048847547065, Vec2.of(75.16363373235318, 104.29870408043762)],
145
+ [1.234, Vec2.of(-56, 789)],
146
+ [-Math.PI, Vec2.of(-56, 789)],
147
+ [-Math.PI / 2, Vec2.of(-0.001, 1.0002)],
180
148
  ];
181
149
 
182
150
  for (const [angle, rotationOrigin] of testCases) {
183
- expect(Mat33.zRotation(angle, rotationOrigin).transformVec2(rotationOrigin)).objEq(rotationOrigin);
151
+ expect(Mat33.zRotation(angle, rotationOrigin).transformVec2(rotationOrigin)).objEq(
152
+ rotationOrigin,
153
+ );
184
154
  }
185
155
  });
186
156
 
187
157
  it('should correctly apply a mapping to all components', () => {
188
158
  expect(
189
- new Mat33(
190
- 1, 2, 3,
191
- 4, 5, 6,
192
- 7, 8, 9,
193
- ).mapEntries(component => component - 1)
194
- ).toMatchObject(new Mat33(
195
- 0, 1, 2,
196
- 3, 4, 5,
197
- 6, 7, 8,
198
- ));
159
+ new Mat33(1, 2, 3, 4, 5, 6, 7, 8, 9).mapEntries((component) => component - 1),
160
+ ).toMatchObject(new Mat33(0, 1, 2, 3, 4, 5, 6, 7, 8));
199
161
  });
200
162
 
201
163
  it('getColumn should return the given column index', () => {