Friday, October 16, 2020

The Programming of Art


I have spent most of my career writing programs for business reasons. Writing them has given me a sense of fulfillment. But this was not the reason why I chose this career. Every now and then, I am reminded why I love this field so much.

Recently, I wrote a program that revived the enthusiast in me. While preparing examples for students in my full stack web development course, I accidentally created art. I named the program The Walk. It is currently executing above. Refresh the page to restart it.

The surprising thing about the program is that it is fairly simple. After all, it is a teaching example. The program has only a few basic elements:
  • an HTML document that uses built-in canvas graphics
  • random numbers
  • rotating colors
  • repetition
The algorithm is simple. Start in the middle of the two-dimensional canvas. Pick a random color. Pick a random direction. Draw a line with the color and direction for 10 pixels. Repeat the process, while changing the color every 1,000 steps.

The result reminds me of complex systems where agents and simple interactions lead to emergent behaviors. In this program, one emergent behavior is the output art at the end of the program. Another emergent behavior is the creation of additional colors by retracing steps.

There is nothing novel or proprietary about the program itself. It uses basic HTML, JavaScript, and CSS statements that you can learn from online tutorials (see W3Schools).

The full source code for The Walk is below. Save it to a file named walk.html. Double-click the file to execute the program in a browser. Programming isn't just for business applications. Programming is an outlet for creativity. And creativity leads to art.

<!-- walk.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <title>The Walk</title>
</head>
<body>
  <canvas id="myCanvas" width="600" height="600" style="border:2px solid black;"></canvas>  

  <script>
  var canvas = document.getElementById("myCanvas");
  var ctx = canvas.getContext("2d");
  var iterations = 0;
  var color_iterations = 0;
  var idx = 0;
  var MAX_ITERATIONS = 14000;
  var colors = ['red','orange','yellow','green','blue','indigo','violet'];
  var x,y;

  //color canvas white
  ctx.fillStyle = "white";
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  
  //do the random walk
  ctx.fillStyle = colors[idx];
  x = canvas.width / 2;  //start in the middle
  y = canvas.height / 2;

  function walk() {
    ctx.beginPath();
    ctx.moveTo(x,y);
    m = Math.floor(Math.random() * 4);
    newx = x;
    newy = y;
    switch(m) {
      case 0:
        newy = newy - 10;  //up
        break;
      case 1:
        newy = newy + 10;  //down
        break;
      case 2:
        newx = newx - 10;  //left
        break;
      case 3:
        newx = newx + 10;  //right
        break;
    }
    
    //if new coordinate are off the grid, skip it
    if (newx < 0 || newy < 0 || newx > canvas.width || newy > canvas.height)
      return;

    //step is good
    ctx.lineTo(newx,newy);
    ctx.stroke();
    x = newx;
    y = newy;
    ctx.closePath();
    color_iterations++;

    //change colors after 1,000 steps
    if (color_iterations >= 1000) {
      color_iterations = 0;
      idx++;
      if (idx > 7)
        idx = 0;
    }
    ctx.strokeStyle = colors[idx];
    
    iterations++;
    if (iterations > MAX_ITERATIONS) {
      clearInterval(id);
      console.log('done.');
      return;
    }
    
  }

  var id = setInterval( function() {walk(); } , 0);
  </script>
  
</body>
</html>

No comments:

Post a Comment

What is Git Markdown?

Git Markdown is a markup language that creates HTML-like documents for web-based Git repos like GitHub, GitLab, and Bitbucket. The documents...