Partial Orbits
2026 · abstract
Nothing here completes its circle; the pivot keeps every fragment anyway.
the paths of things that never finished going around
painted by Kimi K2.6p5 2.3.2 · brush 2.2.2 · 2026-08-24
// composition: arc fragments orbiting a pivot at the lower-left thirds crossing, denser near it, opening upward-right
// layering: faint full-travel pencil arcs first, then weighted charcoal fragments, rust accents last
const PALETTE = [
"#ece6d8", // warm paper
"#55534d", // charcoal grey
"#2e2c28", // heavy charcoal
"#a64b2a", // rust accent
];
const PIVOT = { x: 262, y: 542 };
function arcFragment(radius, startAngle, sweep, brushName, col, weight) {
brush.set(brushName, col, weight);
brush.beginShape(0.4);
const steps = 12;
for (let s = 0; s <= steps; s++) {
const a = startAngle + (sweep * s) / steps;
brush.vertex(
PIVOT.x + cos(a) * (radius + randomGaussian(0, 1.6)),
PIVOT.y + sin(a) * (radius + randomGaussian(0, 1.6)),
);
}
brush.endShape(false);
}
function setup() {
createCanvas(800, 800, WEBGL);
angleMode(DEGREES);
brush.scaleBrushes(2.4);
noLoop();
}
function draw() {
translate(-width / 2, -height / 2);
background("#ece6d8");
// ghost travel: three faint near-complete pencil orbits underneath
arcFragment(150, -170, 300, "2H", "#55534d", 0.4);
arcFragment(255, -150, 260, "2H", "#55534d", 0.35);
arcFragment(360, -120, 200, "2H", "#55534d", 0.3);
// the fragments: tight and heavy near the pivot, sparse and thin far out
arcFragment(46, -80, 130, "charcoal", "#2e2c28", 2.6);
arcFragment(64, 30, 95, "charcoal", "#55534d", 1.9);
arcFragment(88, -160, 115, "charcoal", "#2e2c28", 2.2);
arcFragment(112, -55, 70, "2B", "#55534d", 1.5);
arcFragment(132, 95, 85, "charcoal", "#2e2c28", 1.8);
arcFragment(158, -120, 60, "2B", "#55534d", 1.2);
arcFragment(186, -30, 95, "charcoal", "#55534d", 1.6);
arcFragment(214, -95, 45, "2B", "#55534d", 1.0);
arcFragment(248, -170, 75, "charcoal", "#2e2c28", 1.4);
arcFragment(282, -60, 38, "2B", "#55534d", 0.9);
arcFragment(322, -110, 55, "2B", "#55534d", 0.8);
arcFragment(368, -85, 30, "2B", "#55534d", 0.7);
arcFragment(415, -125, 40, "2H", "#55534d", 0.6);
arcFragment(470, -95, 22, "2H", "#55534d", 0.5);
// rust: two fragments carry heat, one flake thrown clear
arcFragment(100, 60, 55, "charcoal", "#a64b2a", 1.8);
arcFragment(205, -140, 34, "2B", "#a64b2a", 1.2);
brush.set("2B", "#a64b2a", 1.0);
brush.line(586, 218, 604, 204);
// the pivot itself: a small pooled mark, not a bullseye
brush.noStroke();
brush.fillBleed(0.5, "out");
brush.fillTexture(0.6, 0.6);
brush.fill("#2e2c28", 150);
brush.circle(PIVOT.x + 3, PIVOT.y - 2, 9, true);
}