thlai-Project-07-Curves

My math is a bit rusty so my head spun when perusing the Mathworld website. I first played around with the equations given in the project example, which resulted in this:

I studied each part of the code until I was able to create another curve. I created a Cartioid Curve that increases size and rotates based on mouseX, and the background also changes based on the mouseX and mouseY positions.

sketch

// Tiffany Lai
// 15-104, Section A
// thlai@andrew.cmu.edu
// Project 07 - Curves

var nPoints = 500; // amount of points in curve

function setup() {
    createCanvas(480, 480);
}

function draw() {
    // background changes colors based on mouse position
    var r = map(mouseX, 0, width, 50, 200);
    var g = map(mouseY, 0, width, 150, 200);
    var b = map(mouseX, 0, height, 200, 255);
    background(r - 100, g - 100, b - 100, 130);

    drawCurve(); // draw the cardioid curve
}

function drawCurve(){
    //mathworld.wolfram.com/Cardioid.html

    var x; // defining x and y positions of vertices in curve
    var y;

    var a = map(mouseX, 0, width, 0, 100); // map mouseX from 0 to 5

    fill(100, 200, 255, 20); // blue
    stroke(255); // white
    translate(width/2, height/2);

    beginShape();
    for (var i = 0; i < nPoints; i++) {
        var t = map(i, 0, nPoints, 0, TWO_PI);
        x = a * (1 + cos(t)) * cos(t); // parametric equation of cardioid
        y = a * (1 + cos(t)) * sin(t); // parametric equation of cardioid

        rotate(radians(mouseX/500)); // rotate based on mouseX
        ellipse(x, y, 1, 1); // draw spiral of dots
        vertex(x, y); // draw the first curve (blue)
    }
    endShape();

    beginShape();
    for (var i = 0; i < nPoints; i++) {
        var t = map(i, 0, nPoints, 0, TWO_PI);
        x2 = a * (1 + cos(t)) * cos(t); // parametric equation of cardioid
        y2 = a * (1 + cos(t)) * sin(t); // parametric equation of cardioid

        rotate(radians(mouseX/500)); // rotate based on mouseX
        fill(255, 150, 150, 20); // pink
        vertex(x2, y2); // draw the second curve (pink)
    }
    endShape();
}

thlai-LookingOutwards-07

Wind of Boston: Data Paintings is an installation by Refik Anadol Studios that uses data from patterns of wind around Boston and turns them into a series of data paintings. Even though this visualization is not necessarily immediately readable by the viewer to gain valuable information, the final product(s) are beautiful installations on digital canvases. Refik Anadol Studios developed custom software to analyze and visualize wind speed and direction patterns throughout one year, and used that data to create the series. The visuals provide a very fluid, calming feel and make me reminisce about the oceanside, which may have been the artists’ intention. I truly appreciate the dynamics of each piece and the process documentation. The final results are incredibly beautiful.

thlai-Project-06-Abstract-Clock

I was inspired by both Wassily Kandinsky’s abstract art and the MOMA’s perpetual calendar. I put the two of these together to create a more minimal version of an abstract clock.

The triangle spins using milliseconds, the red arc grows using seconds, the black circle moves using minutes, and the gray circle moves along the black bar using hours.

sketch

// Tiffany Lai
// 15-104, Section A
// thlai@andrew.cmu.edu
// Project 06 - Clock

function setup() {
    createCanvas(480, 480);
    angleMode(DEGREES);
}

function draw() {
    background(258, 252, 234);

    fill(250, 244, 219);
    noStroke();
    ellipse(50, 50, 750, 750); // background left circle

    // TIME
    /* Every millisecond, the background triangle will spin. 
    Every second, the red circle will be filled in more.
    Every minute, the black dot in the red circle will move.
    Every hour, the gray circle on the black bar will move. */

    milliseconds(); // background triangle
    seconds(); // red circle
    hours(); // black bar
    minutes(); // black circle inside red circle

    strokeWeight(2);
    stroke(190, 50, 50);
    line(350, 285, height, 285); // line indicating 0 seconds

    noFill();
    stroke(60);
    line(235, 64, 301, 50); // decoration line 1
    line(242, 84, 304, 62); // decoration line 2
    ellipse(width-30, 0, 400, 400); // decoration circle 1
    ellipse(width+10, 10, 400, 400); // decoration circle 2 

    push();
        noStroke();
        fill(0, 53, 176, 80);
        ellipse(370, 190, 100, 100); // blue circle
    pop();
}

