Jasmine Lee – Project 07 – Curves

curvescomposition

//Jasmine Lee
//jasmine4@andrew.cmu.edu
//Section C
//Project-07 (Composition with Curves)

var points = 100; //helps control length of curves
var turn = 0; //controls speed of rotation

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

function draw() {
    background(20, mouseX / 3, 20);

    //"normal" speed curves
    push();
    translate(width / 2, height / 2);
    rotate(radians(turn));
    turn ++;
    drawEpi();
    drawEpi2();
    drawEpi3();
    pop();

    //slowest set of curves
    push();
    translate(width / 2, height / 2);
    rotate(radians(turn / 2));
    turn ++;
    drawEpi();
    drawEpi2();
    drawEpi3();
    pop();

    //fastest spinning set of curves
    push();
    translate(width / 2, height / 2);
    rotate(radians(turn * 2));
    turn ++;
    drawEpi();
    drawEpi2();
    drawEpi3();
    pop();

    //faster spinning set of curves
    push();
    translate(width / 2, height / 2);
    rotate(radians(turn * 1.5));
    turn ++;
    drawEpi();
    drawEpi2();
    drawEpi3();
    pop();

    //creates center of flower
    noStroke();
    fill(255, 255, 255, 50);
    ellipse(width / 2, height / 2, mouseX / 2.5, mouseX / 2.5);
    fill(255, 255, 255, 50);
    ellipse(width / 2, height / 2, mouseX / 4, mouseX / 4);
    fill(255, 255, 255, 50);
    ellipse(width / 2, height / 2, mouseX / 5, mouseX / 5);

}

//draws the smaller epicycloid curve
function drawEpi() {
    var a = map(mouseX, 0, width, 10, 100);
    var b = a / 2;

    //curves
    strokeWeight(3);
    stroke(mouseX / 2, 30, mouseY / 2);
    noFill();
    beginShape();
    for (var i = 0; i < points; i ++) {
        var t = map(i, 0, 50, 0, TWO_PI);
        crvX = ((a + b) * cos(t)) - (b * cos(((a + b) / b) * t))
        crvY = ((a + b) * sin(t)) - (b * sin(((a + b) / b) * t))
        curveVertex(crvX, crvY);
    }
    endShape();
}

//draws the medium epicycloid shape (filled-in)
function drawEpi2() {
    var a = map(mouseX, 0, width, 10, 300);
    var b = a / 2;

    //curves
    fill(mouseY / 2, 50, mouseX / 2, 100);
    beginShape();
    for (var i = 0; i < points; i ++) {
        var t = map(i, 0, 50, 0, TWO_PI);
        crvX = ((a + b) * cos(t)) - (b * cos(((a + b) / b) * t))
        crvY = ((a + b) * sin(t)) - (b * sin(((a + b) / b) * t))
        curveVertex(crvX, crvY);
    }
    endShape();
}

//draws the biggest epicycloid curves
function drawEpi3() {
    var a = map(mouseX, 0, width, 60, 400);
    var b = a / 2;

    //curves
    stroke(mouseY / 2, 60, mouseX / 2);
    noFill();
    beginShape();
    for (var i = 0; i < points; i ++) {
        var t = map(i, 0, 50, 0, TWO_PI);
        crvX = ((a + b) * cos(t)) - (b * cos(((a + b) / b) * t))
        crvY = ((a + b) * sin(t)) - (b * sin(((a + b) / b) * t))
        curveVertex(crvX, crvY);
    }
    endShape();
}

The trickiest part of doing this project was figuring how to create the curves using the mathematical formulas. I had to carefully study the formula to understand it. For this project, I was inspired by the Camellia flowers, which has petals that look as if they’re rotating around the center. It was interesting to be able to see the different curves and colors generated by the movement of the mouse.

The flower is bigger when mouseX is greater (towards the right side of the screen).
The colors get darker and more muted as the cursor approaches the top-left corner of the screen.
The flower as it appears when the cursor is near the center of the canvas.

Jasmine Lee – Looking Outwards – 07

Created by Nathan Yau in 2017, Occupation Matchmaker is an interactive data visualization that looks at who people in certain occupations end up marrying. The project builds off an earlier project released by Adam Pearce and Dorothy Gambrell for Bloomberg.

