@sarmal/core 0.24.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/auto-init.cjs +245 -141
  2. package/dist/auto-init.cjs.map +1 -1
  3. package/dist/auto-init.js +244 -140
  4. package/dist/auto-init.js.map +1 -1
  5. package/dist/curves/artemis2.cjs +87 -14
  6. package/dist/curves/artemis2.cjs.map +1 -1
  7. package/dist/curves/artemis2.d.cts +1 -5
  8. package/dist/curves/artemis2.d.ts +1 -5
  9. package/dist/curves/artemis2.js +86 -13
  10. package/dist/curves/artemis2.js.map +1 -1
  11. package/dist/curves/astroid.cjs +4 -4
  12. package/dist/curves/astroid.d.cts +1 -1
  13. package/dist/curves/astroid.d.ts +1 -1
  14. package/dist/curves/astroid.js +3 -3
  15. package/dist/curves/deltoid.cjs +4 -4
  16. package/dist/curves/deltoid.d.cts +1 -1
  17. package/dist/curves/deltoid.d.ts +1 -1
  18. package/dist/curves/deltoid.js +3 -3
  19. package/dist/curves/epicycloid3.cjs +4 -4
  20. package/dist/curves/epicycloid3.d.cts +1 -1
  21. package/dist/curves/epicycloid3.d.ts +1 -1
  22. package/dist/curves/epicycloid3.js +3 -3
  23. package/dist/curves/epitrochoid7.cjs +5 -5
  24. package/dist/curves/epitrochoid7.d.cts +1 -1
  25. package/dist/curves/epitrochoid7.d.ts +1 -1
  26. package/dist/curves/epitrochoid7.js +4 -4
  27. package/dist/curves/index.cjs +154 -71
  28. package/dist/curves/index.cjs.map +1 -1
  29. package/dist/curves/index.d.cts +29 -29
  30. package/dist/curves/index.d.ts +29 -29
  31. package/dist/curves/index.js +170 -71
  32. package/dist/curves/index.js.map +1 -1
  33. package/dist/curves/lame.cjs +6 -5
  34. package/dist/curves/lame.d.cts +1 -1
  35. package/dist/curves/lame.d.ts +1 -1
  36. package/dist/curves/lame.js +5 -4
  37. package/dist/curves/lissajous32.cjs +4 -4
  38. package/dist/curves/lissajous32.d.cts +1 -1
  39. package/dist/curves/lissajous32.d.ts +1 -1
  40. package/dist/curves/lissajous32.js +3 -3
  41. package/dist/curves/lissajous43.cjs +4 -4
  42. package/dist/curves/lissajous43.d.cts +1 -1
  43. package/dist/curves/lissajous43.d.ts +1 -1
  44. package/dist/curves/lissajous43.js +3 -3
  45. package/dist/curves/rose3.cjs +4 -4
  46. package/dist/curves/rose3.d.cts +1 -1
  47. package/dist/curves/rose3.d.ts +1 -1
  48. package/dist/curves/rose3.js +3 -3
  49. package/dist/curves/rose5.cjs +4 -4
  50. package/dist/curves/rose5.d.cts +1 -1
  51. package/dist/curves/rose5.d.ts +1 -1
  52. package/dist/curves/rose5.js +3 -3
  53. package/dist/curves/rose52.cjs +5 -5
  54. package/dist/curves/rose52.d.cts +1 -1
  55. package/dist/curves/rose52.d.ts +1 -1
  56. package/dist/curves/rose52.js +4 -4
  57. package/dist/curves/star.cjs +8 -5
  58. package/dist/curves/star.d.cts +1 -1
  59. package/dist/curves/star.d.ts +1 -1
  60. package/dist/curves/star.js +7 -4
  61. package/dist/curves/star4.cjs +8 -5
  62. package/dist/curves/star4.d.cts +1 -1
  63. package/dist/curves/star4.d.ts +1 -1
  64. package/dist/curves/star4.js +7 -4
  65. package/dist/curves/star7.cjs +8 -5
  66. package/dist/curves/star7.d.cts +1 -1
  67. package/dist/curves/star7.d.ts +1 -1
  68. package/dist/curves/star7.js +7 -4
  69. package/dist/index.cjs +232 -172
  70. package/dist/index.cjs.map +1 -1
  71. package/dist/index.d.cts +106 -36
  72. package/dist/index.d.ts +106 -36
  73. package/dist/index.js +252 -172
  74. package/dist/index.js.map +1 -1
  75. package/dist/types-Z9i1_AQZ.d.cts +339 -0
  76. package/dist/types-Z9i1_AQZ.d.ts +339 -0
  77. package/package.json +1 -1
  78. package/dist/types-CknrlCAf.d.cts +0 -314
  79. package/dist/types-CknrlCAf.d.ts +0 -314
