-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathexample.js
62 lines (52 loc) · 1.84 KB
/
example.js
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
var IPO = require(".");
// for the little story, i've written this library in the airplane on my way to NY
// and everyone is sleeping... this is why everything is dark !!!
document.body.style.background = "black";
var points = [
{ "p": [100, 100], "upper": [10, 20] },
{ "p": [200, 190], "lower": [-10, 0], "upper": [10, 0] },
{ "p": [250, 100], "upper": [30, 0] },
{ "p": [280, 140] },
{ "p": [350, 160] },
{ "p": [400, 50], "lower": [-50, 40], "upper": [100, 0] },
{ "p": [600, 250], "lower": [-140, 0], "upper": [ 40, -40 ] }
];
var ipo = IPO(points);
// Quick draw in SVG
function addPoints (a, b) {
return [ a[0] + b[0], a[1] + b[1] ];
}
function project (p) {
return [ 1 * p[0], 300 - p[1] ];
}
var svg = "<svg width='800' height='300' style='background:#111'>";
// curve
svg += "<path fill='none' stroke-width='2' stroke='#f00' d='";
var i, p, point, prev = points[0];
for (i = 1; i < points.length; i++) {
point = points[i];
svg += " M "+project(prev.p)+" C"+project(addPoints(prev.p, prev.upper||[0,0]))+" "+project(addPoints(point.p, point.lower||[0,0]))+" "+project(point.p);
prev = point;
}
svg += "' />";
// points and handles
for (i = 0; i < points.length; i++) {
point = points[i];
p = project(point.p);
var clr = "#f00";
svg += "<circle cx='"+p[0]+"' cy='"+p[1]+"' r='3' fill='"+clr+"' />";
[point.lower, point.upper].filter(function (o) { return o; }).map(function (handle) {
handle = project(addPoints(handle, point.p));
var d = "M "+p+" L"+handle;
svg += "<path stroke='"+clr+"' d='"+d+"' />";
svg += "<circle cx='"+handle[0]+"' cy='"+handle[1]+"' r='2' fill='"+clr+"' />";
});
}
// interpolation sampling
for (var x=0; x<800; x += 4) {
var y = ipo(x);
p = project([ x, y ]);
svg += "<circle cx='"+p[0]+"' cy='"+p[1]+"' r='1' fill='#ffa' />";
}
svg += "</svg>";
document.body.innerHTML = svg;