@sarmal/core 0.24.0 → 0.25.0
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.
- package/dist/auto-init.cjs +113 -44
- package/dist/auto-init.cjs.map +1 -1
- package/dist/auto-init.js +113 -44
- package/dist/auto-init.js.map +1 -1
- package/dist/curves/artemis2.cjs +79 -11
- package/dist/curves/artemis2.cjs.map +1 -1
- package/dist/curves/artemis2.d.cts +1 -5
- package/dist/curves/artemis2.d.ts +1 -5
- package/dist/curves/artemis2.js +79 -11
- package/dist/curves/artemis2.js.map +1 -1
- package/dist/curves/astroid.d.cts +1 -1
- package/dist/curves/astroid.d.ts +1 -1
- package/dist/curves/deltoid.d.cts +1 -1
- package/dist/curves/deltoid.d.ts +1 -1
- package/dist/curves/epicycloid3.d.cts +1 -1
- package/dist/curves/epicycloid3.d.ts +1 -1
- package/dist/curves/epitrochoid7.d.cts +1 -1
- package/dist/curves/epitrochoid7.d.ts +1 -1
- package/dist/curves/index.cjs +103 -35
- package/dist/curves/index.cjs.map +1 -1
- package/dist/curves/index.d.cts +1 -1
- package/dist/curves/index.d.ts +1 -1
- package/dist/curves/index.js +103 -35
- package/dist/curves/index.js.map +1 -1
- package/dist/curves/lame.d.cts +1 -1
- package/dist/curves/lame.d.ts +1 -1
- package/dist/curves/lissajous32.d.cts +1 -1
- package/dist/curves/lissajous32.d.ts +1 -1
- package/dist/curves/lissajous43.d.cts +1 -1
- package/dist/curves/lissajous43.d.ts +1 -1
- package/dist/curves/rose3.d.cts +1 -1
- package/dist/curves/rose3.d.ts +1 -1
- package/dist/curves/rose5.d.cts +1 -1
- package/dist/curves/rose5.d.ts +1 -1
- package/dist/curves/rose52.d.cts +1 -1
- package/dist/curves/rose52.d.ts +1 -1
- package/dist/curves/star.d.cts +1 -1
- package/dist/curves/star.d.ts +1 -1
- package/dist/curves/star4.d.cts +1 -1
- package/dist/curves/star4.d.ts +1 -1
- package/dist/curves/star7.d.cts +1 -1
- package/dist/curves/star7.d.ts +1 -1
- package/dist/index.cjs +114 -87
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -7
- package/dist/index.d.ts +25 -7
- package/dist/index.js +114 -88
- package/dist/index.js.map +1 -1
- package/dist/{types-CknrlCAf.d.cts → types-BZpzgNau.d.cts} +19 -1
- package/dist/{types-CknrlCAf.d.ts → types-BZpzgNau.d.ts} +19 -1
- package/package.json +1 -1
package/dist/auto-init.js
CHANGED
|
@@ -196,25 +196,25 @@ function createEngine(curveDef, trailLength = 120) {
|
|
|
196
196
|
},
|
|
197
197
|
getSarmalSkeleton() {
|
|
198
198
|
const steps = Math.ceil(curve.period * POINTS_PER_PERIOD_UNIT);
|
|
199
|
-
const
|
|
199
|
+
const points2 = new Array(steps);
|
|
200
200
|
if (morphCurveB !== null && _morphAlpha !== null) {
|
|
201
201
|
for (let i = 0; i < steps; i++) {
|
|
202
202
|
const sampleT = i / (steps - 1) * curve.period;
|
|
203
203
|
const a = sampleSkeleton(curve, sampleT);
|
|
204
204
|
const tB = _morphStrategy === "normalized" ? sampleT / curve.period * morphCurveB.period : sampleT;
|
|
205
205
|
const b = sampleSkeleton(morphCurveB, tB);
|
|
206
|
-
|
|
206
|
+
points2[i] = {
|
|
207
207
|
x: a.x + (b.x - a.x) * _morphAlpha,
|
|
208
208
|
y: a.y + (b.y - a.y) * _morphAlpha
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
|
-
return
|
|
211
|
+
return points2;
|
|
212
212
|
}
|
|
213
213
|
for (let i = 0; i < steps; i++) {
|
|
214
214
|
const sampleT = i / (steps - 1) * curve.period;
|
|
215
|
-
|
|
215
|
+
points2[i] = sampleSkeleton(curve, sampleT);
|
|
216
216
|
}
|
|
217
|
-
return
|
|
217
|
+
return points2;
|
|
218
218
|
},
|
|
219
219
|
setSpeed(speed) {
|
|
220
220
|
if (!Number.isFinite(speed)) {
|
|
@@ -319,7 +319,7 @@ function computeTrailQuad(trail, i, trailCount, toX, toY, minWidth = TRAIL_MIN_W
|
|
|
319
319
|
progress
|
|
320
320
|
};
|
|
321
321
|
}
|
|
322
|
-
function computeBoundaries(pts, logicalWidth, logicalHeight) {
|
|
322
|
+
function computeBoundaries(pts, logicalWidth, logicalHeight, minPaddingPx = FIT_PADDING_MIN) {
|
|
323
323
|
if (pts.length === 0) return null;
|
|
324
324
|
const first = pts[0];
|
|
325
325
|
let minX = first.x, maxX = first.x, minY = first.y, maxY = first.y;
|
|
@@ -346,8 +346,8 @@ function computeBoundaries(pts, logicalWidth, logicalHeight) {
|
|
|
346
346
|
}
|
|
347
347
|
const scaleXProportional = logicalWidth / (w * (1 + FIT_PADDING * 2));
|
|
348
348
|
const scaleYProportional = logicalHeight / (h * (1 + FIT_PADDING * 2));
|
|
349
|
-
const scaleXMinPadding = (logicalWidth -
|
|
350
|
-
const scaleYMinPadding = (logicalHeight -
|
|
349
|
+
const scaleXMinPadding = (logicalWidth - minPaddingPx * 2) / w;
|
|
350
|
+
const scaleYMinPadding = (logicalHeight - minPaddingPx * 2) / h;
|
|
351
351
|
const scale = Math.min(
|
|
352
352
|
scaleXProportional,
|
|
353
353
|
scaleYProportional,
|
|
@@ -367,7 +367,8 @@ function enginePassthroughs(engine) {
|
|
|
367
367
|
setSpeed: engine.setSpeed,
|
|
368
368
|
getSpeed: engine.getSpeed,
|
|
369
369
|
resetSpeed: engine.resetSpeed,
|
|
370
|
-
setSpeedOver: engine.setSpeedOver
|
|
370
|
+
setSpeedOver: engine.setSpeedOver,
|
|
371
|
+
getSarmalSkeleton: engine.getSarmalSkeleton
|
|
371
372
|
};
|
|
372
373
|
}
|
|
373
374
|
function hexToRgb(hex) {
|
|
@@ -1224,26 +1225,94 @@ function createSarmalSVG(container, curveDef, options) {
|
|
|
1224
1225
|
return createSVGRenderer({ container, engine, ...rendererOpts });
|
|
1225
1226
|
}
|
|
1226
1227
|
|
|
1227
|
-
// src/
|
|
1228
|
-
var
|
|
1229
|
-
function
|
|
1230
|
-
const
|
|
1231
|
-
const
|
|
1232
|
-
|
|
1228
|
+
// src/catmull-rom.ts
|
|
1229
|
+
var PERIOD = 2 * Math.PI;
|
|
1230
|
+
function catmullRom1D(p0, p1, p2, p3, u) {
|
|
1231
|
+
const u2 = u * u;
|
|
1232
|
+
const u3 = u2 * u;
|
|
1233
|
+
return 0.5 * (2 * p1 + (-p0 + p2) * u + (2 * p0 - 5 * p1 + 4 * p2 - p3) * u2 + (-p0 + 3 * p1 - 3 * p2 + p3) * u3);
|
|
1234
|
+
}
|
|
1235
|
+
function evaluateCatmullRom(points2, t) {
|
|
1236
|
+
const N = points2.length;
|
|
1237
|
+
if (N === 0) {
|
|
1238
|
+
return { x: 0, y: 0 };
|
|
1239
|
+
}
|
|
1240
|
+
if (N === 1) {
|
|
1241
|
+
return { x: points2[0][0], y: points2[0][1] };
|
|
1242
|
+
}
|
|
1243
|
+
t = (t % PERIOD + PERIOD) % PERIOD;
|
|
1244
|
+
const segmentSize = PERIOD / N;
|
|
1245
|
+
let i = Math.floor(t / segmentSize);
|
|
1246
|
+
if (i >= N) {
|
|
1247
|
+
i = N - 1;
|
|
1248
|
+
}
|
|
1249
|
+
let u = (t - i * segmentSize) / segmentSize;
|
|
1250
|
+
u = Math.max(0, Math.min(1, u));
|
|
1251
|
+
const p0 = points2[(i - 1 + N) % N];
|
|
1252
|
+
const p1 = points2[i];
|
|
1253
|
+
const p2 = points2[(i + 1) % N];
|
|
1254
|
+
const p3 = points2[(i + 2) % N];
|
|
1255
|
+
return {
|
|
1256
|
+
x: catmullRom1D(p0[0], p1[0], p2[0], p3[0], u),
|
|
1257
|
+
y: catmullRom1D(p0[1], p1[1], p2[1], p3[1], u)
|
|
1258
|
+
};
|
|
1259
|
+
}
|
|
1260
|
+
function drawCurve(points2, opts) {
|
|
1261
|
+
if (points2.length < 3) {
|
|
1262
|
+
throw new Error(`drawCurve requires at least 3 points, received ${points2.length}.`);
|
|
1263
|
+
}
|
|
1264
|
+
const first = points2[0];
|
|
1265
|
+
if (points2.every((p) => p[0] === first[0] && p[1] === first[1])) {
|
|
1266
|
+
console.warn(
|
|
1267
|
+
"[sarmal].drawCurve: all control points are identical. The curve will be a single point."
|
|
1268
|
+
);
|
|
1269
|
+
}
|
|
1270
|
+
const maxAbs = points2.reduce((m, p) => Math.max(m, Math.abs(p[0]), Math.abs(p[1])), 0);
|
|
1271
|
+
if (maxAbs > 2) {
|
|
1272
|
+
console.warn(
|
|
1273
|
+
`[sarmal].drawCurve: control points extend to \xB1${maxAbs.toFixed(1)}, which may render off-screen. Coordinates should be in [-1, 1].`
|
|
1274
|
+
);
|
|
1275
|
+
}
|
|
1276
|
+
const pts = points2.map(([x, y]) => [x, y]);
|
|
1233
1277
|
return {
|
|
1234
|
-
|
|
1235
|
-
|
|
1278
|
+
name: opts?.name ?? "drawn",
|
|
1279
|
+
fn: (t) => evaluateCatmullRom(pts, t),
|
|
1280
|
+
period: PERIOD,
|
|
1281
|
+
kind: "drawn"
|
|
1236
1282
|
};
|
|
1237
1283
|
}
|
|
1284
|
+
|
|
1285
|
+
// src/curves/artemis2.ts
|
|
1286
|
+
var points = [
|
|
1287
|
+
[-0.44, -0.45],
|
|
1288
|
+
[-0.53, -0.77],
|
|
1289
|
+
[-0.82, -0.66],
|
|
1290
|
+
[-0.82, -0.18],
|
|
1291
|
+
[-0.25, -0.04],
|
|
1292
|
+
[0.16, -0.49],
|
|
1293
|
+
[-0.03, -0.87],
|
|
1294
|
+
[-0.68, -0.94],
|
|
1295
|
+
[-0.95, -0.61],
|
|
1296
|
+
[-0.87, -0],
|
|
1297
|
+
[-0.34, 0.21],
|
|
1298
|
+
[0.27, -0.04],
|
|
1299
|
+
[0.87, 0.06],
|
|
1300
|
+
[0.87, 0.57],
|
|
1301
|
+
[0.32, 0.66],
|
|
1302
|
+
[-0.21, -0.43],
|
|
1303
|
+
[-0.43, -0.81],
|
|
1304
|
+
[-0.69, -0.84],
|
|
1305
|
+
[-0.87, -0.66],
|
|
1306
|
+
[-0.9, -0.47],
|
|
1307
|
+
[-0.76, -0.35]
|
|
1308
|
+
];
|
|
1238
1309
|
var artemis2 = {
|
|
1239
|
-
name: "Artemis II",
|
|
1240
|
-
fn: artemis2Fn,
|
|
1241
|
-
period: TWO_PI2,
|
|
1310
|
+
...drawCurve(points, { name: "Artemis II" }),
|
|
1242
1311
|
speed: 0.7
|
|
1243
1312
|
};
|
|
1244
1313
|
|
|
1245
1314
|
// src/curves/astroid.ts
|
|
1246
|
-
var
|
|
1315
|
+
var TWO_PI2 = Math.PI * 2;
|
|
1247
1316
|
function astroidFn(t, _time, _params) {
|
|
1248
1317
|
const c = Math.cos(t);
|
|
1249
1318
|
const s = Math.sin(t);
|
|
@@ -1255,12 +1324,12 @@ function astroidFn(t, _time, _params) {
|
|
|
1255
1324
|
var astroid = {
|
|
1256
1325
|
name: "Astroid",
|
|
1257
1326
|
fn: astroidFn,
|
|
1258
|
-
period:
|
|
1327
|
+
period: TWO_PI2,
|
|
1259
1328
|
speed: 1.1
|
|
1260
1329
|
};
|
|
1261
1330
|
|
|
1262
1331
|
// src/curves/deltoid.ts
|
|
1263
|
-
var
|
|
1332
|
+
var TWO_PI3 = Math.PI * 2;
|
|
1264
1333
|
function deltoidFn(t, _time, _params) {
|
|
1265
1334
|
return {
|
|
1266
1335
|
x: 2 * Math.cos(t) + Math.cos(2 * t),
|
|
@@ -1270,12 +1339,12 @@ function deltoidFn(t, _time, _params) {
|
|
|
1270
1339
|
var deltoid = {
|
|
1271
1340
|
name: "Deltoid",
|
|
1272
1341
|
fn: deltoidFn,
|
|
1273
|
-
period:
|
|
1342
|
+
period: TWO_PI3,
|
|
1274
1343
|
speed: 0.9
|
|
1275
1344
|
};
|
|
1276
1345
|
|
|
1277
1346
|
// src/curves/epicycloid3.ts
|
|
1278
|
-
var
|
|
1347
|
+
var TWO_PI4 = Math.PI * 2;
|
|
1279
1348
|
function epicycloid3Fn(t, _time, _params) {
|
|
1280
1349
|
return {
|
|
1281
1350
|
x: 4 * Math.cos(t) - Math.cos(4 * t),
|
|
@@ -1285,12 +1354,12 @@ function epicycloid3Fn(t, _time, _params) {
|
|
|
1285
1354
|
var epicycloid3 = {
|
|
1286
1355
|
name: "Epicycloid (n=3)",
|
|
1287
1356
|
fn: epicycloid3Fn,
|
|
1288
|
-
period:
|
|
1357
|
+
period: TWO_PI4,
|
|
1289
1358
|
speed: 0.75
|
|
1290
1359
|
};
|
|
1291
1360
|
|
|
1292
1361
|
// src/curves/epitrochoid7.ts
|
|
1293
|
-
var
|
|
1362
|
+
var TWO_PI5 = Math.PI * 2;
|
|
1294
1363
|
function epitrochoid7Fn(t, _time, _params) {
|
|
1295
1364
|
const d = 1 + 0.55 * Math.sin(t * 0.5);
|
|
1296
1365
|
return {
|
|
@@ -1308,13 +1377,13 @@ function epitrochoid7SkeletonFn(t) {
|
|
|
1308
1377
|
var epitrochoid7 = {
|
|
1309
1378
|
name: "Epitrochoid",
|
|
1310
1379
|
fn: epitrochoid7Fn,
|
|
1311
|
-
period:
|
|
1380
|
+
period: TWO_PI5,
|
|
1312
1381
|
speed: 1.4,
|
|
1313
1382
|
skeletonFn: epitrochoid7SkeletonFn
|
|
1314
1383
|
};
|
|
1315
1384
|
|
|
1316
1385
|
// src/curves/lissajous32.ts
|
|
1317
|
-
var
|
|
1386
|
+
var TWO_PI6 = Math.PI * 2;
|
|
1318
1387
|
function lissajous32Fn(t, time, _params) {
|
|
1319
1388
|
const phi = time * 0.45;
|
|
1320
1389
|
return {
|
|
@@ -1325,13 +1394,13 @@ function lissajous32Fn(t, time, _params) {
|
|
|
1325
1394
|
var lissajous32 = {
|
|
1326
1395
|
name: "Lissajous 3:2",
|
|
1327
1396
|
fn: lissajous32Fn,
|
|
1328
|
-
period:
|
|
1397
|
+
period: TWO_PI6,
|
|
1329
1398
|
speed: 2,
|
|
1330
1399
|
skeleton: "live"
|
|
1331
1400
|
};
|
|
1332
1401
|
|
|
1333
1402
|
// src/curves/lissajous43.ts
|
|
1334
|
-
var
|
|
1403
|
+
var TWO_PI7 = Math.PI * 2;
|
|
1335
1404
|
function lissajous43Fn(t, time, _params) {
|
|
1336
1405
|
const phi = time * 0.38;
|
|
1337
1406
|
return {
|
|
@@ -1342,13 +1411,13 @@ function lissajous43Fn(t, time, _params) {
|
|
|
1342
1411
|
var lissajous43 = {
|
|
1343
1412
|
name: "Lissajous 4:3",
|
|
1344
1413
|
fn: lissajous43Fn,
|
|
1345
|
-
period:
|
|
1414
|
+
period: TWO_PI7,
|
|
1346
1415
|
speed: 1.8,
|
|
1347
1416
|
skeleton: "live"
|
|
1348
1417
|
};
|
|
1349
1418
|
|
|
1350
1419
|
// src/curves/lame.ts
|
|
1351
|
-
var
|
|
1420
|
+
var TWO_PI8 = Math.PI * 2;
|
|
1352
1421
|
function lameFn(t, time, _params) {
|
|
1353
1422
|
const p = 1.75 + 1.25 * Math.sin(time * 0.48);
|
|
1354
1423
|
const c = Math.cos(t), s = Math.sin(t);
|
|
@@ -1360,13 +1429,13 @@ function lameFn(t, time, _params) {
|
|
|
1360
1429
|
var lame = {
|
|
1361
1430
|
name: "Lam\xE9 Curve",
|
|
1362
1431
|
fn: lameFn,
|
|
1363
|
-
period:
|
|
1432
|
+
period: TWO_PI8,
|
|
1364
1433
|
speed: 1,
|
|
1365
1434
|
skeleton: "live"
|
|
1366
1435
|
};
|
|
1367
1436
|
|
|
1368
1437
|
// src/curves/rose3.ts
|
|
1369
|
-
var
|
|
1438
|
+
var TWO_PI9 = Math.PI * 2;
|
|
1370
1439
|
function rose3Fn(t, _time, _params) {
|
|
1371
1440
|
const r = Math.cos(3 * t);
|
|
1372
1441
|
return {
|
|
@@ -1377,12 +1446,12 @@ function rose3Fn(t, _time, _params) {
|
|
|
1377
1446
|
var rose3 = {
|
|
1378
1447
|
name: "Rose (n=3)",
|
|
1379
1448
|
fn: rose3Fn,
|
|
1380
|
-
period:
|
|
1449
|
+
period: TWO_PI9,
|
|
1381
1450
|
speed: 1.15
|
|
1382
1451
|
};
|
|
1383
1452
|
|
|
1384
1453
|
// src/curves/rose5.ts
|
|
1385
|
-
var
|
|
1454
|
+
var TWO_PI10 = Math.PI * 2;
|
|
1386
1455
|
function rose5Fn(t, _time, _params) {
|
|
1387
1456
|
const r = Math.cos(5 * t);
|
|
1388
1457
|
return {
|
|
@@ -1393,7 +1462,7 @@ function rose5Fn(t, _time, _params) {
|
|
|
1393
1462
|
var rose5 = {
|
|
1394
1463
|
name: "Rose (n=5)",
|
|
1395
1464
|
fn: rose5Fn,
|
|
1396
|
-
period:
|
|
1465
|
+
period: TWO_PI10,
|
|
1397
1466
|
speed: 1
|
|
1398
1467
|
};
|
|
1399
1468
|
|
|
@@ -1414,7 +1483,7 @@ var rose52 = {
|
|
|
1414
1483
|
};
|
|
1415
1484
|
|
|
1416
1485
|
// src/curves/star.ts
|
|
1417
|
-
var
|
|
1486
|
+
var TWO_PI11 = Math.PI * 2;
|
|
1418
1487
|
function starFn(t, _time, _params) {
|
|
1419
1488
|
const r = Math.abs(Math.cos(5 / 2 * t)) + 0.35 * Math.abs(Math.cos(15 / 2 * t)) + 0.15 * Math.abs(Math.cos(25 / 2 * t));
|
|
1420
1489
|
return {
|
|
@@ -1425,12 +1494,12 @@ function starFn(t, _time, _params) {
|
|
|
1425
1494
|
var star = {
|
|
1426
1495
|
name: "Star",
|
|
1427
1496
|
fn: starFn,
|
|
1428
|
-
period:
|
|
1497
|
+
period: TWO_PI11,
|
|
1429
1498
|
speed: 1
|
|
1430
1499
|
};
|
|
1431
1500
|
|
|
1432
1501
|
// src/curves/star4.ts
|
|
1433
|
-
var
|
|
1502
|
+
var TWO_PI12 = Math.PI * 2;
|
|
1434
1503
|
function star4Fn(t, _time, _params) {
|
|
1435
1504
|
const r = Math.abs(Math.cos(2 * t)) + 0.35 * Math.abs(Math.cos(6 * t)) + 0.15 * Math.abs(Math.cos(10 * t));
|
|
1436
1505
|
return {
|
|
@@ -1441,12 +1510,12 @@ function star4Fn(t, _time, _params) {
|
|
|
1441
1510
|
var star4 = {
|
|
1442
1511
|
name: "Star (4-arm)",
|
|
1443
1512
|
fn: star4Fn,
|
|
1444
|
-
period:
|
|
1513
|
+
period: TWO_PI12,
|
|
1445
1514
|
speed: 1
|
|
1446
1515
|
};
|
|
1447
1516
|
|
|
1448
1517
|
// src/curves/star7.ts
|
|
1449
|
-
var
|
|
1518
|
+
var TWO_PI13 = Math.PI * 2;
|
|
1450
1519
|
function star7Fn(t, _time, _params) {
|
|
1451
1520
|
const r = Math.abs(Math.cos(7 / 2 * t)) + 0.35 * Math.abs(Math.cos(21 / 2 * t)) + 0.15 * Math.abs(Math.cos(35 / 2 * t));
|
|
1452
1521
|
return {
|
|
@@ -1457,7 +1526,7 @@ function star7Fn(t, _time, _params) {
|
|
|
1457
1526
|
var star7 = {
|
|
1458
1527
|
name: "Star (7-arm)",
|
|
1459
1528
|
fn: star7Fn,
|
|
1460
|
-
period:
|
|
1529
|
+
period: TWO_PI13,
|
|
1461
1530
|
speed: 1
|
|
1462
1531
|
};
|
|
1463
1532
|
|