@weasel-js/geom 1.10.0 → 1.11.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/README.md +140 -16
- package/dist/3d/index.d.ts +29 -2
- package/dist/3d/index.js +49 -1
- package/dist/3d/index.js.map +1 -1
- package/dist/booleans/index.d.ts +34 -10
- package/dist/booleans/index.js +344 -352
- package/dist/booleans/index.js.map +1 -1
- package/dist/{chunk-MDT7F32A.js → chunk-6XSJY3TC.js} +10 -39
- package/dist/chunk-6XSJY3TC.js.map +1 -0
- package/dist/chunk-7KLJZFBY.js +573 -0
- package/dist/chunk-7KLJZFBY.js.map +1 -0
- package/dist/chunk-B53BERKG.js +386 -0
- package/dist/chunk-B53BERKG.js.map +1 -0
- package/dist/chunk-CE7IY7TB.js +104 -0
- package/dist/chunk-CE7IY7TB.js.map +1 -0
- package/dist/chunk-HGF5OVEN.js +129 -0
- package/dist/chunk-HGF5OVEN.js.map +1 -0
- package/dist/chunk-J2O2B54M.js +800 -0
- package/dist/chunk-J2O2B54M.js.map +1 -0
- package/dist/chunk-Q66NA2FU.js +174 -0
- package/dist/chunk-Q66NA2FU.js.map +1 -0
- package/dist/chunk-SASMXDBE.js +443 -0
- package/dist/chunk-SASMXDBE.js.map +1 -0
- package/dist/chunk-UI3FUWXM.js +533 -0
- package/dist/chunk-UI3FUWXM.js.map +1 -0
- package/dist/curvature-PkoLduGc.d.ts +454 -0
- package/dist/curves/index.d.ts +14 -5
- package/dist/curves/index.js +33 -111
- package/dist/curves/index.js.map +1 -1
- package/dist/index.d.ts +1697 -205
- package/dist/index.js +4729 -1308
- package/dist/index.js.map +1 -1
- package/dist/nd/index.d.ts +91 -27
- package/dist/nd/index.js +282 -0
- package/dist/nd/index.js.map +1 -1
- package/dist/path-BW8d_2RY.d.ts +157 -0
- package/dist/portCurve-C5HDWuuV.d.ts +30 -0
- package/dist/tessellate/index.d.ts +18 -4
- package/dist/tessellate/index.js +21 -277
- package/dist/tessellate/index.js.map +1 -1
- package/dist/warp/index.d.ts +252 -0
- package/dist/warp/index.js +1316 -0
- package/dist/warp/index.js.map +1 -0
- package/package.json +5 -1
- package/dist/chunk-MDT7F32A.js.map +0 -1
- package/dist/chunk-OXH3NOXC.js +0 -62
- package/dist/chunk-OXH3NOXC.js.map +0 -1
- package/dist/chunk-URQMDR6Q.js +0 -80
- package/dist/chunk-URQMDR6Q.js.map +0 -1
- package/dist/chunk-WQMYOCFB.js +0 -167
- package/dist/chunk-WQMYOCFB.js.map +0 -1
- package/dist/chunk-XS6ERH3X.js +0 -34
- package/dist/chunk-XS6ERH3X.js.map +0 -1
- package/dist/cubicMath-CFXbq6vp.d.ts +0 -116
- package/dist/path-Bf9KeVxC.d.ts +0 -44
package/dist/curves/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import
|
|
1
|
+
import { cubicCurvatureAt, SPIRO_KINDS, eulerCurvatureAt, spiroToPath, eulerPointAt, solveSpiro } from '../chunk-UI3FUWXM.js';
|
|
2
|
+
import '../chunk-Q66NA2FU.js';
|
|
3
|
+
import '../chunk-CE7IY7TB.js';
|
|
4
|
+
import { PATH_M, cubicPointAt, PATH_L, PATH_Q, PATH_C } from '../chunk-B53BERKG.js';
|
|
4
5
|
|
|
5
6
|
// src/curves/anchorHandles.ts
|
|
6
7
|
var DEFAULT_HANDLE_FRACTION = 1 / 3;
|
|
@@ -53,20 +54,6 @@ function segmentAt(anchors, t) {
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
// src/curves/bezierCubic.ts
|
|
56
|
-
function cubicDeriv1(p0, p1, p2, p3, t) {
|
|
57
|
-
const u = 1 - t;
|
|
58
|
-
return {
|
|
59
|
-
x: 3 * u * u * (p1.x - p0.x) + 6 * u * t * (p2.x - p1.x) + 3 * t * t * (p3.x - p2.x),
|
|
60
|
-
y: 3 * u * u * (p1.y - p0.y) + 6 * u * t * (p2.y - p1.y) + 3 * t * t * (p3.y - p2.y)
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
function cubicDeriv2(p0, p1, p2, p3, t) {
|
|
64
|
-
const u = 1 - t;
|
|
65
|
-
return {
|
|
66
|
-
x: 6 * u * (p2.x - 2 * p1.x + p0.x) + 6 * t * (p3.x - 2 * p2.x + p1.x),
|
|
67
|
-
y: 6 * u * (p2.y - 2 * p1.y + p0.y) + 6 * t * (p3.y - 2 * p2.y + p1.y)
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
57
|
var bezierCubic = {
|
|
71
58
|
kind: "bezierCubic",
|
|
72
59
|
label: "Cubic Bezier",
|
|
@@ -102,16 +89,7 @@ var bezierCubic = {
|
|
|
102
89
|
const { segIdx, localT } = segmentAt(anchors, t);
|
|
103
90
|
const a = anchors[segIdx];
|
|
104
91
|
const b = anchors[segIdx + 1];
|
|
105
|
-
|
|
106
|
-
const p1 = defaultOutHandle(anchors, segIdx);
|
|
107
|
-
const p2 = defaultInHandle(anchors, segIdx);
|
|
108
|
-
const p3 = b;
|
|
109
|
-
const d1 = cubicDeriv1(p0, p1, p2, p3, localT);
|
|
110
|
-
const d2 = cubicDeriv2(p0, p1, p2, p3, localT);
|
|
111
|
-
const num = d1.x * d2.y - d1.y * d2.x;
|
|
112
|
-
const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);
|
|
113
|
-
if (den < 1e-12) return 0;
|
|
114
|
-
return num / den;
|
|
92
|
+
return cubicCurvatureAt(a, defaultOutHandle(anchors, segIdx), defaultInHandle(anchors, segIdx), b, localT);
|
|
115
93
|
},
|
|
116
94
|
discriminators(anchors) {
|
|
117
95
|
const out = [];
|
|
@@ -336,100 +314,30 @@ var nurbs = {
|
|
|
336
314
|
};
|
|
337
315
|
|
|
338
316
|
// src/curves/spiro.ts
|
|
339
|
-
var
|
|
340
|
-
function
|
|
341
|
-
|
|
342
|
-
}
|
|
343
|
-
function smoothTangent2(anchors, i) {
|
|
344
|
-
if (isCorner(anchors[i])) return null;
|
|
345
|
-
const prev = i > 0 ? anchors[i - 1] : null;
|
|
346
|
-
const next = i + 1 < anchors.length ? anchors[i + 1] : null;
|
|
347
|
-
if (!prev && !next) return null;
|
|
348
|
-
if (!prev) {
|
|
349
|
-
return { x: next.x - anchors[i].x, y: next.y - anchors[i].y };
|
|
350
|
-
}
|
|
351
|
-
if (!next) {
|
|
352
|
-
return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };
|
|
353
|
-
}
|
|
354
|
-
const inDX = anchors[i].x - prev.x;
|
|
355
|
-
const inDY = anchors[i].y - prev.y;
|
|
356
|
-
const outDX = next.x - anchors[i].x;
|
|
357
|
-
const outDY = next.y - anchors[i].y;
|
|
358
|
-
const inLen = Math.hypot(inDX, inDY) || 1;
|
|
359
|
-
const outLen = Math.hypot(outDX, outDY) || 1;
|
|
360
|
-
return {
|
|
361
|
-
x: inDX / inLen + outDX / outLen,
|
|
362
|
-
y: inDY / inLen + outDY / outLen
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
function controlsFor(anchors, i) {
|
|
366
|
-
const a = anchors[i];
|
|
367
|
-
const b = anchors[i + 1];
|
|
368
|
-
const edge = { x: b.x - a.x, y: b.y - a.y };
|
|
369
|
-
const edgeLen = Math.hypot(edge.x, edge.y) || 1;
|
|
370
|
-
const tA = smoothTangent2(anchors, i);
|
|
371
|
-
const tB = smoothTangent2(anchors, i + 1);
|
|
372
|
-
const outA = tA ?? edge;
|
|
373
|
-
const outB = tB ?? edge;
|
|
374
|
-
const outALen = Math.hypot(outA.x, outA.y) || 1;
|
|
375
|
-
const outBLen = Math.hypot(outB.x, outB.y) || 1;
|
|
376
|
-
const handleLen = edgeLen * TANGENT_SCALE;
|
|
377
|
-
return {
|
|
378
|
-
c1: {
|
|
379
|
-
x: a.x + outA.x / outALen * handleLen,
|
|
380
|
-
y: a.y + outA.y / outALen * handleLen
|
|
381
|
-
},
|
|
382
|
-
c2: {
|
|
383
|
-
x: b.x - outB.x / outBLen * handleLen,
|
|
384
|
-
y: b.y - outB.y / outBLen * handleLen
|
|
385
|
-
}
|
|
386
|
-
};
|
|
317
|
+
var pointsOf = (anchors) => anchors.map((a) => ({ x: a.x, y: a.y, kind: a.spiroType ?? "smooth" }));
|
|
318
|
+
function locate(anchors, t) {
|
|
319
|
+
const { segIdx, localT } = segmentAt(anchors, t);
|
|
320
|
+
return { seg: solveSpiro(pointsOf(anchors), false)[segIdx], s: localT };
|
|
387
321
|
}
|
|
388
322
|
var spiro = {
|
|
389
323
|
kind: "spiro",
|
|
390
|
-
label: "Spiro (\u03BA-curves
|
|
324
|
+
label: "Spiro (\u03BA-curves)",
|
|
391
325
|
evaluate(anchors, t) {
|
|
392
326
|
if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };
|
|
393
|
-
const {
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
const { c1, c2 } = controlsFor(anchors, segIdx);
|
|
397
|
-
return cubicPointAt(a, c1, c2, b, localT);
|
|
327
|
+
const { seg, s } = locate(anchors, t);
|
|
328
|
+
if (seg.spiral) return eulerPointAt(seg.spiral, s);
|
|
329
|
+
return { x: seg.from.x + (seg.to.x - seg.from.x) * s, y: seg.from.y + (seg.to.y - seg.from.y) * s };
|
|
398
330
|
},
|
|
399
331
|
toPath(anchors) {
|
|
400
332
|
if (anchors.length < 2) {
|
|
401
333
|
return { kind: "polygon", commands: new Uint8Array(), coords: new Float32Array(), fillRule: "nonzero" };
|
|
402
334
|
}
|
|
403
|
-
|
|
404
|
-
const xs = [anchors[0].x, anchors[0].y];
|
|
405
|
-
for (let i = 0; i + 1 < anchors.length; i++) {
|
|
406
|
-
const b = anchors[i + 1];
|
|
407
|
-
const { c1, c2 } = controlsFor(anchors, i);
|
|
408
|
-
cmds.push(PATH_C);
|
|
409
|
-
xs.push(c1.x, c1.y, c2.x, c2.y, b.x, b.y);
|
|
410
|
-
}
|
|
411
|
-
return {
|
|
412
|
-
kind: "polygon",
|
|
413
|
-
commands: new Uint8Array(cmds),
|
|
414
|
-
coords: new Float32Array(xs),
|
|
415
|
-
fillRule: "nonzero"
|
|
416
|
-
};
|
|
335
|
+
return spiroToPath([{ points: pointsOf(anchors), closed: false }]).path;
|
|
417
336
|
},
|
|
418
337
|
curvatureAt(anchors, t) {
|
|
419
338
|
if (anchors.length < 2) return 0;
|
|
420
|
-
const {
|
|
421
|
-
|
|
422
|
-
const b = anchors[segIdx + 1];
|
|
423
|
-
const { c1, c2 } = controlsFor(anchors, segIdx);
|
|
424
|
-
const u = 1 - localT;
|
|
425
|
-
const d1x = 3 * u * u * (c1.x - a.x) + 6 * u * localT * (c2.x - c1.x) + 3 * localT * localT * (b.x - c2.x);
|
|
426
|
-
const d1y = 3 * u * u * (c1.y - a.y) + 6 * u * localT * (c2.y - c1.y) + 3 * localT * localT * (b.y - c2.y);
|
|
427
|
-
const d2x = 6 * u * (c2.x - 2 * c1.x + a.x) + 6 * localT * (b.x - 2 * c2.x + c1.x);
|
|
428
|
-
const d2y = 6 * u * (c2.y - 2 * c1.y + a.y) + 6 * localT * (b.y - 2 * c2.y + c1.y);
|
|
429
|
-
const num = d1x * d2y - d1y * d2x;
|
|
430
|
-
const den = Math.pow(d1x * d1x + d1y * d1y, 1.5);
|
|
431
|
-
if (den < 1e-12) return 0;
|
|
432
|
-
return num / den;
|
|
339
|
+
const { seg, s } = locate(anchors, t);
|
|
340
|
+
return seg.spiral ? eulerCurvatureAt(seg.spiral, s) : 0;
|
|
433
341
|
},
|
|
434
342
|
discriminators(anchors) {
|
|
435
343
|
const out = [];
|
|
@@ -439,14 +347,28 @@ var spiro = {
|
|
|
439
347
|
label: `t${i}`,
|
|
440
348
|
anchorIndex: i,
|
|
441
349
|
field: "spiroType",
|
|
442
|
-
options:
|
|
443
|
-
value: anchors[i].spiroType ?? "
|
|
350
|
+
options: SPIRO_KINDS,
|
|
351
|
+
value: anchors[i].spiroType ?? "smooth"
|
|
444
352
|
});
|
|
445
353
|
}
|
|
446
354
|
return out;
|
|
447
355
|
}
|
|
448
356
|
};
|
|
449
357
|
|
|
358
|
+
// src/curves/curvatureSource.ts
|
|
359
|
+
var TANGENT_STEP = 1e-4;
|
|
360
|
+
function curvatureSourceOf(rep, anchors) {
|
|
361
|
+
return {
|
|
362
|
+
pointAt: (t) => rep.evaluate(anchors, t),
|
|
363
|
+
tangentAt: (t) => {
|
|
364
|
+
const a = rep.evaluate(anchors, Math.max(0, t - TANGENT_STEP));
|
|
365
|
+
const b = rep.evaluate(anchors, Math.min(1, t + TANGENT_STEP));
|
|
366
|
+
return { x: b.x - a.x, y: b.y - a.y };
|
|
367
|
+
},
|
|
368
|
+
curvatureAt: (t) => rep.curvatureAt(anchors, t)
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
|
|
450
372
|
// src/curves/index.ts
|
|
451
373
|
var CURVE_REPS = {
|
|
452
374
|
bezierCubic,
|
|
@@ -455,6 +377,6 @@ var CURVE_REPS = {
|
|
|
455
377
|
spiro
|
|
456
378
|
};
|
|
457
379
|
|
|
458
|
-
export { CURVE_REPS, bezierCubic, bezierQuadratic, nurbs, spiro };
|
|
380
|
+
export { CURVE_REPS, bezierCubic, bezierQuadratic, curvatureSourceOf, nurbs, spiro };
|
|
459
381
|
//# sourceMappingURL=index.js.map
|
|
460
382
|
//# sourceMappingURL=index.js.map
|
package/dist/curves/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/curves/anchorHandles.ts","../../src/curves/bezierCubic.ts","../../src/curves/bezierQuadratic.ts","../../src/curves/nurbs.ts","../../src/curves/spiro.ts","../../src/curves/index.ts"],"names":["smoothTangent"],"mappings":"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","file":"index.js","sourcesContent":["import type { SharedAnchor } from './types';\n\nconst DEFAULT_HANDLE_FRACTION = 1 / 3;\n\n/** Smooth tangent at anchor i derived from neighbor edges. Average the\n * incoming and outgoing edge directions weighted by inverse edge length\n * (centripetal-style) so short edges don't dominate. At endpoints the\n * single available edge wins. Without this, a handle colinear with one\n * segment produces a degenerate (visually straight) cubic. */\nfunction smoothTangent(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const prev = i > 0 ? anchors[i - 1] : null;\n const next = i + 1 < anchors.length ? anchors[i + 1] : null;\n if (!prev && next) return { x: next.x - anchors[i].x, y: next.y - anchors[i].y };\n if (prev && !next) return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };\n if (prev && next) {\n const inLen = Math.hypot(anchors[i].x - prev.x, anchors[i].y - prev.y) || 1;\n const outLen = Math.hypot(next.x - anchors[i].x, next.y - anchors[i].y) || 1;\n return {\n x: (anchors[i].x - prev.x) / inLen + (next.x - anchors[i].x) / outLen,\n y: (anchors[i].y - prev.y) / inLen + (next.y - anchors[i].y) / outLen,\n };\n }\n return { x: 0, y: 0 };\n}\n\nexport function defaultOutHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const a = anchors[i];\n if (a.outHandle) return a.outHandle;\n const next = anchors[i + 1];\n const edgeLen = Math.hypot(next.x - a.x, next.y - a.y);\n const t = smoothTangent(anchors, i);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: a.x + (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: a.y + (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nexport function defaultInHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const b = anchors[i + 1];\n if (b.inHandle) return b.inHandle;\n const a = anchors[i];\n const edgeLen = Math.hypot(b.x - a.x, b.y - a.y);\n const t = smoothTangent(anchors, i + 1);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: b.x - (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: b.y - (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nexport function segmentAt(anchors: SharedAnchor[], t: number): { segIdx: number; localT: number } {\n if (anchors.length < 2) return { segIdx: 0, localT: 0 };\n const segments = anchors.length - 1;\n const scaled = Math.min(Math.max(t, 0), 1) * segments;\n const segIdx = Math.min(Math.floor(scaled), segments - 1);\n const localT = scaled - segIdx;\n return { segIdx, localT };\n}\n","import type { CurveRepresentation, Discriminator } from './types';\nimport { defaultInHandle, defaultOutHandle, segmentAt } from './anchorHandles';\nimport { PATH_C, PATH_M } from '../commands';\nimport { cubicPointAt } from '../paths/cubicMath';\n\nfunction cubicDeriv1(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n p3: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 3 * u * u * (p1.x - p0.x) + 6 * u * t * (p2.x - p1.x) + 3 * t * t * (p3.x - p2.x),\n y: 3 * u * u * (p1.y - p0.y) + 6 * u * t * (p2.y - p1.y) + 3 * t * t * (p3.y - p2.y),\n };\n}\n\nfunction cubicDeriv2(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n p3: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 6 * u * (p2.x - 2 * p1.x + p0.x) + 6 * t * (p3.x - 2 * p2.x + p1.x),\n y: 6 * u * (p2.y - 2 * p1.y + p0.y) + 6 * t * (p3.y - 2 * p2.y + p1.y),\n };\n}\n\n/** Cubic bezier: each segment takes two control handles. The familiar pen-tool curve, and what SVG path data stores natively. */\nexport const bezierCubic: CurveRepresentation = {\n kind: 'bezierCubic',\n label: 'Cubic Bezier',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n return cubicPointAt(a, defaultOutHandle(anchors, segIdx), defaultInHandle(anchors, segIdx), b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const c1 = defaultOutHandle(anchors, i);\n const c2 = defaultInHandle(anchors, i);\n cmds.push(PATH_C);\n xs.push(c1.x, c1.y, c2.x, c2.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const p0 = a;\n const p1 = defaultOutHandle(anchors, segIdx);\n const p2 = defaultInHandle(anchors, segIdx);\n const p3 = b;\n const d1 = cubicDeriv1(p0, p1, p2, p3, localT);\n const d2 = cubicDeriv2(p0, p1, p2, p3, localT);\n const num = d1.x * d2.y - d1.y * d2.x;\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i];\n if (a.outHandle || i + 1 < anchors.length) {\n out.push({ kind: 'handle', anchorIndex: i, which: 'out' });\n }\n if (a.inHandle || i > 0) {\n out.push({ kind: 'handle', anchorIndex: i, which: 'in' });\n }\n }\n return out;\n },\n};\n","import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_M, PATH_Q } from '../commands';\nimport { defaultInHandle, defaultOutHandle, segmentAt } from './anchorHandles';\n\nfunction quadControl(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const c1 = defaultOutHandle(anchors, i);\n const c2 = defaultInHandle(anchors, i);\n return { x: (c1.x + c2.x) / 2, y: (c1.y + c2.y) / 2 };\n}\n\nfunction quadEval(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: u * u * p0.x + 2 * u * t * p1.x + t * t * p2.x,\n y: u * u * p0.y + 2 * u * t * p1.y + t * t * p2.y,\n };\n}\n\nfunction quadDeriv1(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 2 * u * (p1.x - p0.x) + 2 * t * (p2.x - p1.x),\n y: 2 * u * (p1.y - p0.y) + 2 * t * (p2.y - p1.y),\n };\n}\n\nfunction quadDeriv2(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n): { x: number; y: number } {\n return {\n x: 2 * (p2.x - 2 * p1.x + p0.x),\n y: 2 * (p2.y - 2 * p1.y + p0.y),\n };\n}\n\n/** Quadratic bezier: one control point per segment. Cheaper than cubic and what TrueType glyph outlines use, at the cost of expressiveness. */\nexport const bezierQuadratic: CurveRepresentation = {\n kind: 'bezierQuadratic',\n label: 'Quadratic Bezier',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n return quadEval(a, quadControl(anchors, segIdx), b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const q = quadControl(anchors, i);\n cmds.push(PATH_Q);\n xs.push(q.x, q.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const p1 = quadControl(anchors, segIdx);\n const d1 = quadDeriv1(a, p1, b, localT);\n const d2 = quadDeriv2(a, p1, b);\n const num = d1.x * d2.y - d1.y * d2.x;\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(_anchors): Discriminator[] {\n // Quadratic has no user-facing controls — each segment's quadratic\n // control is fully determined by the cubic handles via midpoint.\n return [];\n },\n};\n","import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_L, PATH_M } from '../commands';\n\nconst DEGREE = 3;\nconst WEIGHT_MIN = 1e-3;\nconst WEIGHT_MAX = 8;\nconst FLATTEN_SAMPLES = 64;\n\n/** Build a uniform open knot vector. For n control points and degree p,\n * knot vector length is n + p + 1: the first p+1 knots are 0, the last\n * p+1 knots are 1, intermediate knots are evenly spaced. Standard\n * \"clamped\" form so the curve passes through first and last anchors. */\nfunction openUniformKnots(n: number, p = DEGREE): number[] {\n const m = n + p + 1;\n const knots: number[] = [];\n for (let i = 0; i < m; i++) {\n if (i <= p) knots.push(0);\n else if (i >= n) knots.push(1);\n else knots.push((i - p) / (n - p));\n }\n return knots;\n}\n\nfunction findSpan(n: number, p: number, u: number, knots: number[]): number {\n if (u >= knots[n]) return n - 1;\n if (u <= knots[p]) return p;\n let lo = p;\n let hi = n;\n let mid = (lo + hi) >> 1;\n while (u < knots[mid] || u >= knots[mid + 1]) {\n if (u < knots[mid]) hi = mid;\n else lo = mid;\n mid = (lo + hi) >> 1;\n }\n return mid;\n}\n\nfunction basisFunctions(i: number, u: number, p: number, knots: number[]): number[] {\n const N = new Array<number>(p + 1).fill(0);\n N[0] = 1;\n const left = new Array<number>(p + 1).fill(0);\n const right = new Array<number>(p + 1).fill(0);\n for (let j = 1; j <= p; j++) {\n left[j] = u - knots[i + 1 - j];\n right[j] = knots[i + j] - u;\n let saved = 0;\n for (let r = 0; r < j; r++) {\n const temp = N[r] / (right[r + 1] + left[j - r]);\n N[r] = saved + right[r + 1] * temp;\n saved = left[j - r] * temp;\n }\n N[j] = saved;\n }\n return N;\n}\n\nfunction weightOf(a: SharedAnchor): number {\n const w = a.weight ?? 1;\n return Math.max(WEIGHT_MIN, Math.min(WEIGHT_MAX, w));\n}\n\nfunction evalNurbs(anchors: SharedAnchor[], u: number): { x: number; y: number } {\n const n = anchors.length;\n if (n === 0) return { x: 0, y: 0 };\n if (n === 1) return { x: anchors[0].x, y: anchors[0].y };\n const p = Math.min(DEGREE, n - 1);\n const knots = openUniformKnots(n, p);\n const clamped = Math.min(Math.max(u, 0), 1);\n const span = findSpan(n, p, clamped, knots);\n const N = basisFunctions(span, clamped, p, knots);\n let wx = 0;\n let wy = 0;\n let wTotal = 0;\n for (let j = 0; j <= p; j++) {\n const idx = span - p + j;\n const a = anchors[idx];\n const w = weightOf(a);\n wx += N[j] * w * a.x;\n wy += N[j] * w * a.y;\n wTotal += N[j] * w;\n }\n if (wTotal < 1e-12) return { x: anchors[0].x, y: anchors[0].y };\n return { x: wx / wTotal, y: wy / wTotal };\n}\n\n/** NURBS: anchors act as weighted control points the curve is pulled toward rather than passing through. Flattened to line segments when converted to a path. */\nexport const nurbs: CurveRepresentation = {\n kind: 'nurbs',\n label: 'NURBS',\n evaluate(anchors, t) {\n return evalNurbs(anchors, t);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [];\n for (let s = 0; s <= FLATTEN_SAMPLES; s++) {\n const t = s / FLATTEN_SAMPLES;\n const p = evalNurbs(anchors, t);\n xs.push(p.x, p.y);\n if (s > 0) cmds.push(PATH_L);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const eps = 1e-3;\n // The stencil needs a sample each side, so at an end it sits one step in.\n const tm = Math.min(1 - eps, Math.max(eps, t));\n const t0 = tm - eps;\n const t1 = tm + eps;\n const p0 = evalNurbs(anchors, t0);\n const p2 = evalNurbs(anchors, t1);\n const pm = evalNurbs(anchors, tm);\n const d1x = (p2.x - p0.x) / (t1 - t0);\n const d1y = (p2.y - p0.y) / (t1 - t0);\n const d2x = (p2.x - 2 * pm.x + p0.x) / (eps * eps);\n const d2y = (p2.y - 2 * pm.y + p0.y) / (eps * eps);\n const num = d1x * d2y - d1y * d2x;\n const den = Math.pow(d1x * d1x + d1y * d1y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n out.push({\n kind: 'slider',\n label: `w${i}`,\n anchorIndex: i,\n field: 'weight',\n min: WEIGHT_MIN,\n max: WEIGHT_MAX,\n step: 0.1,\n value: weightOf(anchors[i]),\n });\n }\n return out;\n },\n};\n","// v1 Spiro: interpolating cubic spline with tangents computed from\n// neighbor positions for smooth anchors and pinned to incoming/outgoing\n// edges for corner anchors. This is NOT the full Raph Levien κ-curve\n// solver — that's a global numerical iteration. v1.1 swaps the real\n// Spiro in behind this same module surface.\nimport type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_C, PATH_M } from '../commands';\nimport { segmentAt } from './anchorHandles';\nimport { cubicPointAt } from '../paths/cubicMath';\n\nconst TANGENT_SCALE = 1 / 3;\n\nfunction isCorner(a: SharedAnchor): boolean {\n return a.spiroType === 'corner';\n}\n\nfunction smoothTangent(anchors: SharedAnchor[], i: number): { x: number; y: number } | null {\n if (isCorner(anchors[i])) return null;\n const prev = i > 0 ? anchors[i - 1] : null;\n const next = i + 1 < anchors.length ? anchors[i + 1] : null;\n if (!prev && !next) return null;\n if (!prev) {\n return { x: next!.x - anchors[i].x, y: next!.y - anchors[i].y };\n }\n if (!next) {\n return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };\n }\n const inDX = anchors[i].x - prev.x;\n const inDY = anchors[i].y - prev.y;\n const outDX = next.x - anchors[i].x;\n const outDY = next.y - anchors[i].y;\n const inLen = Math.hypot(inDX, inDY) || 1;\n const outLen = Math.hypot(outDX, outDY) || 1;\n return {\n x: inDX / inLen + outDX / outLen,\n y: inDY / inLen + outDY / outLen,\n };\n}\n\nfunction controlsFor(\n anchors: SharedAnchor[],\n i: number,\n): { c1: { x: number; y: number }; c2: { x: number; y: number } } {\n const a = anchors[i];\n const b = anchors[i + 1];\n const edge = { x: b.x - a.x, y: b.y - a.y };\n const edgeLen = Math.hypot(edge.x, edge.y) || 1;\n\n const tA = smoothTangent(anchors, i);\n const tB = smoothTangent(anchors, i + 1);\n\n const outA = tA ?? edge;\n const outB = tB ?? edge;\n\n const outALen = Math.hypot(outA.x, outA.y) || 1;\n const outBLen = Math.hypot(outB.x, outB.y) || 1;\n const handleLen = edgeLen * TANGENT_SCALE;\n return {\n c1: {\n x: a.x + (outA.x / outALen) * handleLen,\n y: a.y + (outA.y / outALen) * handleLen,\n },\n c2: {\n x: b.x - (outB.x / outBLen) * handleLen,\n y: b.y - (outB.y / outBLen) * handleLen,\n },\n };\n}\n\n/** Spiro (κ-curves): curvature-continuous through each anchor, so joins stay visually smooth without hand-tuned handles. Approximated as cubics when converted to a path. */\nexport const spiro: CurveRepresentation = {\n kind: 'spiro',\n label: 'Spiro (κ-curves v1)',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const { c1, c2 } = controlsFor(anchors, segIdx);\n return cubicPointAt(a, c1, c2, b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const { c1, c2 } = controlsFor(anchors, i);\n cmds.push(PATH_C);\n xs.push(c1.x, c1.y, c2.x, c2.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const { c1, c2 } = controlsFor(anchors, segIdx);\n const u = 1 - localT;\n const d1x = 3 * u * u * (c1.x - a.x) + 6 * u * localT * (c2.x - c1.x) + 3 * localT * localT * (b.x - c2.x);\n const d1y = 3 * u * u * (c1.y - a.y) + 6 * u * localT * (c2.y - c1.y) + 3 * localT * localT * (b.y - c2.y);\n const d2x = 6 * u * (c2.x - 2 * c1.x + a.x) + 6 * localT * (b.x - 2 * c2.x + c1.x);\n const d2y = 6 * u * (c2.y - 2 * c1.y + a.y) + 6 * localT * (b.y - 2 * c2.y + c1.y);\n const num = d1x * d2y - d1y * d2x;\n const den = Math.pow(d1x * d1x + d1y * d1y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n out.push({\n kind: 'enum',\n label: `t${i}`,\n anchorIndex: i,\n field: 'spiroType',\n options: ['g2-smooth', 'g4-smooth', 'corner'] as const,\n value: anchors[i].spiroType ?? 'g2-smooth',\n });\n }\n return out;\n },\n};\n","export type { SharedAnchor, CurveRepKind, CurveRepresentation, Discriminator } from './types';\nexport { bezierCubic } from './bezierCubic';\nexport { bezierQuadratic } from './bezierQuadratic';\nexport { nurbs } from './nurbs';\nexport { spiro } from './spiro';\n\nimport { bezierCubic } from './bezierCubic';\nimport { bezierQuadratic } from './bezierQuadratic';\nimport { nurbs } from './nurbs';\nimport { spiro } from './spiro';\nimport type { CurveRepresentation, CurveRepKind } from './types';\n\n/** Every curve representation the kit ships, keyed by kind. */\nexport const CURVE_REPS: Readonly<Record<CurveRepKind, CurveRepresentation>> = {\n bezierCubic,\n bezierQuadratic,\n nurbs,\n spiro,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/curves/anchorHandles.ts","../../src/curves/bezierCubic.ts","../../src/curves/bezierQuadratic.ts","../../src/curves/nurbs.ts","../../src/curves/spiro.ts","../../src/curves/curvatureSource.ts","../../src/curves/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { SharedAnchor } from './types';\n\nconst DEFAULT_HANDLE_FRACTION = 1 / 3;\n\n/** Smooth tangent at anchor i derived from neighbor edges. Average the\n * incoming and outgoing edge directions weighted by inverse edge length\n * (centripetal-style) so short edges don't dominate. At endpoints the\n * single available edge wins. Without this, a handle colinear with one\n * segment produces a degenerate (visually straight) cubic. */\nfunction smoothTangent(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const prev = i > 0 ? anchors[i - 1] : null;\n const next = i + 1 < anchors.length ? anchors[i + 1] : null;\n if (!prev && next) return { x: next.x - anchors[i].x, y: next.y - anchors[i].y };\n if (prev && !next) return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };\n if (prev && next) {\n const inLen = Math.hypot(anchors[i].x - prev.x, anchors[i].y - prev.y) || 1;\n const outLen = Math.hypot(next.x - anchors[i].x, next.y - anchors[i].y) || 1;\n return {\n x: (anchors[i].x - prev.x) / inLen + (next.x - anchors[i].x) / outLen,\n y: (anchors[i].y - prev.y) / inLen + (next.y - anchors[i].y) / outLen,\n };\n }\n return { x: 0, y: 0 };\n}\n\nexport function defaultOutHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const a = anchors[i];\n if (a.outHandle) return a.outHandle;\n const next = anchors[i + 1];\n const edgeLen = Math.hypot(next.x - a.x, next.y - a.y);\n const t = smoothTangent(anchors, i);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: a.x + (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: a.y + (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nexport function defaultInHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const b = anchors[i + 1];\n if (b.inHandle) return b.inHandle;\n const a = anchors[i];\n const edgeLen = Math.hypot(b.x - a.x, b.y - a.y);\n const t = smoothTangent(anchors, i + 1);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: b.x - (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: b.y - (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nexport function segmentAt(anchors: SharedAnchor[], t: number): { segIdx: number; localT: number } {\n if (anchors.length < 2) return { segIdx: 0, localT: 0 };\n const segments = anchors.length - 1;\n const scaled = Math.min(Math.max(t, 0), 1) * segments;\n const segIdx = Math.min(Math.floor(scaled), segments - 1);\n const localT = scaled - segIdx;\n return { segIdx, localT };\n}\n","import type { CurveRepresentation, Discriminator } from './types';\nimport { defaultInHandle, defaultOutHandle, segmentAt } from './anchorHandles';\nimport { PATH_C, PATH_M } from '../commands';\nimport { cubicPointAt } from '../paths/cubicMath';\nimport { cubicCurvatureAt } from '../paths/curvature';\n\n/** Cubic bezier: each segment takes two control handles. The familiar pen-tool curve, and what SVG path data stores natively. */\nexport const bezierCubic: CurveRepresentation = {\n kind: 'bezierCubic',\n label: 'Cubic Bezier',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n return cubicPointAt(a, defaultOutHandle(anchors, segIdx), defaultInHandle(anchors, segIdx), b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const c1 = defaultOutHandle(anchors, i);\n const c2 = defaultInHandle(anchors, i);\n cmds.push(PATH_C);\n xs.push(c1.x, c1.y, c2.x, c2.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n return cubicCurvatureAt(a, defaultOutHandle(anchors, segIdx), defaultInHandle(anchors, segIdx), b, localT);\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i];\n if (a.outHandle || i + 1 < anchors.length) {\n out.push({ kind: 'handle', anchorIndex: i, which: 'out' });\n }\n if (a.inHandle || i > 0) {\n out.push({ kind: 'handle', anchorIndex: i, which: 'in' });\n }\n }\n return out;\n },\n};\n","import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_M, PATH_Q } from '../commands';\nimport { defaultInHandle, defaultOutHandle, segmentAt } from './anchorHandles';\n\nfunction quadControl(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const c1 = defaultOutHandle(anchors, i);\n const c2 = defaultInHandle(anchors, i);\n return { x: (c1.x + c2.x) / 2, y: (c1.y + c2.y) / 2 };\n}\n\nfunction quadEval(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: u * u * p0.x + 2 * u * t * p1.x + t * t * p2.x,\n y: u * u * p0.y + 2 * u * t * p1.y + t * t * p2.y,\n };\n}\n\nfunction quadDeriv1(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 2 * u * (p1.x - p0.x) + 2 * t * (p2.x - p1.x),\n y: 2 * u * (p1.y - p0.y) + 2 * t * (p2.y - p1.y),\n };\n}\n\nfunction quadDeriv2(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n): { x: number; y: number } {\n return {\n x: 2 * (p2.x - 2 * p1.x + p0.x),\n y: 2 * (p2.y - 2 * p1.y + p0.y),\n };\n}\n\n/** Quadratic bezier: one control point per segment. Cheaper than cubic and what TrueType glyph outlines use, at the cost of expressiveness. */\nexport const bezierQuadratic: CurveRepresentation = {\n kind: 'bezierQuadratic',\n label: 'Quadratic Bezier',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n return quadEval(a, quadControl(anchors, segIdx), b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const q = quadControl(anchors, i);\n cmds.push(PATH_Q);\n xs.push(q.x, q.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const p1 = quadControl(anchors, segIdx);\n const d1 = quadDeriv1(a, p1, b, localT);\n const d2 = quadDeriv2(a, p1, b);\n const num = d1.x * d2.y - d1.y * d2.x;\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(_anchors): Discriminator[] {\n // Quadratic has no user-facing controls — each segment's quadratic\n // control is fully determined by the cubic handles via midpoint.\n return [];\n },\n};\n","import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_L, PATH_M } from '../commands';\n\nconst DEGREE = 3;\nconst WEIGHT_MIN = 1e-3;\nconst WEIGHT_MAX = 8;\nconst FLATTEN_SAMPLES = 64;\n\n/** Build a uniform open knot vector. For n control points and degree p,\n * knot vector length is n + p + 1: the first p+1 knots are 0, the last\n * p+1 knots are 1, intermediate knots are evenly spaced. Standard\n * \"clamped\" form so the curve passes through first and last anchors. */\nfunction openUniformKnots(n: number, p = DEGREE): number[] {\n const m = n + p + 1;\n const knots: number[] = [];\n for (let i = 0; i < m; i++) {\n if (i <= p) knots.push(0);\n else if (i >= n) knots.push(1);\n else knots.push((i - p) / (n - p));\n }\n return knots;\n}\n\nfunction findSpan(n: number, p: number, u: number, knots: number[]): number {\n if (u >= knots[n]) return n - 1;\n if (u <= knots[p]) return p;\n let lo = p;\n let hi = n;\n let mid = (lo + hi) >> 1;\n while (u < knots[mid] || u >= knots[mid + 1]) {\n if (u < knots[mid]) hi = mid;\n else lo = mid;\n mid = (lo + hi) >> 1;\n }\n return mid;\n}\n\nfunction basisFunctions(i: number, u: number, p: number, knots: number[]): number[] {\n const N = new Array<number>(p + 1).fill(0);\n N[0] = 1;\n const left = new Array<number>(p + 1).fill(0);\n const right = new Array<number>(p + 1).fill(0);\n for (let j = 1; j <= p; j++) {\n left[j] = u - knots[i + 1 - j];\n right[j] = knots[i + j] - u;\n let saved = 0;\n for (let r = 0; r < j; r++) {\n const temp = N[r] / (right[r + 1] + left[j - r]);\n N[r] = saved + right[r + 1] * temp;\n saved = left[j - r] * temp;\n }\n N[j] = saved;\n }\n return N;\n}\n\nfunction weightOf(a: SharedAnchor): number {\n const w = a.weight ?? 1;\n return Math.max(WEIGHT_MIN, Math.min(WEIGHT_MAX, w));\n}\n\nfunction evalNurbs(anchors: SharedAnchor[], u: number): { x: number; y: number } {\n const n = anchors.length;\n if (n === 0) return { x: 0, y: 0 };\n if (n === 1) return { x: anchors[0].x, y: anchors[0].y };\n const p = Math.min(DEGREE, n - 1);\n const knots = openUniformKnots(n, p);\n const clamped = Math.min(Math.max(u, 0), 1);\n const span = findSpan(n, p, clamped, knots);\n const N = basisFunctions(span, clamped, p, knots);\n let wx = 0;\n let wy = 0;\n let wTotal = 0;\n for (let j = 0; j <= p; j++) {\n const idx = span - p + j;\n const a = anchors[idx];\n const w = weightOf(a);\n wx += N[j] * w * a.x;\n wy += N[j] * w * a.y;\n wTotal += N[j] * w;\n }\n if (wTotal < 1e-12) return { x: anchors[0].x, y: anchors[0].y };\n return { x: wx / wTotal, y: wy / wTotal };\n}\n\n/** NURBS: anchors act as weighted control points the curve is pulled toward rather than passing through. Flattened to line segments when converted to a path. */\nexport const nurbs: CurveRepresentation = {\n kind: 'nurbs',\n label: 'NURBS',\n evaluate(anchors, t) {\n return evalNurbs(anchors, t);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [];\n for (let s = 0; s <= FLATTEN_SAMPLES; s++) {\n const t = s / FLATTEN_SAMPLES;\n const p = evalNurbs(anchors, t);\n xs.push(p.x, p.y);\n if (s > 0) cmds.push(PATH_L);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const eps = 1e-3;\n // The stencil needs a sample each side, so at an end it sits one step in.\n const tm = Math.min(1 - eps, Math.max(eps, t));\n const t0 = tm - eps;\n const t1 = tm + eps;\n const p0 = evalNurbs(anchors, t0);\n const p2 = evalNurbs(anchors, t1);\n const pm = evalNurbs(anchors, tm);\n const d1x = (p2.x - p0.x) / (t1 - t0);\n const d1y = (p2.y - p0.y) / (t1 - t0);\n const d2x = (p2.x - 2 * pm.x + p0.x) / (eps * eps);\n const d2y = (p2.y - 2 * pm.y + p0.y) / (eps * eps);\n const num = d1x * d2y - d1y * d2x;\n const den = Math.pow(d1x * d1x + d1y * d1y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n out.push({\n kind: 'slider',\n label: `w${i}`,\n anchorIndex: i,\n field: 'weight',\n min: WEIGHT_MIN,\n max: WEIGHT_MAX,\n step: 0.1,\n value: weightOf(anchors[i]),\n });\n }\n return out;\n },\n};\n","import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { segmentAt } from './anchorHandles';\nimport { eulerCurvatureAt, eulerPointAt } from '../paths/eulerSpiral';\nimport { SPIRO_KINDS, solveSpiro, type SpiroPoint, type SpiroSegment } from '../paths/spiro';\nimport { spiroToPath } from '../paths/spiroPath';\n\nconst pointsOf = (anchors: SharedAnchor[]): SpiroPoint[] =>\n anchors.map((a) => ({ x: a.x, y: a.y, kind: a.spiroType ?? 'smooth' }));\n\n/** The solved segment `t` falls in, and how far along it. */\nfunction locate(anchors: SharedAnchor[], t: number): { seg: SpiroSegment; s: number } {\n const { segIdx, localT } = segmentAt(anchors, t);\n return { seg: solveSpiro(pointsOf(anchors), false)[segIdx], s: localT };\n}\n\n/** Spiro (κ-curves): curvature-continuous through each smooth anchor, so joins stay visually smooth without hand-tuned handles. Solved with `solveSpiro`, and written as cubics by `spiroToPath`. */\nexport const spiro: CurveRepresentation = {\n kind: 'spiro',\n label: 'Spiro (κ-curves)',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { seg, s } = locate(anchors, t);\n if (seg.spiral) return eulerPointAt(seg.spiral, s);\n return { x: seg.from.x + (seg.to.x - seg.from.x) * s, y: seg.from.y + (seg.to.y - seg.from.y) * s };\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n return spiroToPath([{ points: pointsOf(anchors), closed: false }]).path;\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { seg, s } = locate(anchors, t);\n return seg.spiral ? eulerCurvatureAt(seg.spiral, s) : 0;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n out.push({\n kind: 'enum',\n label: `t${i}`,\n anchorIndex: i,\n field: 'spiroType',\n options: SPIRO_KINDS,\n value: anchors[i].spiroType ?? 'smooth',\n });\n }\n return out;\n },\n};\n","import type { CurvatureSource } from '../paths/curvature';\nimport type { CurveRepresentation, SharedAnchor } from './types';\n\n/** Step in t for the tangent's central difference. */\nconst TANGENT_STEP = 1e-4;\n\n/**\n * `anchors` read through `rep`, as a {@link CurvatureSource} over the whole\n * curve, so any representation can stand a curvature comb with `combTeeth`.\n * Representations carry no derivative, so the tangent is a central difference\n * of `evaluate`, one-sided at the ends.\n */\nexport function curvatureSourceOf(rep: CurveRepresentation, anchors: SharedAnchor[]): CurvatureSource {\n return {\n pointAt: (t) => rep.evaluate(anchors, t),\n tangentAt: (t) => {\n const a = rep.evaluate(anchors, Math.max(0, t - TANGENT_STEP));\n const b = rep.evaluate(anchors, Math.min(1, t + TANGENT_STEP));\n return { x: b.x - a.x, y: b.y - a.y };\n },\n curvatureAt: (t) => rep.curvatureAt(anchors, t),\n };\n}\n","export type { SharedAnchor, CurveRepKind, CurveRepresentation, Discriminator } from './types';\nexport { bezierCubic } from './bezierCubic';\nexport { bezierQuadratic } from './bezierQuadratic';\nexport { nurbs } from './nurbs';\nexport { spiro } from './spiro';\nexport { curvatureSourceOf } from './curvatureSource';\n\nimport { bezierCubic } from './bezierCubic';\nimport { bezierQuadratic } from './bezierQuadratic';\nimport { nurbs } from './nurbs';\nimport { spiro } from './spiro';\nimport type { CurveRepresentation, CurveRepKind } from './types';\n\n/** Every curve representation the kit ships, keyed by kind. */\nexport const CURVE_REPS: Readonly<Record<CurveRepKind, CurveRepresentation>> = {\n bezierCubic,\n bezierQuadratic,\n nurbs,\n spiro,\n};\n"]}
|