// HOURS
function hours() {
    push();
    noStroke();
    fill(100);
    rect(25, 340, 265, 13); // draw bar

    var h = hour() % 12; // 12 hr time instead of 24 hr time
    if (h == 0){
        h = 12;
    }

    var hx = map(h, 0, 11, 32, 282); // map hours to length of bar
    fill(200);
    ellipse(hx, 332, 16, 16); // draw circle
    pop();
    print(hour());
}

// MINUTES
function minutes(){
    var m = minute();
    var mx = map(m, 0, 59, 0, 360);

    push();
        fill(0);
        noStroke();
        translate(270, 285);
        rotate(mx);
        ellipse(100, 0, 16, 16);
    pop();
}

// SECONDS
function seconds(){
    var s = second();
    var sx = map(s, 0, 60, 0, 360); // map minutes to circle

    if (s==60){
        s = 0;
    }

    // red circle
    push();
        noFill();
        strokeWeight(13);
        stroke(223, 97, 97);
        ellipse(270, 285, 230, 230); // draw circle
        
        translate(270, 285);
        strokeWeight(13);
        stroke(190, 50, 50);
        strokeCap(SQUARE);
        arc(0, 0, 230, 230, 0, sx); // arc grows by the second
    pop();
}

// MILLISECONDS
function milliseconds(){
    var prevSec = s;
    var millisRollover = 0;
    var s = second();

    if (s != s) {
        millisRollover = millis();
    }

    var mils = floor(millis() - millisRollover);
    var milsToSeconds = s + (mils/1000.0);
    var milsRotate = map(milsToSeconds, 0, 60, 0, 360);    

    // triangle
    push();
        noStroke();
        translate(width/2-20, height/2);
        rotate(milsRotate);
        fill(239, 234, 203);
        triangle(0, -195, -167, 97, 167, 98); 
    pop();
}









thlai-Looking-Outwards-06

Holger Lippmann: Noise Scape 4

Holger Lippmann’s Noise Scape 4 series contain generative art pieces that compute randomness in color arrays, shapes, and noise to create beautiful landscape paintings. Although the technicality of these pieces are considered basic, Lippmann says there was a large amount of fine tuning in order to get the result he wanted. Lippmann lets the code run and then generate an output of 100 images, then chooses his favorites from the set.

The result of his art is visually stunning. He creates a lot of random generative art like this one, but this one caught my eye because of its beautiful flowing shapes and calm colors. When viewed from a distance, they really do look like landscapes of color, but zoomed in close, I can see each shape and how it changes.

thlai-Project-05-Wallpaper

I wanted to create a pond-like wallpaper with fish and water ripples. At first, I had my fish going straight to the right, horizontally, but decided it looked too static. I rotated/translated instead, to make it seem like the fish were following each other in a stream.

sketch

// Tiffany Lai
// 15-104, Section A
// thlai@andrew.cmu.edu
// Project 05 - Wallpaper

function setup() {
    createCanvas(480, 480);
    noLoop();
    angleMode(DEGREES);
    ellipseMode(CENTER);
}

function draw() {
    background(245, 241, 219);

    var fx = 25;
    var fy = 10;
    var num = 7; // number of fish in each row
    var offset = 10;

    // CREATE ROWS OF FISH
    for (var y= 0; y < 9; y ++){
        for (var x = 0; x < num; x ++) {
            if(y%2==1){ // every other  row
                num = 3;
                offset = 100;
            } else {
                num = 4;
                offset = 10;   
        }
            translate(5, 0);
            rotate(x);
            fish(fx*5*x + offset, fy+60*y-20); // draw the fishes
        }
    }   

    // CREATE WATER DROPS
    var droplet = 100;
    for(var i = 0; i < 6; i++){
        push();
        stroke(255, 190);
        strokeWeight(2);
        noFill();
        ellipse(400, 10, 10+i*(5+i*10), 10+i*(5+i*10)); // right ripples
        ellipse(150, 200, i*40, i*40); // middle ripples
        ellipse(0, 50, droplet-i*20, droplet-i*20); // top ripples
        pop();
    }
}

