WEK 2 Art Exploration
Concept
Digital Terrain is a generative artwork inspired by the golden age of computer graphics from the 1970s, when plotters and early systems created mesmerizing patterns through mathematical precision. The piece explores repetition with variation
The composition uses a 6×5 grid structure where each cell contains one of five distinct generative patterns: vertical lines that breathe, organic blob contours, flowing topographic lines, mixed pattern cutouts, and drifting wave forms. The aesthetic echoes vintage plotter art with its warm cream lines on deep black, while the subtle animations bring a meditative, living quality to the static grid.
The work question: How can repetition avoid monotony? Each viewing reveals new relationships between adjacent cells, creating an ever-evolving visual conversation.
Code Highlight
I am particularly proud of the organic blob generation using Perlin noise mapped to polar coordinates. This technique creates smooth, natural-looking shapes that feel hand-drawn rather than computer-generated:
function drawOrganicBlob(w, h) {
let offsetX = random(1000);
let offsetY = random(1000);
// Map circle to noise space for organic shapes
beginShape();
for (let a = 0; a < TWO_PI; a += 0.1) {
let xoff = map(cos(a), -1, 1, 0, 2);
let yoff = map(sin(a), -1, 1, 0, 2);
let r = map(noise(offsetX + xoff, offsetY + yoff), 0, 1, w * 0.15, w * 0.4);
let x = w/2 + r * cos(a);
let y = h/2 + r * sin(a);
curveVertex(x, y);
}
endShape(CLOSE);
// Nested contours for depth
let numContours = floor(random(2, 5));
for (let c = 0; c < numContours; c++) {
let shrink = map(c, 0, numContours, 0.9, 0.3);
// ... creates inner rings
}
}
By converting circular motion (cos(a), sin(a)) into noise coordinates, we get perfectly smooth blobs that change shape naturally. The nested contours add depth, mimicking topographic maps or growth rings. This marriage of geometric precision and natural randomness captures the essence of generative art.
Live Sketch
Interaction: Click canvas to regenerate | Press 'S' to save artwork
Reflection & Future Directions
This project taught me how loops transform code into art. Instead of drawing one shape, a loop draws hundreds with variations. The challenge was balancing randomness with aesthetic coherence.
The animation addition was particularly enlightening. At first, I had everything static (noLoop()), but adding a time dimension (t += 0.008) brought the piece to life.
Ideas for Future Work:
- Color Evolution: Slowly shift the color palette over time, transitioning from cream to blues to warm oranges, creating day/night cycles
- Audio Reactivity: Use microphone input to make patterns respond to sound. For example, wave amplitude increases with volume, blobs pulse with bass frequencies
- Cell Communication: Let adjacent cells influence each other's patterns, creating waves of change across the grid rather than isolated behaviors
- Export System: Generate high-resolution (4000×3000px) versions for actual printing/framing, exploring the digital-to-physical art transition
- 3D Depth: Add subtle shadows or perspective to create the illusion that some cells are recessed or raised, adding architectural dimension
- Pattern Memory: Track which patterns appear most frequently and gradually reduce them, ensuring ongoing visual freshness even across long gallery displays
Created with p5.js | February 2026