Public
Edited
Jan 22, 2024
1 star
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
import { vec2 } from "@esperanc/vec2-utils"
Insert cell
Insert cell
{
mutable defaultFormula =
"tb<+<t<+b>+>>b>>+4<t+<=+6<t+<=+12<t+<=+=45<+31<=53<+34<=65<+45<=91<+";
}
Insert cell
function dDecoration(points, justLines = false) {
const n = points.length;
console.assert(n >= 10);
let ret = [];
for (let i = 0; i < 10; i++) {
let q = points[i];
let p = points[(i + 1) % n];
let m = vec2.lerp([], p, q, 0.5);
let v = vec2.sub([], p, m);
let shape = shapeB(m, v);
if (justLines) ret.push (shape.slice(0,2), shape.slice(1,4), [shape[3],shape[0]])
else ret.push(shape);
}
return ret;
}
Insert cell
function bDecoration(points, justLines = false) {
const n = points.length;
console.assert(n >= 6);
let ret = [];
for (let i of [2, 5]) {
let q = points[i];
let p = points[(i + 1) % n];
let m = vec2.lerp([], p, q, 0.5);
let v = vec2.sub([], p, m);
let shape = shapeB(m, v);
if (justLines) ret.push (shape.slice(0,2), shape.slice(1,4), [shape[3],shape[0]])
else ret.push(shape);
}
return ret;
}
Insert cell
function tDecoration(points, justLines = false) {
const n = points.length;
console.assert(n >= 6);
let ret = [];
for (let i of [0, 2, 3, 5]) {
let q = points[i];
let p = points[(i + 1) % n];
let m = vec2.lerp([], p, q, 0.5);
let v = vec2.sub([], m, q);
let piece = shapeA(q, v).slice(1);
piece.reverse();
ret.push(...piece);
}
if (justLines)
return [
ret.slice(0, 3),
ret.slice(2, 4),
ret.slice(3, 6),
ret.slice(6, 9),
ret.slice(8, 10),
ret.slice(9, 12)
];
else return [ret];
}
Insert cell
function shapeA(p, v) {
const q = vec2.add([], p, v);
const s = vec2.rotate([], q, p, Math.PI * 0.8);
const r = vec2.rotate([], q, p, Math.PI * 0.4);
return [p, q, r, s];
}
Insert cell
blength = 2 * Math.sin(Math.PI / 5)
Insert cell
function shapeB(p, v) {
const q = vec2.add([], p, vec2.scale([], v, blength));
const r = vec2.rotate([], q, p, Math.PI * 0.3);
const s = vec2.rotate([], q, p, Math.PI * 0.5);
const t = vec2.rotate([], q, p, Math.PI * 0.7);
return [p, r, s, t];
}
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