forked from observablehq/plot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcurve.js
More file actions
63 lines (61 loc) · 1.63 KB
/
curve.js
File metadata and controls
63 lines (61 loc) · 1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import {
curveBasis,
curveBasisClosed,
curveBasisOpen,
curveBundle,
curveBumpX,
curveBumpY,
curveCardinal,
curveCardinalClosed,
curveCardinalOpen,
curveCatmullRom,
curveCatmullRomClosed,
curveCatmullRomOpen,
curveLinear,
curveLinearClosed,
curveMonotoneX,
curveMonotoneY,
curveNatural,
curveStep,
curveStepAfter,
curveStepBefore
} from "d3";
const curves = new Map([
["basis", curveBasis],
["basis-closed", curveBasisClosed],
["basis-open", curveBasisOpen],
["bundle", curveBundle],
["bump-x", curveBumpX],
["bump-y", curveBumpY],
["cardinal", curveCardinal],
["cardinal-closed", curveCardinalClosed],
["cardinal-open", curveCardinalOpen],
["catmull-rom", curveCatmullRom],
["catmull-rom-closed", curveCatmullRomClosed],
["catmull-rom-open", curveCatmullRomOpen],
["linear", curveLinear],
["linear-closed", curveLinearClosed],
["monotone-x", curveMonotoneX],
["monotone-y", curveMonotoneY],
["natural", curveNatural],
["step", curveStep],
["step-after", curveStepAfter],
["step-before", curveStepBefore]
]);
export function Curve(curve = curveLinear, tension) {
if (typeof curve === "function") return curve; // custom curve
const c = curves.get(`${curve}`.toLowerCase());
if (!c) throw new Error(`unknown curve: ${curve}`);
if (tension !== undefined) {
switch (c) {
case curveBundle: return c.beta(tension);
case curveCardinalClosed:
case curveCardinalOpen:
case curveCardinal: return c.tension(tension);
case curveCatmullRomClosed:
case curveCatmullRomOpen:
case curveCatmullRom: return c.alpha(tension);
}
}
return c;
}