Computational Sketches

Sketches are created mainly by P5.js with libraries such as Turtle Graphics, Paper.js, p5.sound, tone.js, OpenSCAD, p5.play, RiTa, and Tracery. I explored and practiced these libraries by brainstorming ideas from scratch and then sketching in the p5 editor. Each sketch cost 30 mins to 8 hours to complete.

 

3D Fjord - OpenSCAD X Blender

 
seed1=10;
seed2=5;
random_count1=rands(5,20,30,seed1);
random_count2=rands(5,40,30,seed2);
random_high = rands(1,30,1);
random_y = rands(0,10,1);

module cubes(){
    cube(10);
    for(i=[0:29]) {
        rotate(360*i/30) {
        translate([5+random_count1[i],0,0])
        cube(30-random_count1[i]);
        }
    }
}

module coast_l(){
    for(i=[0:19]){
        translate([i*5,5+random_count2[i],0])
        resize(newsize=[10,10,10])
        cubes();
    }
}

module coast_h(){
    for(i=[0:19]){
        translate([i*10,12+random_count1[i],0])
        resize(newsize=[10,10,30])
        cubes();
    }
}

module coast_m(){
    for(i=[0:19]){
        translate([i*5,10+random_count2[i],0])
        resize(newsize=[10,10,20])
        cubes();
    }
}

module west(){
coast_l();
coast_h();
coast_m();
edage();
}

west();
translate([0,-40,0])
mirror([0,1,0])
west();
 

Yosemite Landscape - P5.js

 
function drawSun() {
  var x = 400 - 2 * frameCount;
  var y = (x * x) / 400 + 50;
  var brighter = lerp(74, 255, (255 - 74) / x);
  push();
  fill(255, brighter, brighter);
  noStroke();
  translate(x, y);
  ellipse(0, 0, 100, 100);
  pop();
}
class Cloud {
  constructor(x, y, size, color) {
    this.x = x;
    this.y = y;
    this.size = size;
    this.color = color;
  }

  draw(offsetX) {
    push();
    scale(this.size);
    fill(this.color);
    translate(this.x, this.y);
    noStroke();
    ellipse(20 + offsetX, 50, 40, 40);
    ellipse(70 + offsetX, 40, 80, 80);
    ellipse(120 + offsetX, 50, 60, 60);
    rect(0 + offsetX, 30, 140, 50, 25);
    pop();
  }
}
 

Silkworm - Turtle Graphics X P5.js

 
function drawCocoon() {
  for (var i = 0; i < 7; i++) {
    translate(random(-200 * i, 200 * i), random(-200 * i, 200 * i));
    push();
    rotateZ(random(10));
    rotateX(random(10));
    rotateY(random(20));
    ellipsoid(30 + i * random(40), 40 + i * random(60));
    pop();
  }
}
function drawLine(length) {
  for (var i = 0; i < 60; i++) {
    t.penUp();
    t.moveTo(0, random(800));
    t.penDown();

    for (var length = 0; length < 500; length++) {
      t.moveForward(length + random(10));
      if (length < 45) {
        t.turnRight(random(30));
      } else {
        t.turnLeft(random(30));
      }
    }
  }
}
 

Happy Coding - Paper.js X Laser Cutter

 
drawFace(center, 240);
function drawFace(point, size) {
  var face = new Path.Ellipse({
    center: point,
    fillColor: "#ffb703",
    size: size,
    strokeColor: "#fb8500",
    strokeWidth: 2,
    shadowColor: "#fb8500",
    shadowOffset: new Point(6, 12),
  });
  faceOffset = (Math.random() - 0.5) * 30;
  extraOffset = Math.random() * 10;
  if (face.size > 90) {
    var leftEye = new Path.Circle({
      center: point + new Point(-30, 0),
      radius: 4,
      fillColor: "#000000",
    });
    var rightEye = leftEye.clone();
    rightEye.position.x = point.x + 60 + faceOffset;

    var mouth = new Path.Arc({
      from: point + new Point(-30 + faceOffset, 30 + faceOffset),
      through: point + new Point(0, 30 + faceOffset),
      to: point + new Point(30 + faceOffset, 30 + faceOffset + extraOffset),
      strokeColor: "black",
      strokeWidth: 3,
      strokeCap: "round",
    });
  } else {
    var leftEye = new Path.Circle({
      center: point + new Point(-20, -20),
      radius: 4,
      fillColor: "#000000",
    });
    var rightEye = leftEye.clone();
    rightEye.position.x = point.x + 10 + faceOffset;

    var mouth = new Path.Arc({
      from: point + new Point(-10 + faceOffset, 10 + faceOffset),
      through: point + new Point(0, 20 + faceOffset),
      to: point + new Point(10 + extraOffset, 10 + faceOffset),
      strokeColor: "black",
      strokeWidth: 3,
      strokeCap: "round",
    });
  }
}
 

Pixel Blocks - P5.js

 
 
class Block {
  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.frequency= noise(y*10+x*2);
    this.img = createImage(3, 3);
    this.img.loadPixels();  

    let c = color(random(255), random(255), random(255));
    for(let i=0; i<4; i++) {
      let baseX = random(this.img.width);
      let baseY = random(this.img.height);
      this.img.set(baseX, baseY, c);      
    }
    this.img.set(1, 1, c); 
    this.img.updatePixels();
  }

  display() {
      var offsetY = frameCount/ this.frequency % height; 
      image(this.img, this.x, this.y+ offsetY, 20, 20);
  }
}
class Block {
  constructor(x, y, block, size) {
    this.x = x;
    this.y = y;
    this.block = block;
    this.size = size;
    this.img = createImage(block + 10, block);
    this.img.loadPixels();

    var hue = random(360);
    for (var col = 0; col < block; col++) {
      for (var row = 0; row < block; row++) {
        let c = color(hue, 90, random(60, 90));
        this.img.set(col, row, c);
      }
    }
    this.img.updatePixels();
  }

  display() {
    image(this.img, this.x + 4, this.y + 4, this.size, this.size);
  }
}
 

Skyline - P5.js

function drawBuilding(left, top, colCount, rowCount) {
  push();
  translate(left, top);
  for (var x = 0; x < colCount; x++) {
    for (var y = 0; y < rowCount; y++) {
      noStroke();
      fill(
        noise(frameCount / 100 + x * colCount + y) * 10 + 260,
        noise(frameCount / 100 + x * colCount + y) * 100,
        noise(frameCount / 100 + x * colCount + y) * 100
      );
      rect(
        16 * x,
        16 * y,
        noise(frameCount / 50 + x * colCount + y) * 16, // width
        noise(frameCount / 40 + x * colCount + y) * 16, // height
        noise(frameCount / 60 + x * colCount + y) * 8 // corner radius
      );
    }
  }
  pop();
}
 

Mimic Paintings by Random

 

P5.Sound

 
 

Generating Text

 

Tracery

I turn the fun facts about living in space into the fun fakes by providing options for tracery to fill sentences.

Inspired by the Museum of Science, Boston

 

RiTa

Inspired by the lyrics of “Down by the bay.” Children like to sing it by switching animals and objects in a line of the lyrics which is a perfect idea using Rita. Update with rhymes words.