// FISH FUNCTION
function fish(fx, fy) {

    push();
    translate(fx, fy);
    rotate(30);
    noStroke();

    fill(random(210, 255), 110, 74); // fill with random orange
    quad(20, 27, 38, 39, 28, 52, 53, 37); // tail
    triangle(71, 22, 78, 21, 83, 27); // top fin
    triangle(68, 51, 82, 42, 79, 49); // bottom fin

    fill(random(50,100), random(90,150), random(130,180)); // fill with random blue
    beginShape(); // body
        vertex(53, 37);
        vertex(78, 27);
        vertex(92, 29);
        vertex(100, 37);
        vertex(95, 43);
        vertex(77, 43);
    endShape();
    pop();
}

thlai-Looking-Outwards-05

Marpi’s installation named “The Wave” is an interactive, meditative touchscreen that uses 3D computer graphics to create an abstractive wave form. The installation is a large scale installation that allows users to touch the multiple screens and guide the water particles. The shapes of that particles that make up the wave are generative, and they are constantly evolving and moving. I admire its simplicity and its tendency not to overdo the project with crazy colors or movements, but Marpi’s installation is a flowy, slow-moving art. Just watching the video is incredibly soothing and satisfying as I follow each particle from its beginning point to its end.
Marpi’s simulation is built by using open source shaders powered by Three.js. In an interview, he says that he is inspired by the people he interacts with every day, and believes art is a way to show others his dreams and place people inside his art.

thlai-Project-04-String-Art

I don’t know if this is the way to do it, but I set the gradient background by basically using a ‘for’ loop of strings and changing the colors. Als0, when the drawing resets, I noticed a blink, but I have not been able to figure out how to get rid of that.

thlai-project-04

// Tiffany Lai
// 15-104, Section A
// thlai@andrew.cmu.edu
// Project 04 - String Art

var t;

function setup() {
    t =1;
	createCanvas(640, 480);
    strokeWeight(1/4);
    noFill();
    angleMode(DEGREES);
}


// when triangle rotates all the way, reset
function reset(t){
    if (t/100 > 2.4) {
        setup();
    }
}


function draw() {
    t++;

    // set gradient background
    for (var i=0; i < 1000; i++) {
        stroke(20+i/2, 80+i/4, 90+i/4);
        line(0, 0+i, width, 0+i,);
    }
    
    // make 99 "strings"
    var num = 55;
    for (var i = 0; i < num; i++){
        // gradient stroke color
        stroke(i*5, i*7, i*11);

        var x1 = 0;
        var y1 = i*height/num;
        var x2 = i*width/num;
        var y2 = height;

        // draw strings
        line(x1, y1, x2, y2); // bottom left
        line(x2, 0, x1, height-y1); // top left
        line(width, height-y1, x2, y2); // bottom
        line(x2, 0, width, y1); // top right
    }

    push();

        var x1 = 0;
        var y1 = -138;
        var x2 = -120;
        var y2 = 70;
        var x3 = 120;
        var y3 = 70;

        var fade = 100;
        fade = 255 - t;
        stroke(255, 255, 255, fade); // triangle fades
        translate(width/2, height/2);
        triangle(x1, y1, x2, y2, x3, y3);

    for (var i = 0; i < 50; i++){ // center triangle
        rotate((t/100));
        triangle(x1, y1, x2, y2, x3, y3);
    }
    pop();

    print(t/100);
    reset(t);

}

thlai-Looking-Outwards-04

Doug Wheeler’s PSAD Synthetic Desert III is an immersive installation I was too late to get tickets for when I visited the Guggenheim Museum in NYC last summer, which is why it piqued my interest for this assignment. It doesn’t necessarily use sound, rather, it focuses on the lack of noise and its significance.

This exhibition was designed to minimize noise and takes advantages of architectural acoustics materials. The space allows viewers to sit on a platform and soak up the silence in this minimalistic room. It focuses on the reduction of optical and acoustical sensations, and it uses the repetition of pyramid structures, similar to the type you would find in a recording studio.

Wheeler explains the significance of having his exhibition in New York City, a city riddled with noise pollution. It is impossible to escape noise, and the Synthetic Desert can act as an escape from such a loud environment. Wheeler speaks of his inspiration, which stems from when he landed alone in a dried Arizona lakebed and just heard…nothing. He says, “I’m hearing distance. When you’re in some place that has immensity…you become conscious of yourself, it changes your perspective of how we fit into the mix of the whole universe.” I admire his deep passion for having others experience what he experienced in that moment, and his commitment to this project (which he started 48 years ago).