@@ -1,23 +1,96 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
- // src/curves/artemis2.ts
4
- var TWO_PI = Math.PI * 2;
5
- function artemis2Fn(t, _time, _params) {
6
- const a = 0.35, b = 0.15, ox = 0.175;
7
- const s = Math.sin(t), c = Math.cos(t);
8
- const denom = 1 + s * s;
3
+ // src/catmull-rom.ts
4
+ var PERIOD = 2 * Math.PI;
5
+ function catmullRom1D(p0, p1, p2, p3, u) {
6
+ const u2 = u * u;
7
+ const u3 = u2 * u;
8
+ return (
9
+ 0.5 *
10
+ (2 * p1 +
11
+ (-p0 + p2) * u +
12
+ (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 +
13
+ (-p0 + 3 * p1 - 3 * p2 + p3) * u3)
14
+ );
15
+ }
16
+ function evaluateCatmullRom(points2, t) {
17
+ const N = points2.length;
18
+ if (N === 0) {
19
+ return { x: 0, y: 0 };
20
+ }
21
+ if (N === 1) {
22
+ return { x: points2[0][0], y: points2[0][1] };
23
+ }
24
+ t = ((t % PERIOD) + PERIOD) % PERIOD;
25
+ const segmentSize = PERIOD / N;
26
+ let i = Math.floor(t / segmentSize);
27
+ if (i >= N) {
28
+ i = N - 1;
29
+ }
30
+ let u = (t - i * segmentSize) / segmentSize;
31
+ u = Math.max(0, Math.min(1, u));
32
+ const p0 = points2[(i - 1 + N) % N];
33
+ const p1 = points2[i];
34
+ const p2 = points2[(i + 1) % N];
35
+ const p3 = points2[(i + 2) % N];
36
+ return {
37
+ x: catmullRom1D(p0[0], p1[0], p2[0], p3[0], u),
38
+ y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u),
39
+ };
40
+ }
41
+ function drawCurve(points2, opts) {
42
+ if (points2.length < 3) {
43
+ throw new Error(`drawCurve requires at least 3 points, received ${points2.length}.`);
44
+ }
45
+ const first = points2[0];
46
+ if (points2.every((p) => p[0] === first[0] && p[1] === first[1])) {
47
+ console.warn(
48
+ "[sarmal].drawCurve: all control points are identical. The curve will be a single point.",
49
+ );
50
+ }
51
+ const maxAbs = points2.reduce((m, p) => Math.max(m, Math.abs(p[0]), Math.abs(p[1])), 0);
52
+ if (maxAbs > 2) {
53
+ console.warn(
54
+ `[sarmal].drawCurve: control points extend to \xB1${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`,
55
+ );
56
+ }
57
+ const pts = points2.map(([x, y]) => [x, y]);
9
58
  return {
10
- x: c * (1 + a * c) / denom - ox,
11
- y: s * c * (1 + b * c) / denom
59
+ name: opts?.name ?? "drawn",
60
+ fn: (t) => evaluateCatmullRom(pts, t),
61
+ period: PERIOD,
12
62
  };
13
63
  }
64
+
65
+ // src/curves/artemis2.ts
66
+ var points = [
67
+ [-0.44, -0.45],
68
+ [-0.53, -0.77],
69
+ [-0.82, -0.66],
70
+ [-0.82, -0.18],
71
+ [-0.25, -0.04],
72
+ [0.16, -0.49],
73
+ [-0.03, -0.87],
74
+ [-0.68, -0.94],
75
+ [-0.95, -0.61],
76
+ [-0.87, -0],
77
+ [-0.34, 0.21],
78
+ [0.27, -0.04],
79
+ [0.87, 0.06],
80
+ [0.87, 0.57],
81
+ [0.32, 0.66],
82
+ [-0.21, -0.43],
83
+ [-0.43, -0.81],
84
+ [-0.69, -0.84],
85
+ [-0.87, -0.66],
86
+ [-0.9, -0.47],
87
+ [-0.76, -0.35],
88
+ ];
14
89
  var artemis2 = {
15
- name: "Artemis II",
16
- fn: artemis2Fn,
17
- period: TWO_PI,
18
- speed: 0.7
90
+ ...drawCurve(points, { name: "Artemis II" }),
91
+ speed: 0.7,
19
92
  };
20
93
 
21
94
  exports.artemis2 = artemis2;
22
95
  //# sourceMappingURL=artemis2.cjs.map
23
- //# sourceMappingURL=artemis2.cjs.map
96
+ //# sourceMappingURL=artemis2.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/curves/artemis2.ts"],"names":[],"mappings":";;;AAEA,IAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AASzB,SAAS,UAAA,CAAW,CAAA,EAAW,KAAA,EAAe,OAAA,EAAiC;AAC7E,EAAA,MAAM,CAAA,GAAI,IAAA,EACR,CAAA,GAAI,IAAA,EACJ,EAAA,GAAK,KAAA;AACP,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAC,GAClB,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAChB,EAAA,MAAM,KAAA,GAAQ,IAAI,CAAA,GAAI,CAAA;AACtB,EAAA,OAAO;AAAA,IACL,CAAA,EAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,KAAM,KAAA,GAAQ,EAAA;AAAA,IAC/B,CAAA,EAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,IAAI,CAAA,CAAA,GAAM;AAAA,GAC7B;AACF;AAMO,IAAM,QAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,YAAA;AAAA,EACN,EAAA,EAAI,UAAA;AAAA,EACJ,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO;AACT","file":"artemis2.cjs","sourcesContent":["import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\n/**\n * Artemis II free-return lunar trajectory\n * @see https://www.nasa.gov/wp-content/uploads/2025/09/artemis-ii-map-508.pdf\n * a = x-axis asymmetry (widens one lobe),\n * b = y-axis asymmetry,\n * ox = horizontal offset to visually center the shape\n */\nfunction artemis2Fn(t: number, _time: number, _params: Record<string, number>) {\n const a = 0.35,\n b = 0.15,\n ox = 0.175;\n const s = Math.sin(t),\n c = Math.cos(t);\n const denom = 1 + s * s;\n return {\n x: (c * (1 + a * c)) / denom - ox,\n y: (s * c * (1 + b * c)) / denom,\n };\n}\n\n/**\n * Artemis II free-return lunar trajectory curve\n * Traces the path of the Orion spacecraft during the Artemis II mission\n */\nexport const artemis2: CurveDef = {\n name: \"Artemis II\",\n fn: artemis2Fn,\n period: TWO_PI,\n speed: 0.7,\n};\n"]}
1
+ {"version":3,"sources":["../../src/catmull-rom.ts","../../src/curves/artemis2.ts"],"names":["points"],"mappings":"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","file":"artemis2.cjs","sourcesContent":["import type { ControlPoint, Point, CurveDef } from \"./types\";\n\n/**\n * One full loop around the spline maps to the parametric interval `[0, 2π)`,\n * matching the convention for built-in curves.\n */\nconst PERIOD = 2 * Math.PI;\n\n/**\n * Evaluates a one-dimensional Catmull-Rom spline segment given four control values.\n * The parameter `u` ranges from 0 (at `p1`) to 1 (at `p2`).\n * `p0` and `p3` are the phantom neighbours that influence the tangent at each endpoint.\n */\nfunction catmullRom1D(p0: number, p1: number, p2: number, p3: number, u: number): number {\n const u2 = u * u;\n const u3 = u2 * u;\n\n // The standard Catmull-Rom matrix form\n return (\n 0.5 *\n (2 * p1 +\n (-p0 + p2) * u +\n (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 +\n (-p0 + 3 * p1 - 3 * p2 + p3) * u3)\n );\n}\n\n/**\n * Evaluates a closed Catmull-Rom spline through every point in `points`\n *\n * The spline treats `points` as a **closed loop**\n * The last point wraps back to the first,\n * and each segment uses a phantom predecessor / successor so the\n * curve passes exactly through every control point.\n *\n * @param points At least 1 point. An empty array yields `(0, 0)`. A single point returns that point for every `t`\n * @param t Parametric position along the closed loop. Wraps into `[0, 2π)` automatically, so values outside that range are remapped rather than rejected\n * @returns The `(x, y)` position on the spline at time `t`\n */\nexport function evaluateCatmullRom(points: Array<ControlPoint>, t: number): Point {\n const N = points.length;\n\n if (N === 0) {\n return { x: 0, y: 0 };\n }\n\n if (N === 1) {\n return { x: points[0]![0], y: points[0]![1] };\n }\n\n t = ((t % PERIOD) + PERIOD) % PERIOD;\n\n const segmentSize = PERIOD / N;\n let i = Math.floor(t / segmentSize);\n if (i >= N) {\n i = N - 1;\n }\n\n let u = (t - i * segmentSize) / segmentSize;\n u = Math.max(0, Math.min(1, u));\n\n const p0 = points[(i - 1 + N) % N]!;\n const p1 = points[i]!;\n const p2 = points[(i + 1) % N]!;\n const p3 = points[(i + 2) % N]!;\n\n return {\n x: catmullRom1D(p0[0], p1[0], p2[0], p3[0], u),\n y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u),\n };\n}\n\n/**\n * The returned curve definition produces a closed Catmull-Rom spline that\n * passes through every point in order, looping back from the last point to the first.\n *\n * @param points Array of control points in **normalized `[−1, 1]` space**,\n * matching the playground's draw-mode coordinate system.\n * ! Must contain at least 3 points.\n * @param opts Optional overrides for the returned `CurveDef`.\n * @param opts.name Display name for the curve. Defaults to `\"drawn\"`.\n * @returns A `CurveDef` with `period: 2π` and the spline evaluator as its `fn`.\n * @throws If `points` has fewer than 3 entries.\n *\n * @example\n * ```ts\n * import { createSarmal, drawCurve } from '@sarmal/core'\n *\n * const curve = drawCurve([\n * [-0.5, 0.3],\n * [ 0.2, -0.8],\n * [ 0.7, 0.4],\n * ])\n *\n * createSarmal(canvas, curve)\n * ```\n */\nexport function drawCurve(points: Array<ControlPoint>, opts?: { name?: string }): CurveDef {\n if (points.length < 3) {\n throw new Error(`drawCurve requires at least 3 points, received ${points.length}.`);\n }\n\n const first = points[0]!;\n if (points.every((p) => p[0] === first[0] && p[1] === first[1])) {\n console.warn(\n \"[sarmal].drawCurve: all control points are identical. The curve will be a single point.\",\n );\n }\n\n const maxAbs = points.reduce((m, p) => Math.max(m, Math.abs(p[0]), Math.abs(p[1])), 0);\n if (maxAbs > 2) {\n console.warn(\n `[sarmal].drawCurve: control points extend to ±${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`,\n );\n }\n\n const pts = points.map(([x, y]) => [x, y] as ControlPoint);\n\n return {\n name: opts?.name ?? \"drawn\",\n fn: (t: number) => evaluateCatmullRom(pts, t),\n period: PERIOD,\n };\n}\n","import type { ControlPoint, CurveDef } from \"../types\";\n\nimport { drawCurve } from \"../catmull-rom\";\n\nconst points: Array<ControlPoint> = [\n [-0.44, -0.45],\n [-0.53, -0.77],\n [-0.82, -0.66],\n [-0.82, -0.18],\n [-0.25, -0.04],\n [0.16, -0.49],\n [-0.03, -0.87],\n [-0.68, -0.94],\n [-0.95, -0.61],\n [-0.87, -0.0],\n [-0.34, 0.21],\n [0.27, -0.04],\n [0.87, 0.06],\n [0.87, 0.57],\n [0.32, 0.66],\n [-0.21, -0.43],\n [-0.43, -0.81],\n [-0.69, -0.84],\n [-0.87, -0.66],\n [-0.9, -0.47],\n [-0.76, -0.35],\n];\n\nexport const artemis2: CurveDef = {\n ...drawCurve(points, { name: \"Artemis II\" }),\n speed: 0.7,\n};\n"]}
@@ -1,9 +1,5 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.cjs';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.cjs";
2
2
 
3
- /**
4
- * Artemis II free-return lunar trajectory curve
5
- * Traces the path of the Orion spacecraft during the Artemis II mission
6
- */
7
3
  declare const artemis2: CurveDef;
8
4
 
9
5
  export { artemis2 };
@@ -1,9 +1,5 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.js';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.js";
2
2
 
3
- /**
4
- * Artemis II free-return lunar trajectory curve
5
- * Traces the path of the Orion spacecraft during the Artemis II mission
6
- */
7
3
  declare const artemis2: CurveDef;
8
4
 
9
5
  export { artemis2 };
@@ -1,21 +1,94 @@
1
- // src/curves/artemis2.ts
2
- var TWO_PI = Math.PI * 2;
3
- function artemis2Fn(t, _time, _params) {
4
- const a = 0.35, b = 0.15, ox = 0.175;
5
- const s = Math.sin(t), c = Math.cos(t);
6
- const denom = 1 + s * s;
1
+ // src/catmull-rom.ts
2
+ var PERIOD = 2 * Math.PI;
3
+ function catmullRom1D(p0, p1, p2, p3, u) {
4
+ const u2 = u * u;
5
+ const u3 = u2 * u;
6
+ return (
7
+ 0.5 *
8
+ (2 * p1 +
9
+ (-p0 + p2) * u +
10
+ (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 +
11
+ (-p0 + 3 * p1 - 3 * p2 + p3) * u3)
12
+ );
13
+ }
14
+ function evaluateCatmullRom(points2, t) {
15
+ const N = points2.length;
16
+ if (N === 0) {
17
+ return { x: 0, y: 0 };
18
+ }
19
+ if (N === 1) {
20
+ return { x: points2[0][0], y: points2[0][1] };
21
+ }
22
+ t = ((t % PERIOD) + PERIOD) % PERIOD;
23
+ const segmentSize = PERIOD / N;
24
+ let i = Math.floor(t / segmentSize);
25
+ if (i >= N) {
26
+ i = N - 1;
27
+ }
28
+ let u = (t - i * segmentSize) / segmentSize;
29
+ u = Math.max(0, Math.min(1, u));
30
+ const p0 = points2[(i - 1 + N) % N];
31
+ const p1 = points2[i];
32
+ const p2 = points2[(i + 1) % N];
33
+ const p3 = points2[(i + 2) % N];
34
+ return {
35
+ x: catmullRom1D(p0[0], p1[0], p2[0], p3[0], u),
36
+ y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u),
37
+ };
38
+ }
39
+ function drawCurve(points2, opts) {
40
+ if (points2.length < 3) {
41
+ throw new Error(`drawCurve requires at least 3 points, received ${points2.length}.`);
42
+ }
43
+ const first = points2[0];
44
+ if (points2.every((p) => p[0] === first[0] && p[1] === first[1])) {
45
+ console.warn(
46
+ "[sarmal].drawCurve: all control points are identical. The curve will be a single point.",
47
+ );
48
+ }
49
+ const maxAbs = points2.reduce((m, p) => Math.max(m, Math.abs(p[0]), Math.abs(p[1])), 0);
50
+ if (maxAbs > 2) {
51
+ console.warn(
52
+ `[sarmal].drawCurve: control points extend to \xB1${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`,
53
+ );
54
+ }
55
+ const pts = points2.map(([x, y]) => [x, y]);
7
56
  return {
8
- x: c * (1 + a * c) / denom - ox,
9
- y: s * c * (1 + b * c) / denom
57
+ name: opts?.name ?? "drawn",
58
+ fn: (t) => evaluateCatmullRom(pts, t),
59
+ period: PERIOD,
10
60
  };
11
61
  }
62
+
63
+ // src/curves/artemis2.ts
64
+ var points = [
65
+ [-0.44, -0.45],
66
+ [-0.53, -0.77],
67
+ [-0.82, -0.66],
68
+ [-0.82, -0.18],
69
+ [-0.25, -0.04],
70
+ [0.16, -0.49],
71
+ [-0.03, -0.87],
72
+ [-0.68, -0.94],
73
+ [-0.95, -0.61],
74
+ [-0.87, -0],
75
+ [-0.34, 0.21],
76
+ [0.27, -0.04],
77
+ [0.87, 0.06],
78
+ [0.87, 0.57],
79
+ [0.32, 0.66],
80
+ [-0.21, -0.43],
81
+ [-0.43, -0.81],
82
+ [-0.69, -0.84],
83
+ [-0.87, -0.66],
84
+ [-0.9, -0.47],
85
+ [-0.76, -0.35],
86
+ ];
12
87
  var artemis2 = {
13
- name: "Artemis II",
14
- fn: artemis2Fn,
15
- period: TWO_PI,
16
- speed: 0.7
88
+ ...drawCurve(points, { name: "Artemis II" }),
89
+ speed: 0.7,
17
90
  };
18
91
 
19
92
  export { artemis2 };
20
93
  //# sourceMappingURL=artemis2.js.map
21
- //# sourceMappingURL=artemis2.js.map
94
+ //# sourceMappingURL=artemis2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/curves/artemis2.ts"],"names":[],"mappings":";AAEA,IAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AASzB,SAAS,UAAA,CAAW,CAAA,EAAW,KAAA,EAAe,OAAA,EAAiC;AAC7E,EAAA,MAAM,CAAA,GAAI,IAAA,EACR,CAAA,GAAI,IAAA,EACJ,EAAA,GAAK,KAAA;AACP,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAC,GAClB,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAChB,EAAA,MAAM,KAAA,GAAQ,IAAI,CAAA,GAAI,CAAA;AACtB,EAAA,OAAO;AAAA,IACL,CAAA,EAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,KAAM,KAAA,GAAQ,EAAA;AAAA,IAC/B,CAAA,EAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,IAAI,CAAA,CAAA,GAAM;AAAA,GAC7B;AACF;AAMO,IAAM,QAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,YAAA;AAAA,EACN,EAAA,EAAI,UAAA;AAAA,EACJ,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO;AACT","file":"artemis2.js","sourcesContent":["import type { CurveDef } from \"../types\";\n\nconst TWO_PI = Math.PI * 2;\n\n/**\n * Artemis II free-return lunar trajectory\n * @see https://www.nasa.gov/wp-content/uploads/2025/09/artemis-ii-map-508.pdf\n * a = x-axis asymmetry (widens one lobe),\n * b = y-axis asymmetry,\n * ox = horizontal offset to visually center the shape\n */\nfunction artemis2Fn(t: number, _time: number, _params: Record<string, number>) {\n const a = 0.35,\n b = 0.15,\n ox = 0.175;\n const s = Math.sin(t),\n c = Math.cos(t);\n const denom = 1 + s * s;\n return {\n x: (c * (1 + a * c)) / denom - ox,\n y: (s * c * (1 + b * c)) / denom,\n };\n}\n\n/**\n * Artemis II free-return lunar trajectory curve\n * Traces the path of the Orion spacecraft during the Artemis II mission\n */\nexport const artemis2: CurveDef = {\n name: \"Artemis II\",\n fn: artemis2Fn,\n period: TWO_PI,\n speed: 0.7,\n};\n"]}
1
+ {"version":3,"sources":["../../src/catmull-rom.ts","../../src/curves/artemis2.ts"],"names":["points"],"mappings":"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","file":"artemis2.js","sourcesContent":["import type { ControlPoint, Point, CurveDef } from \"./types\";\n\n/**\n * One full loop around the spline maps to the parametric interval `[0, 2π)`,\n * matching the convention for built-in curves.\n */\nconst PERIOD = 2 * Math.PI;\n\n/**\n * Evaluates a one-dimensional Catmull-Rom spline segment given four control values.\n * The parameter `u` ranges from 0 (at `p1`) to 1 (at `p2`).\n * `p0` and `p3` are the phantom neighbours that influence the tangent at each endpoint.\n */\nfunction catmullRom1D(p0: number, p1: number, p2: number, p3: number, u: number): number {\n const u2 = u * u;\n const u3 = u2 * u;\n\n // The standard Catmull-Rom matrix form\n return (\n 0.5 *\n (2 * p1 +\n (-p0 + p2) * u +\n (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 +\n (-p0 + 3 * p1 - 3 * p2 + p3) * u3)\n );\n}\n\n/**\n * Evaluates a closed Catmull-Rom spline through every point in `points`\n *\n * The spline treats `points` as a **closed loop**\n * The last point wraps back to the first,\n * and each segment uses a phantom predecessor / successor so the\n * curve passes exactly through every control point.\n *\n * @param points At least 1 point. An empty array yields `(0, 0)`. A single point returns that point for every `t`\n * @param t Parametric position along the closed loop. Wraps into `[0, 2π)` automatically, so values outside that range are remapped rather than rejected\n * @returns The `(x, y)` position on the spline at time `t`\n */\nexport function evaluateCatmullRom(points: Array<ControlPoint>, t: number): Point {\n const N = points.length;\n\n if (N === 0) {\n return { x: 0, y: 0 };\n }\n\n if (N === 1) {\n return { x: points[0]![0], y: points[0]![1] };\n }\n\n t = ((t % PERIOD) + PERIOD) % PERIOD;\n\n const segmentSize = PERIOD / N;\n let i = Math.floor(t / segmentSize);\n if (i >= N) {\n i = N - 1;\n }\n\n let u = (t - i * segmentSize) / segmentSize;\n u = Math.max(0, Math.min(1, u));\n\n const p0 = points[(i - 1 + N) % N]!;\n const p1 = points[i]!;\n const p2 = points[(i + 1) % N]!;\n const p3 = points[(i + 2) % N]!;\n\n return {\n x: catmullRom1D(p0[0], p1[0], p2[0], p3[0], u),\n y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u),\n };\n}\n\n/**\n * The returned curve definition produces a closed Catmull-Rom spline that\n * passes through every point in order, looping back from the last point to the first.\n *\n * @param points Array of control points in **normalized `[−1, 1]` space**,\n * matching the playground's draw-mode coordinate system.\n * ! Must contain at least 3 points.\n * @param opts Optional overrides for the returned `CurveDef`.\n * @param opts.name Display name for the curve. Defaults to `\"drawn\"`.\n * @returns A `CurveDef` with `period: 2π` and the spline evaluator as its `fn`.\n * @throws If `points` has fewer than 3 entries.\n *\n * @example\n * ```ts\n * import { createSarmal, drawCurve } from '@sarmal/core'\n *\n * const curve = drawCurve([\n * [-0.5, 0.3],\n * [ 0.2, -0.8],\n * [ 0.7, 0.4],\n * ])\n *\n * createSarmal(canvas, curve)\n * ```\n */\nexport function drawCurve(points: Array<ControlPoint>, opts?: { name?: string }): CurveDef {\n if (points.length < 3) {\n throw new Error(`drawCurve requires at least 3 points, received ${points.length}.`);\n }\n\n const first = points[0]!;\n if (points.every((p) => p[0] === first[0] && p[1] === first[1])) {\n console.warn(\n \"[sarmal].drawCurve: all control points are identical. The curve will be a single point.\",\n );\n }\n\n const maxAbs = points.reduce((m, p) => Math.max(m, Math.abs(p[0]), Math.abs(p[1])), 0);\n if (maxAbs > 2) {\n console.warn(\n `[sarmal].drawCurve: control points extend to ±${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`,\n );\n }\n\n const pts = points.map(([x, y]) => [x, y] as ControlPoint);\n\n return {\n name: opts?.name ?? \"drawn\",\n fn: (t: number) => evaluateCatmullRom(pts, t),\n period: PERIOD,\n };\n}\n","import type { ControlPoint, CurveDef } from \"../types\";\n\nimport { drawCurve } from \"../catmull-rom\";\n\nconst points: Array<ControlPoint> = [\n [-0.44, -0.45],\n [-0.53, -0.77],\n [-0.82, -0.66],\n [-0.82, -0.18],\n [-0.25, -0.04],\n [0.16, -0.49],\n [-0.03, -0.87],\n [-0.68, -0.94],\n [-0.95, -0.61],\n [-0.87, -0.0],\n [-0.34, 0.21],\n [0.27, -0.04],\n [0.87, 0.06],\n [0.87, 0.57],\n [0.32, 0.66],\n [-0.21, -0.43],\n [-0.43, -0.81],\n [-0.69, -0.84],\n [-0.87, -0.66],\n [-0.9, -0.47],\n [-0.76, -0.35],\n];\n\nexport const artemis2: CurveDef = {\n ...drawCurve(points, { name: \"Artemis II\" }),\n speed: 0.7,\n};\n"]}
@@ -1,4 +1,4 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  // src/curves/astroid.ts
4
4
  var TWO_PI = Math.PI * 2;
@@ -7,16 +7,16 @@ function astroidFn(t, _time, _params) {
7
7
  const s = Math.sin(t);
8
8
  return {
9
9
  x: c * c * c,
10
- y: s * s * s
10
+ y: s * s * s,
11
11
  };
12
12
  }
13
13
  var astroid = {
14
14
  name: "Astroid",
15
15
  fn: astroidFn,
16
16
  period: TWO_PI,
17
- speed: 1.1
17
+ speed: 1.1,
18
18
  };
19
19
 
20
20
  exports.astroid = astroid;
21
21
  //# sourceMappingURL=astroid.cjs.map
22
- //# sourceMappingURL=astroid.cjs.map
22
+ //# sourceMappingURL=astroid.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.cjs';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.cjs";
2
2
 
3
3
  /**
4
4
  * Astroid curve - a 4-cusped hypocycloid
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.js';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.js";
2
2
 
3
3
  /**
4
4
  * Astroid curve - a 4-cusped hypocycloid
@@ -5,16 +5,16 @@ function astroidFn(t, _time, _params) {
5
5
  const s = Math.sin(t);
6
6
  return {
7
7
  x: c * c * c,
8
- y: s * s * s
8
+ y: s * s * s,
9
9
  };
10
10
  }
11
11
  var astroid = {
12
12
  name: "Astroid",
13
13
  fn: astroidFn,
14
14
  period: TWO_PI,
15
- speed: 1.1
15
+ speed: 1.1,
16
16
  };
17
17
 
18
18
  export { astroid };
19
19
  //# sourceMappingURL=astroid.js.map
20
- //# sourceMappingURL=astroid.js.map
20
+ //# sourceMappingURL=astroid.js.map
@@ -1,20 +1,20 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  // src/curves/deltoid.ts
4
4
  var TWO_PI = Math.PI * 2;
5
5
  function deltoidFn(t, _time, _params) {
6
6
  return {
7
7
  x: 2 * Math.cos(t) + Math.cos(2 * t),
8
- y: 2 * Math.sin(t) - Math.sin(2 * t)
8
+ y: 2 * Math.sin(t) - Math.sin(2 * t),
9
9
  };
10
10
  }
11
11
  var deltoid = {
12
12
  name: "Deltoid",
13
13
  fn: deltoidFn,
14
14
  period: TWO_PI,
15
- speed: 0.9
15
+ speed: 0.9,
16
16
  };
17
17
 
18
18
  exports.deltoid = deltoid;
19
19
  //# sourceMappingURL=deltoid.cjs.map
20
- //# sourceMappingURL=deltoid.cjs.map
20
+ //# sourceMappingURL=deltoid.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.cjs';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.cjs";
2
2
 
3
3
  /**
4
4
  * Deltoid curve - a 3-cusped hypocycloid
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.js';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.js";
2
2
 
3
3
  /**
4
4
  * Deltoid curve - a 3-cusped hypocycloid
@@ -3,16 +3,16 @@ var TWO_PI = Math.PI * 2;
3
3
  function deltoidFn(t, _time, _params) {
4
4
  return {
5
5
  x: 2 * Math.cos(t) + Math.cos(2 * t),
6
- y: 2 * Math.sin(t) - Math.sin(2 * t)
6
+ y: 2 * Math.sin(t) - Math.sin(2 * t),
7
7
  };
8
8
  }
9
9
  var deltoid = {
10
10
  name: "Deltoid",
11
11
  fn: deltoidFn,
12
12
  period: TWO_PI,
13
- speed: 0.9
13
+ speed: 0.9,
14
14
  };
15
15
 
16
16
  export { deltoid };
17
17
  //# sourceMappingURL=deltoid.js.map
18
- //# sourceMappingURL=deltoid.js.map
18
+ //# sourceMappingURL=deltoid.js.map
@@ -1,20 +1,20 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  // src/curves/epicycloid3.ts
4
4
  var TWO_PI = Math.PI * 2;
5
5
  function epicycloid3Fn(t, _time, _params) {
6
6
  return {
7
7
  x: 4 * Math.cos(t) - Math.cos(4 * t),
8
- y: 4 * Math.sin(t) - Math.sin(4 * t)
8
+ y: 4 * Math.sin(t) - Math.sin(4 * t),
9
9
  };
10
10
  }
11
11
  var epicycloid3 = {
12
12
  name: "Epicycloid (n=3)",
13
13
  fn: epicycloid3Fn,
14
14
  period: TWO_PI,
15
- speed: 0.75
15
+ speed: 0.75,
16
16
  };
17
17
 
18
18
  exports.epicycloid3 = epicycloid3;
19
19
  //# sourceMappingURL=epicycloid3.cjs.map
20
- //# sourceMappingURL=epicycloid3.cjs.map
20
+ //# sourceMappingURL=epicycloid3.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.cjs';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.cjs";
2
2
 
3
3
  /**
4
4
  * Epicycloid with 3 cusps
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.js';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.js";
2
2
 
3
3
  /**
4
4
  * Epicycloid with 3 cusps
@@ -3,16 +3,16 @@ var TWO_PI = Math.PI * 2;
3
3
  function epicycloid3Fn(t, _time, _params) {
4
4
  return {
5
5
  x: 4 * Math.cos(t) - Math.cos(4 * t),
6
- y: 4 * Math.sin(t) - Math.sin(4 * t)
6
+ y: 4 * Math.sin(t) - Math.sin(4 * t),
7
7
  };
8
8
  }
9
9
  var epicycloid3 = {
10
10
  name: "Epicycloid (n=3)",
11
11
  fn: epicycloid3Fn,
12
12
  period: TWO_PI,
13
- speed: 0.75
13
+ speed: 0.75,
14
14
  };
15
15
 
16
16
  export { epicycloid3 };
17
17
  //# sourceMappingURL=epicycloid3.js.map
18
- //# sourceMappingURL=epicycloid3.js.map
18
+ //# sourceMappingURL=epicycloid3.js.map
@@ -1,4 +1,4 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  // src/curves/epitrochoid7.ts
4
4
  var TWO_PI = Math.PI * 2;
@@ -6,14 +6,14 @@ function epitrochoid7Fn(t, _time, _params) {
6
6
  const d = 1 + 0.55 * Math.sin(t * 0.5);
7
7
  return {
8
8
  x: 7 * Math.cos(t) - d * Math.cos(7 * t),
9
- y: 7 * Math.sin(t) - d * Math.sin(7 * t)
9
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
10
10
  };
11
11
  }
12
12
  function epitrochoid7SkeletonFn(t) {
13
13
  const d = 1.275;
14
14
  return {
15
15
  x: 7 * Math.cos(t) - d * Math.cos(7 * t),
16
- y: 7 * Math.sin(t) - d * Math.sin(7 * t)
16
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
17
17
  };
18
18
  }
19
19
  var epitrochoid7 = {
@@ -21,9 +21,9 @@ var epitrochoid7 = {
21
21
  fn: epitrochoid7Fn,
22
22
  period: TWO_PI,
23
23
  speed: 1.4,
24
- skeletonFn: epitrochoid7SkeletonFn
24
+ skeletonFn: epitrochoid7SkeletonFn,
25
25
  };
26
26
 
27
27
  exports.epitrochoid7 = epitrochoid7;
28
28
  //# sourceMappingURL=epitrochoid7.cjs.map
29
- //# sourceMappingURL=epitrochoid7.cjs.map
29
+ //# sourceMappingURL=epitrochoid7.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.cjs';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.cjs";
2
2
 
3
3
  /**
4
4
  * Epitrochoid with 7 lobes and dynamic variation
@@ -1,4 +1,4 @@
1
- import { C as CurveDef } from '../types-CknrlCAf.js';
1
+ import { C as CurveDef } from "../types-Z9i1_AQZ.js";
2
2
 
3
3
  /**
4
4
  * Epitrochoid with 7 lobes and dynamic variation
@@ -4,14 +4,14 @@ function epitrochoid7Fn(t, _time, _params) {
4
4
  const d = 1 + 0.55 * Math.sin(t * 0.5);
5
5
  return {
6
6
  x: 7 * Math.cos(t) - d * Math.cos(7 * t),
7
- y: 7 * Math.sin(t) - d * Math.sin(7 * t)
7
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
8
8
  };
9
9
  }
10
10
  function epitrochoid7SkeletonFn(t) {
11
11
  const d = 1.275;
12
12
  return {
13
13
  x: 7 * Math.cos(t) - d * Math.cos(7 * t),
14
- y: 7 * Math.sin(t) - d * Math.sin(7 * t)
14
+ y: 7 * Math.sin(t) - d * Math.sin(7 * t),
15
15
  };
16
16
  }
17
17
  var epitrochoid7 = {
@@ -19,9 +19,9 @@ var epitrochoid7 = {
19
19
  fn: epitrochoid7Fn,
20
20
  period: TWO_PI,
21
21
  speed: 1.4,
22
- skeletonFn: epitrochoid7SkeletonFn
22
+ skeletonFn: epitrochoid7SkeletonFn,
23
23
  };
24
24
 
25
25
  export { epitrochoid7 };
26
26
  //# sourceMappingURL=epitrochoid7.js.map
27
- //# sourceMappingURL=epitrochoid7.js.map
27
+ //# sourceMappingURL=epitrochoid7.js.map