@benev/math 0.2.0-4 → 0.3.0-2

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.
Files changed (165) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -3
  3. package/package.json +5 -5
  4. package/s/{tools → core}/circular.ts +1 -1
  5. package/s/core/quat.ts +12 -8
  6. package/s/{tools → core}/scalar.ts +2 -2
  7. package/s/core/vec2.ts +24 -20
  8. package/s/core/vec3.ts +24 -20
  9. package/s/core/vec4.ts +6 -2
  10. package/s/index.ts +5 -10
  11. package/s/optimizers/hash-map.ts +2 -2
  12. package/s/optimizers/zen.ts +4 -4
  13. package/s/physics/2d/collide2d.barrel.ts +3 -0
  14. package/s/physics/2d/collide2d.ts +2 -2
  15. package/s/physics/2d/intersect2d.barrel.ts +3 -0
  16. package/s/physics/2d/intersect2d.ts +11 -11
  17. package/s/physics/index.ts +4 -0
  18. package/s/shapes/2d/circle.ts +3 -3
  19. package/s/shapes/2d/rect.ts +7 -7
  20. package/s/shapes/3d/box.ts +10 -10
  21. package/s/shapes/3d/segment.ts +8 -8
  22. package/s/shapes/index.ts +7 -0
  23. package/s/tools/angles.ts +26 -26
  24. package/s/tools/make-noise.ts +13 -0
  25. package/s/tools/spline.ts +30 -36
  26. package/x/concepts/angles.d.ts +29 -0
  27. package/x/concepts/angles.js +62 -0
  28. package/x/concepts/angles.js.map +1 -0
  29. package/x/concepts/circular.d.ts +17 -0
  30. package/x/concepts/circular.js +70 -0
  31. package/x/concepts/circular.js.map +1 -0
  32. package/x/concepts/noise.d.ts +9 -0
  33. package/x/concepts/noise.js +20 -0
  34. package/x/concepts/noise.js.map +1 -0
  35. package/x/concepts/quat.d.ts +35 -0
  36. package/x/concepts/quat.js +110 -0
  37. package/x/concepts/quat.js.map +1 -0
  38. package/x/concepts/randy.d.ts +39 -0
  39. package/x/concepts/randy.js +95 -0
  40. package/x/concepts/randy.js.map +1 -0
  41. package/x/concepts/scalar.d.ts +51 -0
  42. package/x/concepts/scalar.js +219 -0
  43. package/x/concepts/scalar.js.map +1 -0
  44. package/x/concepts/spline.d.ts +9 -0
  45. package/x/concepts/spline.js +59 -0
  46. package/x/concepts/spline.js.map +1 -0
  47. package/x/concepts/vec2.d.ts +114 -0
  48. package/x/concepts/vec2.js +314 -0
  49. package/x/concepts/vec2.js.map +1 -0
  50. package/x/concepts/vec3.d.ts +117 -0
  51. package/x/concepts/vec3.js +357 -0
  52. package/x/concepts/vec3.js.map +1 -0
  53. package/x/concepts/vec4.d.ts +21 -0
  54. package/x/concepts/vec4.js +62 -0
  55. package/x/concepts/vec4.js.map +1 -0
  56. package/x/core/circular.d.ts +17 -0
  57. package/x/core/circular.js +71 -0
  58. package/x/core/circular.js.map +1 -0
  59. package/x/core/quat.d.ts +4 -3
  60. package/x/core/quat.js +11 -8
  61. package/x/core/quat.js.map +1 -1
  62. package/x/core/scalar.d.ts +51 -0
  63. package/x/core/scalar.js +219 -0
  64. package/x/core/scalar.js.map +1 -0
  65. package/x/core/vec2.d.ts +11 -10
  66. package/x/core/vec2.js +23 -20
  67. package/x/core/vec2.js.map +1 -1
  68. package/x/core/vec3.d.ts +11 -10
  69. package/x/core/vec3.js +23 -20
  70. package/x/core/vec3.js.map +1 -1
  71. package/x/core/vec4.d.ts +2 -1
  72. package/x/core/vec4.js +5 -2
  73. package/x/core/vec4.js.map +1 -1
  74. package/x/helpers/angles.d.ts +19 -0
  75. package/x/helpers/angles.js +41 -0
  76. package/x/helpers/angles.js.map +1 -0
  77. package/x/helpers/circular.d.ts +17 -0
  78. package/x/helpers/circular.js +71 -0
  79. package/x/helpers/circular.js.map +1 -0
  80. package/x/helpers/noise.d.ts +9 -0
  81. package/x/helpers/noise.js +20 -0
  82. package/x/helpers/noise.js.map +1 -0
  83. package/x/helpers/randy.d.ts +31 -0
  84. package/x/helpers/randy.js +85 -0
  85. package/x/helpers/randy.js.map +1 -0
  86. package/x/helpers/scalar.d.ts +51 -0
  87. package/x/helpers/scalar.js +219 -0
  88. package/x/helpers/scalar.js.map +1 -0
  89. package/x/helpers/spline.d.ts +9 -0
  90. package/x/helpers/spline.js +61 -0
  91. package/x/helpers/spline.js.map +1 -0
  92. package/x/importmap.json +7 -0
  93. package/x/index.d.ts +4 -10
  94. package/x/index.js +4 -10
  95. package/x/index.js.map +1 -1
  96. package/x/optimizers/hash-map.js +2 -2
  97. package/x/optimizers/zen.js +4 -4
  98. package/x/optimizers/zen.js.map +1 -1
  99. package/x/physics/2d/collide2d.barrel.d.ts +1 -0
  100. package/x/physics/2d/collide2d.barrel.js +2 -0
  101. package/x/physics/2d/collide2d.barrel.js.map +1 -0
  102. package/x/physics/2d/collide2d.js +2 -2
  103. package/x/physics/2d/collide2d.js.map +1 -1
  104. package/x/physics/2d/intersect2d.barrel.d.ts +1 -0
  105. package/x/physics/2d/intersect2d.barrel.js +2 -0
  106. package/x/physics/2d/intersect2d.barrel.js.map +1 -0
  107. package/x/physics/2d/intersect2d.d.ts +3 -3
  108. package/x/physics/2d/intersect2d.js +11 -11
  109. package/x/physics/2d/intersect2d.js.map +1 -1
  110. package/x/physics/index.d.ts +2 -0
  111. package/x/physics/index.js +3 -0
  112. package/x/physics/index.js.map +1 -0
  113. package/x/primitives/circular.d.ts +17 -0
  114. package/x/primitives/circular.js +70 -0
  115. package/x/primitives/circular.js.map +1 -0
  116. package/x/primitives/quat.d.ts +35 -0
  117. package/x/primitives/quat.js +110 -0
  118. package/x/primitives/quat.js.map +1 -0
  119. package/x/primitives/scalar.d.ts +51 -0
  120. package/x/primitives/scalar.js +219 -0
  121. package/x/primitives/scalar.js.map +1 -0
  122. package/x/primitives/vec2.d.ts +114 -0
  123. package/x/primitives/vec2.js +319 -0
  124. package/x/primitives/vec2.js.map +1 -0
  125. package/x/primitives/vec3.d.ts +117 -0
  126. package/x/primitives/vec3.js +363 -0
  127. package/x/primitives/vec3.js.map +1 -0
  128. package/x/primitives/vec4.d.ts +21 -0
  129. package/x/primitives/vec4.js +62 -0
  130. package/x/primitives/vec4.js.map +1 -0
  131. package/x/shapes/2d/circle.js +3 -3
  132. package/x/shapes/2d/circle.js.map +1 -1
  133. package/x/shapes/2d/rect.js +7 -7
  134. package/x/shapes/2d/rect.js.map +1 -1
  135. package/x/shapes/3d/box.js +10 -10
  136. package/x/shapes/3d/box.js.map +1 -1
  137. package/x/shapes/3d/segment.js +7 -7
  138. package/x/shapes/3d/segment.js.map +1 -1
  139. package/x/shapes/index.d.ts +4 -0
  140. package/x/shapes/index.js +5 -0
  141. package/x/shapes/index.js.map +1 -0
  142. package/x/tools/angles.d.ts +22 -13
  143. package/x/tools/angles.js +27 -29
  144. package/x/tools/angles.js.map +1 -1
  145. package/x/tools/spline.d.ts +2 -4
  146. package/x/tools/spline.js +20 -26
  147. package/x/tools/spline.js.map +1 -1
  148. package/x/utils/angles.d.ts +19 -0
  149. package/x/utils/angles.js +41 -0
  150. package/x/utils/angles.js.map +1 -0
  151. package/x/utils/circular.d.ts +17 -0
  152. package/x/utils/circular.js +70 -0
  153. package/x/utils/circular.js.map +1 -0
  154. package/x/utils/noise.d.ts +9 -0
  155. package/x/utils/noise.js +20 -0
  156. package/x/utils/noise.js.map +1 -0
  157. package/x/utils/randy.d.ts +31 -0
  158. package/x/utils/randy.js +85 -0
  159. package/x/utils/randy.js.map +1 -0
  160. package/x/utils/scalar.d.ts +51 -0
  161. package/x/utils/scalar.js +219 -0
  162. package/x/utils/scalar.js.map +1 -0
  163. package/x/utils/spline.d.ts +9 -0
  164. package/x/utils/spline.js +61 -0
  165. package/x/utils/spline.js.map +1 -0