Software developers often end up marrying within the same industry, notably to other software developers.
Original visualization by Pearce and Gambrell.

Yau’s artistic sensibility is clearly visible in the way he chose to visualized the grouping of different types of occupations and how they overlap. The visualization of this project, compared to its initial development by Pearce and Gambrell, showcase a more holistic image across the board. The viewer is made clearly aware of the connections that exist between different occupations within the same industry whereas the earlier chart shows more linear connections. In creating this visualization, Yau made sure to take into account how some occupations are much more common than others, and used a relative scale to change the sizes of the circles. Yau created this visualization using R (to analyze) and d3.js.

Musicians overwhelmingly marry other musicians, but also marry others from wildly different occupations.

Jasmine Lee – Project 06 – Abstract Clock

abstractclock

//Jasmine Lee
//jasmine4@andrew.cmu.edu
//Section C
//Project-06-Abstract Clock

var h;
var m;
var s;
var start;

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

function draw(){
    h = hour();
    m = minute();
    s = second();
    start = 270;
    var cloudX = s * 8;

    //determines if day-sky or night-sky
    if (h > 6 & h < 19){
        background(156, 224, 229);
    } else{
        background(31, 47, 71);
    }

    angleMode(DEGREES);

    //minute-cloud
    if (cloudX > width){
        cloudX = 0;
    } else{ 
        cloudX = cloudX + width / 60 / 60;
    }
    noStroke();
    fill(255, 255, 255, 240);
    ellipse(cloudX, 130, 100, 40);
    ellipse(cloudX + 20, 105, 40, 40);
    ellipse(cloudX - 10, 110, 60, 40);

    //rainbow
    noFill();
    strokeWeight(20);
    //red-hours-clock
    stroke(255, 89, 74, 100);
    arc(240, 125, 200, 200, start, start + h * 15);
    //yellow-minutes-clock
    stroke(255, 234, 74, 100);
    arc(240, 125, 180, 180, start, start + m * 6);
    //blue-seconds-clock
    stroke(74, 146, 255, 100);
    arc(240, 125, 160, 160, start, start + s * 6);

    //lens-flares
    strokeWeight(1);
    stroke(255, 255, 255);
    ellipse(240, 125, 280, 280);
    strokeWeight(3);
    stroke(255, 255, 255, 100);
    ellipse(240, 125, 295, 295);
    noStroke();
    fill(255, 255, 255, 50);
    ellipse(120, 225, 60, 60);
    ellipse(150, 200, 30, 30);
    ellipse(320, 70, 10, 10);
    ellipse(350, 50, 40, 40);

    //determines whether sun or moon is in center
    if (h > 6 & h < 19){

        //sun
        fill(255, 234, 74);
        ellipse(240, 125, 100, 100);

        //sun-rays
        push();
        noStroke();
        translate(240, 125);
        triangle(-10, 0, 10, 0, 0, 70 * (s % 2));
        triangle(-10, 0, 10, 0, 0, -70 * (s % 2));
        triangle(-70 * (s % 2), 0, 0, 10, 0, -10);
        triangle(70 * (s % 2), 0, 0, 10, 0, -10);
        pop();

        } else{

        //moon
        noStroke();
        fill(189, 201, 219, 240);
        ellipse(240, 125, 130, 130);
        ellipse(270, 110, 10, 10);
        ellipse(235, 105, 30, 30);
        ellipse(210, 80, 20, 20);
        ellipse(270, 150, 40, 40);
        ellipse(270, 80, 10, 10);
        ellipse(290, 95, 5, 5);
        ellipse(230, 175, 20, 20);
        ellipse(205, 140, 40, 40);

        //lower-left-star
        push();
        noStroke();
        fill(229, 241, 255);
        translate(120, 225);
        triangle(-5, 0, 5, 0, 0, 20 * (s % 2));
        triangle(-5, 0, 5, 0, 0, -20 * (s % 2));
        triangle(-20 * (s % 2), 0, 0, 5, 0, -5);
        triangle(20 * (s % 2), 0, 0, 5, 0, -5);
        pop();

        //upper-right-star
        push();
        noStroke();
        fill(229, 241, 255);
        translate(350, 50);
        triangle(-5, 0, 5, 0, 0, 30 * (s % 2));
        triangle(-5, 0, 5, 0, 0, -30 * (s % 2));
        triangle(-30 * (s % 2), 0, 0, 5, 0, -5);
        triangle(30 * (s % 2), 0, 0, 5, 0, -5);
    }

}

