Published
Edited
Feb 6, 2020
9 stars
Hello, PGLiteINSEE ParquetHello, apcachDruidJS workerHello, OrbitWord Tour: 40k words and their friendsHello, spectral.jsHello, petite-vueHello, @thi.ng/grid-iteratorsHello, thumbhashHello, SwissGLHello, QOI (and glitches)Hello, orbHello, cosmographHello, TabulatorUsing d3.blur with PlotMath.cbrtHello debounceColorcetHello, gliiHello, Open MeteoHello, PyWaveletsHello, typesenseHello, libgifHello, kmeans-engineHappy anniversary, Project Gutenberg!Hello, fflateHello, ArchieML!Hello, d3-bboxCollideHello, jsgeoda!Hello, EDTF!Hello, protovis!Hello, placekeyHello, fuse.jsHello, Reorder.jsHello, shadow DOMjszipHello, procedural-glHello, qhullHello, genetic-jsDruidJSHello, Tippy.jsHello, paintWorkletBig πHello, AutoencoderHello, Shakespearean UUIDsHello, ccwt.jsHello, constrainautorHello, talismanHello, polygon-offsetHello p-queueHello async-poolHello rollup-plugin-asciiHello, algebra.jsHello, pixi.jsHello, d3-renderHello zip/unzipCumulative Wikipedia DonationsHTML <details>regl textureHello, npyjsHello protobuf
Hello, pencil touch
Hello, LOESSHello html2canvaslegra mapscolor2cssHello, ecsy2D point distributionsHello, delatinThe gpu.js loopDijkstra’s shortest-path treeHello nojacko/Dijkstras-jsHello, tcort/dijkstrajsHello, lambdabaa/dijkstraHello, gpu.js v2Hello jsqrHello qrcodeHello SharedArrayBufferHello GamePad APIHello vtk.jsHello nd4jsHello BiofabricTravelling with a self-organizing mapHello glitchHello UMAP-jsHello pandemoniumHello iocaneHello JSON-editorHello d3-griddingHello mljs/knnWorkerHello lalolibImage to GPU.jsImage to blink.jsTissot's indicatrixVega projectionsHello WebCLGLUsing d3-inertia with observableVideo contouring 3ngraph: pagerank, louvain…Union-FindPerceptron (simple statistics)mljsHello h3-jsEmoji FlagsHello, poisson-disk-sampling
Insert cell
Insert cell
Insert cell
mutable touches = null
Insert cell
{
clear;
const height = (width * 0.7) | 0;
const context = DOM.context2d(width, height),
canvas = context.canvas;
yield canvas;

let m;
d3.select(canvas)
.on("touchstart", () => {
m = [d3.mouse(canvas)];
})

.on("touchmove", () => {
d3.event.preventDefault();
d3.event.stopPropagation();

mutable touches = [...d3.event.touches];

const e = [...d3.event.touches].filter(e => e.touchType !== "direct")[0];
if (!e) return;

m.push(d3.mouse(canvas));
m = m.slice(-10);

context.beginPath();

context.lineWidth = 5 + e.force ** 2 * 130;

context.globalAlpha = e.force;

context.strokeStyle = d3.hsl(
(e.azimuthAngle * 180) / Math.PI,
(e.altitudeAngle / Math.PI) * 2,
1 - e.force
); //color((e.altitudeAngle / Math.PI) * 2);
context.moveTo(...m[0]);
for (const n of m) context.lineTo(...n);

context.stroke();
});
}
Insert cell
d3 = require("d3@5")
Insert cell
color = d3.scaleSequential(d3.interpolateMagma)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more