@@ -6,30 +6,30 @@ export class Segment {
6
6
  this.end = end;
7
7
  }
8
8
  vector() {
9
- return this.end.clone().subtract(this.start);
9
+ return this.end.dup().sub(this.start);
10
10
  }
11
11
  length() {
12
12
  return this.start.distance(this.end);
13
13
  }
14
14
  center() {
15
- return this.start.clone()
15
+ return this.start.dup()
16
16
  .add(this.end)
17
17
  .half();
18
18
  }
19
19
  clone() {
20
- return new Segment(this.start.clone(), this.end.clone());
20
+ return new Segment(this.start.dup(), this.end.dup());
21
21
  }
22
22
  fromStart(length) {
23
23
  const direction = this.vector().normalize();
24
- return this.start.clone().add(direction.multiplyBy(length));
24
+ return this.start.dup().add(direction.mulBy(length));
25
25
  }
26
26
  point(fraction) {
27
- return this.start.clone().add(this.vector().multiplyBy(fraction));
27
+ return this.start.dup().add(this.vector().mulBy(fraction));
28
28
  }
29
29
  scale(fraction) {
30
30
  const { center } = this;
31
- const newHalfVector = this.vector().multiplyBy(fraction / 2);
32
- this.start.set(center().subtract(newHalfVector));
31
+ const newHalfVector = this.vector().mulBy(fraction / 2);
32
+ this.start.set(center().sub(newHalfVector));
33
33
  this.end.set(center().add(newHalfVector));
34
34
  return this;
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"segment.js","sourceRoot":"","sources":["../../../s/shapes/3d/segment.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,OAAO;IAEX;IACA;IAFR,YACQ,KAAW,EACX,GAAS;QADT,UAAK,GAAL,KAAK,CAAM;QACX,QAAG,GAAH,GAAG,CAAM;IACd,CAAC;IAEJ,MAAM;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrC,CAAC;IAED,MAAM;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;aACvB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;aACb,IAAI,EAAE,CAAA;IACT,CAAC;IAED,KAAK;QACJ,OAAO,IAAI,OAAO,CACjB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAClB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAChB,CAAA;IACF,CAAC;IAED,SAAS,CAAC,MAAc;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAA;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,KAAK,CAAC,QAAgB;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,QAAgB;QACrB,MAAM,EAAC,MAAM,EAAC,GAAG,IAAI,CAAA;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;QAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAA;QAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAA;QACzC,OAAO,IAAI,CAAA;IACZ,CAAC;CACD"}
1
+ {"version":3,"file":"segment.js","sourceRoot":"","sources":["../../../s/shapes/3d/segment.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,OAAO;IAEX;IACA;IAFR,YACQ,KAAW,EACX,GAAS;QADT,UAAK,GAAL,KAAK,CAAM;QACX,QAAG,GAAH,GAAG,CAAM;IACd,CAAC;IAEJ,MAAM;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC;IAED,MAAM;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrC,CAAC;IAED,MAAM;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;aACrB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;aACb,IAAI,EAAE,CAAA;IACT,CAAC;IAED,KAAK;QACJ,OAAO,IAAI,OAAO,CACjB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAChB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CACd,CAAA;IACF,CAAC;IAED,SAAS,CAAC,MAAc;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,CAAA;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,QAAgB;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,QAAgB;QACrB,MAAM,EAAC,MAAM,EAAC,GAAG,IAAI,CAAA;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;QACvD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAA;QAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAA;QACzC,OAAO,IAAI,CAAA;IACZ,CAAC;CACD"}
@@ -0,0 +1,4 @@
1
+ export * from "./2d/index.js";
2
+ export * as shapes2d from "./2d/index.js";
3
+ export * from "./3d/index.js";
4
+ export * as shapes3d from "./3d/index.js";
@@ -0,0 +1,5 @@
1
+ export * from "./2d/index.js";
2
+ export * as shapes2d from "./2d/index.js";
3
+ export * from "./3d/index.js";
4
+ export * as shapes3d from "./3d/index.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/shapes/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAA;AAC7B,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC,cAAc,eAAe,CAAA;AAC7B,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
@@ -1,19 +1,28 @@
1
- export declare const Radians: {
1
+ export declare const pi: number;
2
+ /** basic unit for measuring rotations */
3
+ export declare const radians: {
2
4
  circle: number;
3
- halfcircle: number;
5
+ halfCircle: number;
4
6
  toDegrees(r: number): number;
5
7
  toArcseconds(r: number): number;
6
8
  toTurns(r: number): number;
7
9
  circleDistance(radiansA: number, radiansB: number): number;
8
10
  };
9
- export declare const Turns: {
10
- toRadians(t: number): number;
11
- toDegrees(t: number): number;
12
- };
13
- export declare const Arcseconds: {
14
- toRadians(a: number): number;
15
- };
16
- export declare const Degrees: {
17
- toRadians(d: number): number;
18
- toTurns(d: number): number;
19
- };
11
+ /** convert turns to radians */
12
+ export declare function turns(t: number): number;
13
+ export declare namespace turns {
14
+ var toRadians: typeof turns;
15
+ var toDegrees: (t: number) => number;
16
+ }
17
+ /** convert arcseconds to radians */
18
+ export declare function arcseconds(a: number): number;
19
+ export declare namespace arcseconds {
20
+ var toRadians: typeof arcseconds;
21
+ var toDegrees: (a: number) => number;
22
+ }
23
+ /** convert degrees to radians */
24
+ export declare function degrees(d: number): number;
25
+ export declare namespace degrees {
26
+ var toRadians: typeof degrees;
27
+ var toTurns: (d: number) => number;
28
+ }
package/x/tools/angles.js CHANGED
@@ -1,41 +1,39 @@
1
- import { Scalar } from "./scalar.js";
2
- const pi = Math.PI;
3
- export const Radians = {
1
+ import { Scalar } from "../core/scalar.js";
2
+ export const pi = Math.PI;
3
+ /** basic unit for measuring rotations */
4
+ export const radians = {
4
5
  circle: 2 * pi,
5
- halfcircle: pi,
6
+ halfCircle: pi,
6
7
  toDegrees(r) {
7
8
  return r * (180 / pi);
8
9
  },
9
10
  toArcseconds(r) {
10
- return Radians.toDegrees(r) * 3600;
11
+ return radians.toDegrees(r) * 3600;
11
12
  },
12
13
  toTurns(r) {
13
- return r / Radians.circle;
14
+ return r / radians.circle;
14
15
  },
15
16
  circleDistance(radiansA, radiansB) {
16
- const diff = Math.abs(Scalar.wrap(radiansA - radiansB, 0, Radians.circle));
17
- return Math.min(diff, Radians.circle - diff);
18
- },
19
- };
20
- export const Turns = {
21
- toRadians(t) {
22
- return t * Radians.circle;
23
- },
24
- toDegrees(t) {
25
- return Radians.toDegrees(Turns.toRadians(t));
26
- },
27
- };
28
- export const Arcseconds = {
29
- toRadians(a) {
30
- return Degrees.toRadians(a / 3600);
31
- },
32
- };
33
- export const Degrees = {
34
- toRadians(d) {
35
- return d * (pi / 180);
36
- },
37
- toTurns(d) {
38
- return Radians.toTurns(Degrees.toRadians(d));
17
+ const diff = Math.abs(Scalar.wrap(radiansA - radiansB, 0, radians.circle));
18
+ return Math.min(diff, radians.circle - diff);
39
19
  },
40
20
  };
21
+ /** convert turns to radians */
22
+ export function turns(t) {
23
+ return t * radians.circle;
24
+ }
25
+ turns.toRadians = turns;
26
+ turns.toDegrees = (t) => radians.toDegrees(turns(t));
27
+ /** convert arcseconds to radians */
28
+ export function arcseconds(a) {
29
+ return degrees.toRadians(a / 3600);
30
+ }
31
+ arcseconds.toRadians = arcseconds;
32
+ arcseconds.toDegrees = (a) => radians.toDegrees(arcseconds(a));
33
+ /** convert degrees to radians */
34
+ export function degrees(d) {
35
+ return d * (pi / 180);
36
+ }
37
+ degrees.toRadians = degrees;
38
+ degrees.toTurns = (d) => radians.toTurns(degrees(d));
41
39
  //# sourceMappingURL=angles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"angles.js","sourceRoot":"","sources":["../../s/tools/angles.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAElC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;AAElB,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,MAAM,EAAE,CAAC,GAAG,EAAE;IACd,UAAU,EAAE,EAAE;IAEd,SAAS,CAAC,CAAS;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAA;IACtB,CAAC;IACD,YAAY,CAAC,CAAS;QACrB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACnC,CAAC;IACD,OAAO,CAAC,CAAS;QAChB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,CAAC;IAED,cAAc,CAAC,QAAgB,EAAE,QAAgB;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1E,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC7C,CAAC;CACD,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACpB,SAAS,CAAC,CAAS;QAClB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,CAAC;IACD,SAAS,CAAC,CAAS;QAClB,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;CACD,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,SAAS,CAAC,CAAS;QAClB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACnC,CAAC;CACD,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,SAAS,CAAC,CAAS;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IACtB,CAAC;IACD,OAAO,CAAC,CAAS;QAChB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;CACD,CAAA"}
1
+ {"version":3,"file":"angles.js","sourceRoot":"","sources":["../../s/tools/angles.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAA;AAExC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;AAEzB,yCAAyC;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,MAAM,EAAE,CAAC,GAAG,EAAE;IACd,UAAU,EAAE,EAAE;IAEd,SAAS,CAAC,CAAS;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAA;IACtB,CAAC;IAED,YAAY,CAAC,CAAS;QACrB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACnC,CAAC;IAED,OAAO,CAAC,CAAS;QAChB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,CAAC;IAED,cAAc,CAAC,QAAgB,EAAE,QAAgB;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1E,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC7C,CAAC;CACD,CAAA;AAED,+BAA+B;AAC/B,MAAM,UAAU,KAAK,CAAC,CAAS;IAC9B,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;AAC1B,CAAC;AACD,KAAK,CAAC,SAAS,GAAG,KAAK,CAAA;AACvB,KAAK,CAAC,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAE5D,oCAAoC;AACpC,MAAM,UAAU,UAAU,CAAC,CAAS;IACnC,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;AACnC,CAAC;AACD,UAAU,CAAC,SAAS,GAAG,UAAU,CAAA;AACjC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;AAEtE,iCAAiC;AACjC,MAAM,UAAU,OAAO,CAAC,CAAS;IAChC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;AACtB,CAAC;AACD,OAAO,CAAC,SAAS,GAAG,OAAO,CAAA;AAC3B,OAAO,CAAC,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA"}
@@ -3,7 +3,5 @@ import { XyArray } from "../core/vec2.js";
3
3
  export declare function linear(x: number, points: XyArray[]): number;
4
4
  /** resolve a number within a catmull-rom spline, that's all smooth-like. */
5
5
  export declare function catmullRom(x: number, points: XyArray[]): number;
6
- export declare const ez: {
7
- /** simple linear spline where the control points are equally-spaced based on their array indices (x is expected to be between 0 and 1). */
8
- linear(x: number, points: number[]): number;
9
- };
6
+ /** simple linear spline where the control points are equally-spaced based on their array indices (x is expected to be between 0 and 1). */
7
+ export declare function ezLinear(x: number, points: number[]): number;
package/x/tools/spline.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Scalar } from "./scalar.js";
1
+ import { Scalar } from "../core/scalar.js";
2
2
  /** resolve a number within a linear spline. */
3
3
  export function linear(x, points) {
4
4
  if (points.length < 2)
@@ -29,33 +29,27 @@ export function catmullRom(x, points) {
29
29
  const [x2,] = points[i + 1];
30
30
  if (x >= x1 && x <= x2) {
31
31
  const t = (x - x1) / (x2 - x1);
32
- return helpers.catmullRom(t, points[i - 1], points[i], points[i + 1], points[i + 2]);
32
+ return catmullRomMechanics(t, points[i - 1], points[i], points[i + 1], points[i + 2]);
33
33
  }
34
34
  }
35
35
  throw new Error("x is out of bounds, try again");
36
36
  }
37
- export const ez = {
38
- /** simple linear spline where the control points are equally-spaced based on their array indices (x is expected to be between 0 and 1). */
39
- linear(x, points) {
40
- if (points.length < 2)
41
- throw new Error("need at least two points, come on");
42
- const points2 = points.map((p, index) => [Scalar.clamp(index / (points.length - 1)), p]);
43
- return linear(Scalar.clamp(x), points2);
44
- }
45
- };
46
- var helpers;
47
- (function (helpers) {
48
- /** internal big-brain maths for the catmull-rom implementation */
49
- function catmullRom(t, [, p0], [, p1], [, p2], [, p3]) {
50
- const t2 = t * t;
51
- const t3 = t2 * t;
52
- // coefficients for the cubic polynomial (Catmull-Rom)
53
- const a = -0.5 * p0 + 1.5 * p1 - 1.5 * p2 + 0.5 * p3;
54
- const b = p0 - 2.5 * p1 + 2 * p2 - 0.5 * p3;
55
- const c = -0.5 * p0 + 0.5 * p2;
56
- const d = p1;
57
- return a * t3 + b * t2 + c * t + d;
58
- }
59
- helpers.catmullRom = catmullRom;
60
- })(helpers || (helpers = {}));
37
+ /** simple linear spline where the control points are equally-spaced based on their array indices (x is expected to be between 0 and 1). */
38
+ export function ezLinear(x, points) {
39
+ if (points.length < 2)
40
+ throw new Error("need at least two points, come on");
41
+ const points2 = points.map((p, index) => [Scalar.clamp(index / (points.length - 1)), p]);
42
+ return linear(Scalar.clamp(x), points2);
43
+ }
44
+ /** internal big-brain maths for the catmull-rom implementation */
45
+ function catmullRomMechanics(t, [, p0], [, p1], [, p2], [, p3]) {
46
+ const t2 = t * t;
47
+ const t3 = t2 * t;
48
+ // coefficients for the cubic polynomial (Catmull-Rom)
49
+ const a = -0.5 * p0 + 1.5 * p1 - 1.5 * p2 + 0.5 * p3;
50
+ const b = p0 - 2.5 * p1 + 2 * p2 - 0.5 * p3;
51
+ const c = -0.5 * p0 + 0.5 * p2;
52
+ const d = p1;
53
+ return a * t3 + b * t2 + c * t + d;
54
+ }
61
55
  //# sourceMappingURL=spline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spline.js","sourceRoot":"","sources":["../../s/tools/spline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spline.js","sourceRoot":"","sources":["../../s/tools/spline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare const Radians: {
2
+ circle: number;
3
+ halfcircle: number;
4
+ toDegrees(r: number): number;
5
+ toArcseconds(r: number): number;
6
+ toTurns(r: number): number;
7
+ circleDistance(radiansA: number, radiansB: number): number;
8
+ };
9
+ export declare const Turns: {
10
+ toRadians(t: number): number;
11
+ toDegrees(t: number): number;
12
+ };
13
+ export declare const Arcseconds: {
14
+ toRadians(a: number): number;
15
+ };
16
+ export declare const Degrees: {
17
+ toRadians(d: number): number;
18
+ toTurns(d: number): number;
19
+ };
@@ -0,0 +1,41 @@
1
+ import { Scalar } from "./scalar.js";
2
+ const pi = Math.PI;
3
+ export const Radians = {
4
+ circle: 2 * pi,
5
+ halfcircle: pi,
6
+ toDegrees(r) {
7
+ return r * (180 / pi);
8
+ },
9
+ toArcseconds(r) {
10
+ return Radians.toDegrees(r) * 3600;
11
+ },
12
+ toTurns(r) {
13
+ return r / Radians.circle;
14
+ },
15
+ circleDistance(radiansA, radiansB) {
16
+ const diff = Math.abs(Scalar.wrap(radiansA - radiansB, 0, Radians.circle));
17
+ return Math.min(diff, Radians.circle - diff);
18
+ },
19
+ };
20
+ export const Turns = {
21
+ toRadians(t) {
22
+ return t * Radians.circle;
23
+ },
24
+ toDegrees(t) {
25
+ return Radians.toDegrees(Turns.toRadians(t));
26
+ },
27
+ };
28
+ export const Arcseconds = {
29
+ toRadians(a) {
30
+ return Degrees.toRadians(a / 3600);
31
+ },
32
+ };
33
+ export const Degrees = {
34
+ toRadians(d) {
35
+ return d * (pi / 180);
36
+ },
37
+ toTurns(d) {
38
+ return Radians.toTurns(Degrees.toRadians(d));
39
+ },
40
+ };
41
+ //# sourceMappingURL=angles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angles.js","sourceRoot":"","sources":["../../s/utils/angles.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAElC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;AAElB,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,MAAM,EAAE,CAAC,GAAG,EAAE;IACd,UAAU,EAAE,EAAE;IAEd,SAAS,CAAC,CAAS;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAA;IACtB,CAAC;IACD,YAAY,CAAC,CAAS;QACrB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IACnC,CAAC;IACD,OAAO,CAAC,CAAS;QAChB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,CAAC;IAED,cAAc,CAAC,QAAgB,EAAE,QAAgB;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1E,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC7C,CAAC;CACD,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACpB,SAAS,CAAC,CAAS;QAClB,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,CAAC;IACD,SAAS,CAAC,CAAS;QAClB,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;CACD,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,SAAS,CAAC,CAAS;QAClB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACnC,CAAC;CACD,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,SAAS,CAAC,CAAS;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IACtB,CAAC;IACD,OAAO,CAAC,CAAS;QAChB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;CACD,CAAA"}
@@ -0,0 +1,17 @@
1
+ export declare class Circular {
2
+ x: number;
3
+ constructor(x: number);
4
+ clone(): Circular;
5
+ set(x: number): this;
6
+ static value(x: number | Circular): number;
7
+ static normalize(x: number): number;
8
+ normalize(): this;
9
+ static difference(x: number, y: number): number;
10
+ difference(y: number | Circular): number;
11
+ static lerp(x: number, y: number, fraction: number, max?: number): number;
12
+ lerp(y: number | Circular, fraction: number, max?: number): this;
13
+ static step(x: number, y: number, delta: number): number;
14
+ step(y: number | Circular, delta: number): this;
15
+ static approach(x: number, y: number, speed: number, deltaTime: number, speedLimit?: number): number;
16
+ approach(y: number | Circular, speed: number, deltaTime: number, speedLimit?: number): this;
17
+ }
@@ -0,0 +1,70 @@
1
+ import { Scalar } from "./scalar.js";
2
+ export class Circular {
3
+ x;
4
+ constructor(x) {
5
+ this.x = x;
6
+ }
7
+ clone() {
8
+ return new Circular(this.x);
9
+ }
10
+ set(x) {
11
+ this.x = x;
12
+ return this;
13
+ }
14
+ static value(x) {
15
+ return typeof x === "number"
16
+ ? x
17
+ : x.x;
18
+ }
19
+ static normalize(x) {
20
+ return Scalar.wrap(x, 0, 2 * Math.PI);
21
+ }
22
+ normalize() {
23
+ this.x = Circular.normalize(this.x);
24
+ return this;
25
+ }
26
+ static difference(x, y) {
27
+ x = this.normalize(x);
28
+ y = this.normalize(y);
29
+ let delta = y - x;
30
+ if (delta > Math.PI)
31
+ delta -= 2 * Math.PI;
32
+ if (delta < -Math.PI)
33
+ delta += 2 * Math.PI;
34
+ return delta;
35
+ }
36
+ difference(y) {
37
+ return Circular.difference(this.x, Circular.value(y));
38
+ }
39
+ static lerp(x, y, fraction, max) {
40
+ const difference = this.difference(x, y);
41
+ let delta = difference * fraction;
42
+ if (max !== undefined && Math.abs(delta) > max)
43
+ delta = Math.sign(delta) * max;
44
+ return this.normalize(x + delta);
45
+ }
46
+ lerp(y, fraction, max) {
47
+ this.x = Circular.lerp(this.x, Circular.value(y), fraction, max);
48
+ return this;
49
+ }
50
+ static step(x, y, delta) {
51
+ const difference = this.difference(x, y);
52
+ return this.normalize(Math.abs(difference) <= delta
53
+ ? y
54
+ : x + (Math.sign(difference) * delta));
55
+ }
56
+ step(y, delta) {
57
+ this.x = Circular.step(this.x, Circular.value(y), delta);
58
+ return this;
59
+ }
60
+ static approach(x, y, speed, deltaTime, speedLimit) {
61
+ const difference = this.difference(x, y);
62
+ const change = Scalar.creep(difference, speed, deltaTime, speedLimit);
63
+ return this.normalize(x + change);
64
+ }
65
+ approach(y, speed, deltaTime, speedLimit) {
66
+ this.x = Circular.approach(this.x, Circular.value(y), speed, deltaTime, speedLimit);
67
+ return this;
68
+ }
69
+ }
70
+ //# sourceMappingURL=circular.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circular.js","sourceRoot":"","sources":["../../s/utils/circular.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAElC,MAAM,OAAO,QAAQ;IACD;IAAnB,YAAmB,CAAS;QAAT,MAAC,GAAD,CAAC,CAAQ;IAAG,CAAC;IAEhC,KAAK;QACJ,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC5B,CAAC;IAED,GAAG,CAAC,CAAS;QACZ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,CAAoB;QAChC,OAAO,OAAO,CAAC,KAAK,QAAQ;YAC3B,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACP,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAS;QACzB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;IACtC,CAAC;IAAC,SAAS;QACV,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnC,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,CAAS,EAAE,CAAS;QACrC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACrB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,CAAA;QACjB,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE;YAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;QACzC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE;YAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;QAC1C,OAAO,KAAK,CAAA;IACb,CAAC;IAAC,UAAU,CAAC,CAAoB;QAChC,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,QAAgB,EAAE,GAAY;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACxC,IAAI,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAA;QACjC,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG;YAC7C,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,CAAA;IACjC,CAAC;IAAC,IAAI,CAAC,CAAoB,EAAE,QAAgB,EAAE,GAAY;QAC1D,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;QAChE,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACxC,OAAO,IAAI,CAAC,SAAS,CACpB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK;YAC5B,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,CACtC,CAAA;IACF,CAAC;IAAC,IAAI,CAAC,CAAoB,EAAE,KAAa;QACzC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACxD,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,SAAiB,EAAE,UAAmB;QAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QACrE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,CAAA;IAClC,CAAC;IAAC,QAAQ,CAAC,CAAoB,EAAE,KAAa,EAAE,SAAiB,EAAE,UAAmB;QACrF,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QACnF,OAAO,IAAI,CAAA;IACZ,CAAC;CACD"}
@@ -0,0 +1,9 @@
1
+ import { Random } from "./randy.js";
2
+ export declare class Noise {
3
+ #private;
4
+ readonly random: Random;
5
+ static seed(seed?: number): Noise;
6
+ constructor(random: Random);
7
+ /** sample the noise field, returning a number from 0 to 1. */
8
+ sample(x: number, y?: number, scale?: number): number;
9
+ }
@@ -0,0 +1,20 @@
1
+ import { Randy } from "./randy.js";
2
+ import { createNoise2D } from "simplex-noise";
3
+ export class Noise {
4
+ random;
5
+ static seed(seed = Randy.randomSeed()) {
6
+ const random = Randy.makeRandom(seed);
7
+ return new this(random);
8
+ }
9
+ #n2d;
10
+ constructor(random) {
11
+ this.random = random;
12
+ this.#n2d = createNoise2D(random);
13
+ }
14
+ /** sample the noise field, returning a number from 0 to 1. */
15
+ sample(x, y = 0, scale = 1) {
16
+ const s = this.#n2d(x * scale, y * scale);
17
+ return (s + 1) / 2;
18
+ }
19
+ }
20
+ //# sourceMappingURL=noise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise.js","sourceRoot":"","sources":["../../s/utils/noise.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAS,MAAM,YAAY,CAAA;AACxC,OAAO,EAAC,aAAa,EAAC,MAAM,eAAe,CAAA;AAE3C,MAAM,OAAO,KAAK;IAQW;IAP5B,MAAM,CAAC,IAAI,CAAC,OAAe,KAAK,CAAC,UAAU,EAAE;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACrC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;IACxB,CAAC;IAED,IAAI,CAAkC;IAEtC,YAA4B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QACzC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC;IAED,8DAA8D;IAC9D,MAAM,CAAC,CAAS,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAA;QACzC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;CACD"}
@@ -0,0 +1,31 @@
1
+ export type Random = () => number;
2
+ /** utility for generating and using random numbers. */
3
+ export declare class Randy {
4
+ readonly seed: number;
5
+ random: Random;
6
+ constructor(seed?: number);
7
+ /** obtain a random positive 32 bit integer. */
8
+ static randomSeed(): number;
9
+ /** seed a pseudo-random number generator function that produces numbers between 0 and 1. */
10
+ static makeRandom(seed: number): Random;
11
+ /** obtain a random positive integer. */
12
+ integer(): number;
13
+ /** return true or false, given a 0 to 1 probability fraction. */
14
+ roll(chance?: number): boolean;
15
+ /** generate a random number between two numbers. */
16
+ range(a: number, b: number): number;
17
+ /** generate a random integer between two numbers (inclusive). */
18
+ integerRange(a: number, b: number): number;
19
+ /** randomly choose an index given an array length. */
20
+ index(length: number): number;
21
+ /** return a random item from the given array. */
22
+ choose<T>(array: T[]): T;
23
+ /** remove and return a random item from the given array. */
24
+ yoink<T>(array: T[]): T;
25
+ /** randomly select a number of array items. */
26
+ select<T>(count: number, array: T[]): T[];
27
+ /** remove and return a number of items from the given array. */
28
+ take<T>(count: number, array: T[]): T[];
29
+ /** shuffle an array in-place using (fisher-yates) */
30
+ shuffle<T>(array: T[]): T[];
31
+ }
@@ -0,0 +1,85 @@
1
+ /** utility for generating and using random numbers. */
2
+ export class Randy {
3
+ seed;
4
+ random;
5
+ constructor(seed = Randy.randomSeed()) {
6
+ this.seed = seed;
7
+ this.random = Randy.makeRandom(seed);
8
+ }
9
+ /** obtain a random positive 32 bit integer. */
10
+ static randomSeed() {
11
+ return Math.floor(Math.random() * 2147483647);
12
+ }
13
+ /** seed a pseudo-random number generator function that produces numbers between 0 and 1. */
14
+ static makeRandom(seed) {
15
+ seed = (seed ^ 0x6D2B79F5) + 0x1E35A7BD;
16
+ seed = (Math.abs(seed | 0) % 2147483647) || 1;
17
+ function random() {
18
+ seed = (Math.imul(48271, seed) | 0) % 2147483647;
19
+ return (seed & 2147483647) / 2147483648;
20
+ }
21
+ random(); // discard first value
22
+ return random;
23
+ }
24
+ /** obtain a random positive integer. */
25
+ integer() {
26
+ return Math.floor(this.random() * 2147483647);
27
+ }
28
+ /** return true or false, given a 0 to 1 probability fraction. */
29
+ roll(chance = 0.5) {
30
+ return this.random() <= chance;
31
+ }
32
+ /** generate a random number between two numbers. */
33
+ range(a, b) {
34
+ const difference = b - a;
35
+ const value = difference * this.random();
36
+ return a + value;
37
+ }
38
+ /** generate a random integer between two numbers (inclusive). */
39
+ integerRange(a, b) {
40
+ return Math.round(this.range(a, b));
41
+ }
42
+ /** randomly choose an index given an array length. */
43
+ index(length) {
44
+ return Math.floor(this.random() * length);
45
+ }
46
+ /** return a random item from the given array. */
47
+ choose(array) {
48
+ return array[this.index(array.length)];
49
+ }
50
+ /** remove and return a random item from the given array. */
51
+ yoink(array) {
52
+ const index = this.index(array.length);
53
+ const [item] = array.splice(index, 1);
54
+ return item;
55
+ }
56
+ /** randomly select a number of array items. */
57
+ select(count, array) {
58
+ const copy = [...array];
59
+ if (count >= array.length)
60
+ return copy;
61
+ const selection = [];
62
+ for (let i = 0; i < count; i++)
63
+ selection.push(this.yoink(copy));
64
+ return selection;
65
+ }
66
+ /** remove and return a number of items from the given array. */
67
+ take(count, array) {
68
+ const selection = [];
69
+ for (let i = 0; i < count; i++) {
70
+ if (array.length === 0)
71
+ return selection;
72
+ selection.push(this.yoink(array));
73
+ }
74
+ return selection;
75
+ }
76
+ /** shuffle an array in-place using (fisher-yates) */
77
+ shuffle(array) {
78
+ for (let i = array.length - 1; i > 0; i--) {
79
+ const j = Math.floor(this.random() * (i + 1));
80
+ [array[i], array[j]] = [array[j], array[i]];
81
+ }
82
+ return array;
83
+ }
84
+ }
85
+ //# sourceMappingURL=randy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"randy.js","sourceRoot":"","sources":["../../s/utils/randy.ts"],"names":[],"mappings":"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"}