🎨 Creative Coding Gear

Tools and books for generative artists. Affiliate links help support this site.

Generative Design (Revised Edition)

The bible of generative art. Beautiful visual examples with code you can actually learn from.

Wacom Intuos Drawing Tablet

For when you want to blend hand-drawn elements with generative code. Great for interactive sketches.

">

🎨 Creative Coding Gear

Tools and books for generative artists. Affiliate links help support this site.

Generative Design (Revised Edition)

The bible of generative art. Beautiful visual examples with code you can actually learn from.

Wacom Intuos Drawing Tablet

For when you want to blend hand-drawn elements with generative code. Great for interactive sketches.

">Generative Art with JavaScript - KryoMix

Generative Art with JavaScript

Generative art is where mathematics meets creativity. Using JavaScript and the Canvas API, you can create stunning visual pieces that are both algorithmic and beautiful. In this article, we'll explore the fundamentals and build toward complex, animated compositions.

What is Generative Art?

Generative art is art created by a set of autonomous rules or algorithms. Instead of manually drawing each element, you define rules, and the computer executes them to produce visual output. The beauty lies in the intersection of intention and emergence—you decide the constraints, and the system creates unique variations within those bounds.

This approach has roots in early computer art and algorithmic design. Artists like Vera Molnár and John Whitney pioneered the field in the 1960s, creating stunning work with limited computational power. Today, with modern JavaScript and the Canvas API, we can explore similar concepts in the browser.

Getting Started with the Canvas API

The HTML5 Canvas element provides a drawing surface for graphics in JavaScript. It's simple but powerful:

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');

// Draw a rectangle
ctx.fillStyle = '#00f0ff';
ctx.fillRect(10, 10, 100, 50);

// Draw a circle
ctx.beginPath();
ctx.arc(100, 100, 50, 0, Math.PI * 2);
ctx.fillStyle = '#ff006e';
ctx.fill();

The context object (ctx) is your brush. It has methods for drawing rectangles, circles, lines, and paths. You can fill them with colors or gradients, apply transformations like rotation and scaling, and even apply shadows and blurs.

Particles: The Building Block of Generative Art

Many generative artworks are built from particles—small entities that follow simple rules. When you combine thousands of particles with basic physics, emergent complexity arises.

Here's a basic particle class:

class Particle {
  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.vx = Math.random() * 4 - 2;  // velocity x
    this.vy = Math.random() * 4 - 2;  // velocity y
    this.life = 255;
  }

  update() {
    this.x += this.vx;
    this.y += this.vy;
    this.vy += 0.1;  // gravity
    this.life -= 3;  // fade
  }

  draw(ctx) {
    ctx.globalAlpha = this.life / 255;
    ctx.fillStyle = '#00f0ff';
    ctx.fillRect(this.x, this.y, 2, 2);
  }

  isAlive() {
    return this.life > 0;
  }
}

Now create particles and animate them in your canvas:

const particles = [];

function animate() {
  ctx.fillStyle = 'rgba(10, 10, 15, 0.1)';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  particles.forEach(p => {
    p.update();
    p.draw(ctx);
  });

  particles = particles.filter(p => p.isAlive());

  // Add new particles
  for (let i = 0; i < 5; i++) {
    particles.push(new Particle(canvas.width / 2, canvas.height / 2));
  }

  requestAnimationFrame(animate);
}

animate();

Randomness and Noise

True randomness creates chaos. For more organic, flowing patterns, use Perlin noise. While JavaScript doesn't have built-in Perlin noise, you can use a library like simplex-noise or implement a basic version.

The key principle: instead of completely random values, use noise that changes smoothly over time. This creates natural-looking motion and patterns.

// Using a noise library for smooth randomness
class NoiseParticle {
  constructor(x, y, noiseGenerator) {
    this.x = x;
    this.y = y;
    this.noiseGen = noiseGenerator;
    this.noiseTime = Math.random() * 1000;
  }

  update() {
    const angle = this.noiseGen.noise(this.noiseTime) * Math.PI * 2;
    this.x += Math.cos(angle) * 2;
    this.y += Math.sin(angle) * 2;
    this.noiseTime += 0.01;
  }
}

Adding Complexity: Attractors and Repellers

Interesting generative art often involves forces. An attractor pulls particles toward a point; a repeller pushes them away. These forces create emergent patterns.

Implement a simple attractor system:

class Attractor {
  constructor(x, y, strength) {
    this.x = x;
    this.y = y;
    this.strength = strength;
  }

  apply(particle) {
    const dx = this.x - particle.x;
    const dy = this.y - particle.y;
    const distance = Math.sqrt(dx * dx + dy * dy);

    if (distance < 200) {
      const force = this.strength / (distance * distance);
      particle.vx += (dx / distance) * force;
      particle.vy += (dy / distance) * force;
    }
  }
}

Color and Style

Generative art shines with intentional color palettes. Instead of random colors, choose a limited palette that works harmoniously:

const palette = [
  '#00f0ff',  // cyan
  '#ff006e',  // magenta
  '#ffd60a',  // yellow
  '#ffffff',  // white
];

function getRandomColor() {
  return palette[Math.floor(Math.random() * palette.length)];
}

Apply gradients and layer transparency for depth:

const gradient = ctx.createLinearGradient(0, 0, canvas.width, canvas.height);
gradient.addColorStop(0, '#00f0ff');
gradient.addColorStop(1, '#ff006e');
ctx.fillStyle = gradient;

Performance Tips

Generative art can be computationally intensive. Here are optimization strategies:

Creating Your First Piece

Start with a simple idea: particles that avoid each other, creating flowing separation patterns. Or particles that clump together, forming organic shapes. The algorithm drives the aesthetic.

Iterate quickly. Change parameters—gravity, velocity, colors, particle lifetime. Small tweaks create dramatically different outputs. This is the magic of generative art: controlled variation within defined rules.

Going Further

From here, explore:

The Canvas API is just the beginning. Combine it with WebGL for 3D generative art, the Web Audio API for sound-responsive visuals, or machine learning libraries for AI-assisted generation.

Conclusion

Generative art democratizes artistic creation. You don't need to be a skilled illustrator to create beautiful work—define the rules, and the system creates beauty. Start simple, iterate, and let your creativity guide the algorithms. The intersection of code and art is where the most exciting work happens.

← Back to HomeNext: Building Audio Visualizers →