crows lifting off a winter stubble field under a pale sun
painted by DeepSeek V4p5 2.3.2 · brush 2.2.2 · 2026-08-24
// composition: horizon in the bottom quarter, a pale sun upper-left; crows lift from the stubble at lower-left and scatter up-right, thinning
// layering: sun washes, field bands and broken horizon, stubble ticks, then the flock far-to-near, the two grounded birds last
const PALETTE = [
"#e3e0d8", // ash paper sky
"#b9b09c", // near field
"#8f887b", // far field, stubble
"#211f1c", // crow ink
"#eadfb0", // one pale winter sun
];
function crow(x, y, s, pose, flip) {
const d = flip ? -1 : 1;
const j = () => random(-s * 0.07, s * 0.07);
brush.noFill();
brush.set("charcoal", "#211f1c", Math.max(0.9, s * 0.09));
let tipL;
let tipR;
let midY;
if (pose === 0) {
tipL = -0.24; tipR = -0.2; midY = -0.34; // glide
} else if (pose === 1) {
tipL = -0.78; tipR = -0.7; midY = -0.4; // upstroke
} else {
tipL = 0.3; tipR = 0.36; midY = -0.26; // downstroke
}
brush.beginShape(0.4);
brush.vertex(x - d * s * (0.95 + random(-0.08, 0.08)), y + s * tipL + j());
brush.vertex(x - d * s * 0.42, y + s * midY + j());
brush.vertex(x, y + j());
brush.endShape(false);
brush.beginShape(0.4);
brush.vertex(x, y + j());
brush.vertex(x + d * s * 0.45, y + s * (midY + random(-0.06, 0.06)));
brush.vertex(x + d * s * (0.9 + random(-0.08, 0.08)), y + s * tipR + j());
brush.endShape(false);
if (s > 13) {
brush.set("charcoal", "#211f1c", Math.max(1.2, s * 0.16));
brush.line(x - d * s * 0.16, y + s * 0.06, x + d * s * 0.26, y + s * 0.14);
}
}
function groundCrow(x, y, s) {
brush.noStroke();
brush.fillBleed(0.3, "out");
brush.fillTexture(0.6, 0.6);
brush.fill("#211f1c", 165);
brush.beginShape(0.6);
brush.vertex(x - s * 0.5, y);
brush.vertex(x + s * 0.1, y - s * 0.42);
brush.vertex(x + s * 0.55, y - s * 0.3);
brush.vertex(x + s * 0.32, y + s * 0.08);
brush.endShape(true);
brush.set("charcoal", "#211f1c", 1.4);
brush.line(x - s * 0.5, y, x - s * 0.85, y - s * 0.26);
brush.line(x + s * 0.55, y - s * 0.3, x + s * 0.72, y - s * 0.44);
brush.set("pen", "#211f1c", 0.8);
brush.line(x + s * 0.05, y + s * 0.08, x + s * 0.02, y + s * 0.3);
brush.line(x + s * 0.24, y + s * 0.06, x + s * 0.26, y + s * 0.28);
}
function setup() {
createCanvas(800, 800, WEBGL);
brush.scaleBrushes(2.4);
noLoop();
}
function draw() {
translate(-width / 2, -height / 2);
background("#e3e0d8");
// the winter sun, upper-left, almost out
brush.noStroke();
brush.fillBleed(0.65, "out");
brush.fillTexture(0.3, 0.35);
brush.fill("#eadfb0", 18);
brush.circle(170, 146, 92, true);
brush.fill("#eadfb0", 44);
brush.circle(168, 142, 52, true);
brush.fill("#eadfb0", 62);
brush.circle(172, 140, 38, true);
// the field: far band, near bands, a broken horizon line
brush.fillBleed(0.5, "out");
brush.fillTexture(0.5, 0.5);
brush.fill("#8f887b", 58);
brush.beginShape(0.4);
brush.vertex(-10, 614);
brush.vertex(280, 606);
brush.vertex(560, 612);
brush.vertex(810, 604);
brush.vertex(810, 668);
brush.vertex(400, 674);
brush.vertex(-10, 664);
brush.endShape(true);
brush.fill("#b9b09c", 74);
brush.beginShape(0.4);
brush.vertex(-10, 656);
brush.vertex(420, 664);
brush.vertex(810, 652);
brush.vertex(810, 744);
brush.vertex(360, 752);
brush.vertex(-10, 740);
brush.endShape(true);
brush.fill("#b9b09c", 56);
brush.beginShape(0.4);
brush.vertex(-10, 732);
brush.vertex(500, 742);
brush.vertex(810, 730);
brush.vertex(810, 810);
brush.vertex(-10, 810);
brush.endShape(true);
brush.set("2B", "#8f887b", 0.9);
brush.line(-6, 612, 296, 607);
brush.line(380, 610, 806, 605);
// stubble, denser where the birds were feeding
for (let i = 0; i < 108; i++) {
const x = i < 70 ? 800 * random() * random() : random(0, 800);
const y = random(626, 786);
const L = 3 + (y - 626) * 0.05 + random(-1, 2);
const lean = random(-0.35, 0.35);
brush.set("2B", random() < 0.24 ? "#211f1c" : "#8f887b", random(0.6, 1));
brush.line(x, y, x + Math.sin(lean) * L, y - Math.cos(lean) * L);
}
// the flock, far to near
crow(764, 150, 5, 0, false);
crow(688, 176, 6, 1, false);
crow(722, 210, 7, 2, false);
crow(700, 244, 8, 1, false);
crow(752, 252, 6, 0, false);
crow(636, 268, 10, 1, false);
crow(672, 296, 9, 2, false);
crow(598, 300, 11, 0, false);
crow(566, 352, 12, 1, false);
crow(520, 332, 13, 2, false);
crow(492, 372, 15, 1, false);
crow(448, 412, 17, 0, false);
crow(388, 428, 19, 2, false);
crow(410, 486, 20, 1, false);
crow(300, 448, 18, 1, false);
crow(356, 472, 22, 2, false);
crow(320, 520, 24, 1, false);
crow(262, 566, 27, 2, false);
crow(218, 546, 30, 1, false);
crow(150, 588, 32, 1, false);
// one bird going its own way, alone near the sun
crow(298, 196, 9, 0, true);
// two still on the ground, about to commit
groundCrow(176, 648, 26);
groundCrow(122, 666, 21);
}