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