Preliminary Sketch of my Abstract Clock.

I decided to use the sun and moon symbols in my abstract clock because I felt they were both universal symbols for representing time. I also experimented with transparency and movement when I created the cloud and stars moving in the sky. I was able to use modulus as a way to make the stars twinkle. With this exercise, I was able to learn a lot about using rotation, push, and pop.It was a bit frustrating getting everything to move in order with each other, but in the end I managed to make it work.

Jasmine Lee – Looking Outwards – 06

Siebren Versteeg is a digital artist who uses algorithmic code to generate his pieces. He observes existing abstract paintings and then writes code based on his perceived understandings of those paintings. His works are a result of layers and layers of algorithmic generated strokes, which are then captured at a random point in time. Since Versteeg’s works are so complex and layer-based, the varying times at which they are captured can drastically change the end result.

Truisms, 2018. Images based on Jenny Holzer’s text were googled and compiled in real-time before being refreshed every 3 minutes and disappearing forever.

Before painting, Versteeg chooses the different variables he uses to create his art. These variables range from the color of the paint, the type of binder used, the way the paint sticks, and the way the paint drips, as well as more. Versteeg’s artistic sensibility is definitely visible in the way he chooses to compile his pieces, with a combination of dream-like strokes and more image-based cutouts. His pieces range dramatically, from abstract fractals to more collage inspired pieces.

Imploder, 2013. A slightly older piece of Versteeg’s.

Jasmine Lee – Project 05 – Wallpaper

sky

//Jasmine Lee
//jasmine4@andrew.cmu.edu
//Section C
//Project 5 (Sky)

function setup(){
    createCanvas(600, 600);

    //dark-blue background
    background(17, 35, 94);

    //short star trail
    for(var a = 0; a < 701; a += 100){
        for(var b = 0; b < 701; b += 100){
            noStroke();
            fill(255, 255, 255);
            ellipse(a, b, 3, 3);
            ellipse(a + 4, b + 4, 1, 1);
        }   
    }

    for(var c = 25; c < 701; c += 100){
        for(var d = 25; d < 701; d += 100){

            //long star trail
            fill(255, 255, 255);
            ellipse(c, d, 3, 3);
            ellipse(c + 20, d + 10, 2, 2);
            ellipse(c + 25, d + 15, 1, 1);
            ellipse(c + 30, d + 15, 1, 1);
            ellipse(c + 10, d + 20, 1, 1);
            ellipse(c + 5, d + 10, 2, 2);


            //ufo ship glass
            fill(255, 255, 255, 100);
            ellipse(c + 15, d + 20, 30, 30);
            fill(208, 255, 161, 200);
            //ufo ship beam
            triangle(c + 15, d + 22, c + 5, d + 70, c + 25, d + 70)
            fill(161, 222, 255);
            //ufo ship body
            ellipse(c + 15, d + 22, 40, 15);

            //alien
            fill (122, 39, 163);
            ellipse(c + 15, d + 20, 12, 17);
            ellipse(c + 10, d + 10, 4, 4);
            ellipse(c + 20, d + 10, 4, 4);
            fill (0);
            ellipse(c + 12, d + 17, 3, 3);
            ellipse(c + 17, d + 17, 3, 3);

            //ufo ship lights
            fill(245, 205, 73);
            ellipse(c, d + 23, 5, 5);
            ellipse(c + 10, d + 25, 5, 5);
            ellipse(c + 20, d + 25, 5, 5);
            ellipse(c + 30, d + 23, 5, 5);

            //small cloud
            fill(255, 255, 255, 50);
            ellipse(c + 30, d, 20, 10);
            ellipse(c + 35, d, 20, 15);
            ellipse(c + 40, d, 20, 10);

            //big cloud
            fill(255, 255, 255, 120);
            ellipse(c + 10, d + 40, 40, 15);
            ellipse(c + 15, d + 35, 30, 20);
            ellipse(c + 20, d + 40, 40, 15);
        }
    }


}

For my wallpaper, I was inspired by classic children’s designs. I decided to create a alien-themed wallpaper and the starry sky. With this project, I enjoyed playing around with the transparency of the elements in order to depict the clouds. In my sketch, I arranged how I wanted my elements to appear before actually coding it.