thlai-Project-03-Dynamic-Drawing

I had a lot of fun making this, although a large part of it was guess and check for the code I was not familiar with. I wanted it to look something like a kaleidoscope with 8 reflective sides, so I created a symmetrical and radial composition.

thlai-project-03

// Tiffany Lai
// 15-104, Section !
// thlai@andrew.cmu.edu
// Project 03 - Dynamic Drawing

var r; // RED
var g; // GREEN
var b; // BLUE

function setup() {
    createCanvas(640, 480);
    rectMode(CENTER);
    noStroke();
    fill(255, 150);
    sq1 = { // CENTER
        x: 0,
        y: 0,
        w: 100,
        h: 100,
    }
    sq2 = { // MIDDLE CIRCLE
        x: 150,
        y: 0,
        w: 100,
        h: 100,
    }
    sq3 = { // BG LINES
        x: 250,
        y: 0,
        w: 10,
        h: 10,
    }
}

function draw() {
    background(r, g, b);

    r = map(mouseX, 0, width, 100, 230); // BG (change colors)
    g = map(mouseY, 0, width, 150, 200);
    b = map(mouseX, 0, height, 200, 255);

    sq1.w = map(mouseX, 0, width, 20, 200); // CENTER SQUARE (change size with mouseX)
    sq1.h = map(mouseX, 0, width, 20, 200); 

    sq2.w = map(mouseX, 0, width, 100, 20); // CIRCLE OF SQUARES (change size with mouseX)
    sq2.h = map(mouseX, 0, width, 100, 20);

    sq3.w = map(mouseY, 0, height, 1, 200); // BACKGROUND LINES (change size with mouseX)
    sq3.h = map(mouseY, 0, height, 1, 500);


    translate(width/2, height/2);

    for (var i = 0; i < 16; i++) { // BACKGROUND LINES
        push();
        fill(r-10, g-10, b-10); // vertical lines
        rotate(TWO_PI * i / 16);
        rotate(radians(mouseX/50)); // rotation speed
        rect(sq3.x, 0, 5, sq3.h);

        rotate(TWO_PI * i / 16); // horizonal lines
        rotate(radians(mouseX/50)); // rotation speed
        rect(sq3.x, 0, sq3.w, 5);
        pop();
    }

    push(); // CORNER LINES
    strokeWeight(1);
    translate(-width/2, -height/2);
    stroke(r-30, g-30, b-30);
    line(0, 0, mouseX, mouseY); // line point follows mouse
    line(0, height, mouseX, mouseY);
    line(width, 0, mouseX, mouseY);
    line(width, height, mouseX, mouseY);
    pop();

    rotate(radians(mouseX/7)); // CENTER SQUARE
    rect(sq1.x, sq1.y, sq1.w, sq1.h);

    for (var i = 0; i < 8; i++) { // CIRCLE OF SQUARES is eight
        push();
        rotate(TWO_PI * i / 8);
        rotate(radians(mouseX/10)); // rotation speed
        rect(sq2.x, sq2.y, sq2.w, sq2.h);
        pop();
    }
}













thlai-LookingOutwards-03

 

 

Custom Jewelry – Nervous System

All of Nervous System’s (a generative design studio) projects are intriguing and inspired by natural phenomena, but their custom jewelry in particular caught my eye. These beautiful rings are truly one of a kind, as each fuses together art, science, and technology. Nervous System’s rings are inspired by natural phenomena such as cells and coral, and they are first 3D printed in wax then cast in metal.

What I admire most about Nervous System’s work is how many of their jewelry pieces are co-created with the client, meaning the client had a large role of co-designing via Nervous System’s app, Cell Cycle. Not much information is given on their process and the algorithms used to build their pieces, but their generative work is always grounded by their fascination of organic shapes and unconventional geometries, as stated in their biography. They design a system that generates these natural forms to create all sorts of pieces of art, and as generative art is, each piece is different than the last.

When I look at all of Nervous System’s work, it’s clear that they take a liking to certain patterns – a lot of their work look like nerves or coral – yet each is distinctive. That’s the beauty of generative artwork.