-
-
Notifications
You must be signed in to change notification settings - Fork 165
hiccup svg recipes
Karsten Schmidt edited this page Jul 3, 2018
·
6 revisions
The coloredPolyline function below uses transducers to transform an
array of 2D points into an iterator of pairwise line segments. Each line
is colored using the user provided tint function. This function takes
an argument (a number between 0.0 ... 1.0) and must return a CSS color
string.
import * as svg from "@thi.ng/hiccup-svg";
import * as tx from "@thi.ng/transducers";
function coloredPolyline(points: number[][], tint: (t: number)=> string) {
const n = 1 / (points.length - 1);
return tx.iterator(
tx.comp(
tx.partition(2, 1),
tx.mapIndexed((i, [a, b]: number[][]) => svg.line(a, b, { stroke: tint(i*n) }))
),
points
);
}import * as fs from "fs";
function spiral(r1: number, r2: number, twist: number) {
return (t: number) => {
const r = r1 + (r2 - r1) * t;
t *= twist;
return [
100 + Math.cos(t) * r,
100 + Math.sin(t) * r,
];
};
}
fs.writeFileSync("colored-spiral.svg",
serialize(
svg.svg({ width: 200, height: 200 },
...coloredPolyline(
[...tx.iterator(
tx.map(spiral(20, 90, Math.PI * 10)),
tx.normRange(500))],
(t) => `rgba(${~~(t * 255)}, 0, ${~~(255 - t * 255)}, 1)`
)
)
)
);