A sketch, on grid paper, of the repeating pattern of ellipses.

Jasmine Lee – Looking Outwards – 05

The project I chose to look at this time was RoomCR6‘s Suprematism & Constructivism. I found it interesting in that it was a subtle take on modernizing some well-known Suprematism pieces. Suprematism was an art movement, originating in Russia, that tried to convey the feeling of “pure artistic feeling. “While they kept the themes from much of the paintings, including the geometric shapes, lines, and colors, RoomCR6 recreated the paintings using 3D objects. They used programs such as Cinema 4D and Arnold Render in order to create these images.

One of RoomCR6’s Suprematism recreations.
Another of RoomCR6’s recreations.
RoomCR6’s inspiration and precedents for this project.

It is interesting to see how RoomCR6 gave hierarchy to the previously flat, overlapping shapes in their recreations using 3D modeling. The subtle shadows and glossy material of the objects create a luminosity and dimension that were not there in the precedent paintings, as well as giving a sense of the objects floating in space. The series of works was published in May 2017. The artists’ sensibility is noticeable in how they chose to use beveled edges, perhaps to differentiate from the sharp edges of the historic paintings.

Jasmine Lee – Project 04 – String Art

strings

//Jasmine Lee
//Section C
//jasmine4@andrew.cmu.edu
//Project-04 (String Art)

function setup() {
    createCanvas(300, 400);
}

function draw() {
    //black background
    background(100);
   
    //left(white) half of the vertical lines
    for (var a = 0; a < 151; a += 2) {
        stroke(255);
        line(a, mouseY, a, mouseX);
    }

    //right(black) half of the vertical lines
    for (var b = 150; b < 301; b += 2) {
        stroke(0);
        line(b, mouseY, b, mouseX);
    }

    //top(white) half of the horizontal lines
    for (var c = 0; c < 201; c += 2){
        stroke(255);
        line(mouseX, c, mouseY, c);
    }

    //bottom(black) half of the horizontal lines)
    for (var d = 200; d < 401; d += 2){
        stroke(0);
        line(mouseX, d, mouseY, d);
    }

    //creates white "plus" sign 
    fill(255);
    rectMode(CENTER);
    noStroke();
    rect(150, 200, 20, 200);
    rect(150, 200, 200, 20);

    //creates the curves in all four corners
    for (var e = 0; e < 300; e += 2) {
        stroke(0);
        //top left corner
        line(0, height - e * 1.5, e, 0);
        //bottom right corner
        line(e, height, width, height - e * 1.5);
        stroke(255);
        //top right corner
        line(width, height - e * 1.5, width - e, 0);
        //bottom left corner
        line(width - e, height, 0, height - e * 1.5);
    }

}

For my string art, I wanted to create a piece with a dystopian feeling to it. I decided to use a strong composition, with a symbol right in the middle of the canvas, and animated strings that give a disoriented effect to the viewer.

Jasmine Lee – Looking Outwards – 04

A great example of music and computation is Wintergatan‘s Marble Machine. The music is visualized physically using metal marbles running on a track. These marbles are carried up using a wheel (physically operated by the musician), dropping onto various surfaces such as vibraphone, bass guitar, and cymbals. Other instruments, such as the the kick drum and snare drum are emulated using contact microphones and other software. The music “scores” are actually two giant wooden wheels arranged with LEGO pegs. These pegs, when turning, knock into specific keys which then trigger the release of a marble above a certain vibraphone key.

The person responsible for the machine, Martin Molin, designed and built the machine with the use of a 3D printer and a CNC machine. While not purely a computational project, this project involves the use of computers for the purpose of emulating drums as well as overlaying the music tracks onto each other. It is also computational in the sense that this machine and its parts all had to be carefully calculated and coordinated in order to work. What I admire most about this project is the way in which Molin chose to design the machine. It could’ve been very possible to manifest it as a linear marble track, but Molin chose to design a self-contained machine in which the loop of the marbles is closed. It is also amazing to see the actual physical movements behind the sound that is being produced.

Wintergatan sells blueprint posters of their “Marble Machine” in light of their success with this project.

Jasmine Lee – Project 03 – Dynamic Drawing

jasminedrawing

//Jasmine Lee
//Section C
//jasmine4@andrew.cmu.edu
//Project-03 (Dynamic Drawing)

var r = 10;
var g = 100;
var b = 50;
var angle = 0;
var sizeX = 10; 
var sizeY = 15;
var circlesize = 80;

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


function draw() {
    //change background color
    background(r + mouseX , g + mouseY, b);

    noStroke();


if (mouseX > width / 2) {
    rectMode(CENTER)
}
    push();
    translate(width / 2, height / 2);
    rotate(radians(angle));

    //rectangle
    fill(r + mouseX - mouseY, g + mouseX, b + mouseY)
    rect(mouseX, mouseY, sizeX, sizeY);
    rect(mouseX + 5, mouseY + 2, sizeX + 2, sizeY + 2);
    rect(mouseY - 100, mouseX - 220, sizeX, sizeY)
    rect (mouseY - 150, mouseX - 130, sizeX - 30, sizeY - 30);

    //rectangleset2
    fill(r - mouseX + mouseY, g - mouseX, b - mouseY)
    rect(mouseX + 50, mouseY - 50, sizeX / 2, sizeY / 2);
    rect(mouseX - 50, mouseY - 60, sizeX / 3, sizeY / 3);
    rect(mouseY - 100, mouseX - 220, sizeX / 4, sizeY / 5);
    rect(mouseX - 150, mouseY - 130, sizeX - 30, sizeY - 30);

    //rectangleset3
    fill(r - mouseX + mouseY, g - mouseX, b - mouseY)
    rect(mouseX / 2, mouseY / 2, sizeX / 2, sizeY / 2);
    rect(mouseY / 5, mouseX /5, sizeX + 100, sizeY - 100);
    rect(mouseX, mouseY, sizeY, sizeX);
    rect(mouseX - 150, mouseY - 130, sizeX - 30, sizeY - 30);



    pop();

    //constraining size of the ellipses
    var m = max(min(mouseX, 640), 0);
    var size = m * 350.0 / 640.0;

    //ellipse 1
    fill(r + mouseX / 2, g + mouseX / 2, b + mouseX / 2);
    ellipse(width / 2, height / 2, size, size);

    //ellipse 2
    fill(r + mouseX / 2, g + mouseX / 2, b + mouseX);
    ellipse(width / 2, height / 2, size * 0.9 , size * 0.9);

    //ellipse 3
    fill(r + mouseX, g + mouseX / 2, b + mouseX / 2);
    ellipse(width / 2, height / 2, size * 0.7 , size * 0.7);

    //ellipse 4
    fill(r + mouseX / 2, g + mouseX, b + mouseX / 2);
    ellipse(width / 2, height / 2, size * 0.5 , size * 0.5);


    angle = angle + 0.5;
    sizeX = width - (0.5 * mouseX);
    sizeY = height - (0.5 * mouseY);
}

I was inspired to create this dynamic drawing by the animations that show music beats. I tried to convey a bright, energetic atmosphere by using different variations of colors and undulating shapes.

Jasmine Lee – Looking Outwards – 03

This week, I chose to explore the world of parametric design and crafting by looking into artist Jimmy Jian‘s ceramic pieces. He creates a variety of ceramic containers through 3D modeling. Using Grasshopper (a Rhinoceros 3D plugin), he is able to produce many iterations of whichever design he is working on at the moment. What I appreciate most about his pieces are the elegant, repeating qualities they have, simplistic in form but complex by nature.

A few of Jian’s recent ceramic pieces, demonstrating the variety of patterns he is able to produce.

Jian’s process involves first modeling the forms using Grasshopper. Then, using a 3D printer, he is able to print out the forms to a very high degree of accuracy. Those forms are then inserted into plaster to create molds, which are then used to slip-cast the ceramic pieces. The resulting pieces are then glazed in various colors and fired. This workflow allows Jian to replicate the pieces in any number he wishes, as long as he keeps the mold intact. The artist’s sensibilities show in the color of the glazes he uses, keeping to shades of blue and blue-green. He also seems partial to subtle, repetitive patterns.

Iterations tested by Jian, created using Grasshopper’s parametric tools.
Different shapes/sizes of ceramics are paired up with a set number of patterns.
A few of Jian’s finished pieces.