Project-07: Jaclyn Saik

sketch

/* Jaclyn Saik 
Section E
jsaik@andrew.cmu.edu
Project 07
*/

var maxP = 100; //boundary for points plotted by the curve 
var chang = 1; //variable ised for flipping orientation of fish curve


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

function draw() {
    background("PaleTurquoise");
    textSize(10);
    noStroke();
    fill("LightSeagreen");
    text("click me! yay!", 30, 70);
    text("¡a fish that is math!", 80, 300);
    text("math", 270, 400);
    text("glug....glug", 60, 430);
    text("so interactive!", 350, 30);

    translate(width/2, height/2); //puts axis in center of the canvas 
    if (mouseIsPressed) { //sets if statement that inverses fish curve when mouse is pressed
                chang = -1;
            } else {
                chang = 1;
            }
            print(chang); 
    drawFishie(); //calls fish function 
    drawFishie2();
    drawFishie3(); 
    drawFishie4();
}

function drawFishie() {
        var x; //x value for fish curve parametric equation 
        var y; //y value for fish curve parametric equation 
        var a = constrain(mouseY, 20, 450); //constrains a to value between 20 and 450
        var consT = map(mouseX, 0, width, 1, 5); //maps consT so that mouse X plots a number between 1 and 5
        stroke("peachpuff");
        fill("lightpink");
        
        beginShape();
        for (var i = 0; i < maxP; i++) { //for loop that sets maxiumum points form variable above 
            var t = map(i, 0, maxP, 0, TWO_PI); 

        //fish curve
        //http://mathworld.wolfram.com/FishCurve.html

        x = (a * cos(t)) - ((chang)*((a*(sq(sin(t))))) / 2); //change varibale inverses curve when mouse is pressed
        y = (a* cos(t) * (consT)*sin(t));  //constant manipulates the height of
        // the curve based on mouse x position      
        vertex(x, y);
    }
    endShape(CLOSE);
}

function drawFishie2() { //outline, which is slightly off
        var x; //x value for fish curve parametric equation 
        var y; //y value for fish curve parametric equation 
        var a = constrain(mouseY, 20, 450); //constrains a to value between 20 and 450
        var consT = map(mouseX, 0, width, 1, 10); //maps consT so that mouse X plots a number between 1 and 5
        stroke("tomato");
        strokeWeight(2);
        noFill();
        
        beginShape();
        for (var i = 0; i < maxP; i++) { //for loop that sets maxiumum points form variable above 
            var t = map(i, 0, maxP, 0, TWO_PI); 

        //fish curve
        //http://mathworld.wolfram.com/FishCurve.html

        x = (a * cos(t)) - (.5*(chang)*((a*(sq(sin(t))))) / 2); //change varibale inverses curve when mouse is pressed
        y = (a* cos(t) * (consT)*sin(t));  //constant manipulates the height of
        // the curve based on mouse x position      
        vertex(x, y);
    }
    endShape(CLOSE);
}

function drawFishie3() { //outline, which is slightly off
        var x; //x value for fish curve parametric equation 
        var y; //y value for fish curve parametric equation 
        var a = constrain(mouseY, 20, 400); //constrains a to value between 20 and 450
        var consT = map(mouseX, 0, width, 0, 5); //maps consT so that mouse X plots a number between 1 and 5
        stroke("salmon");
        strokeWeight(8);
        noFill();
        
        beginShape();
        for (var i = 0; i < maxP; i++) { //for loop that sets maxiumum points form variable above 
            var t = map(i, 0, maxP, 0, TWO_PI); 

        //fish curve
        //http://mathworld.wolfram.com/FishCurve.html

        x = (a * cos(t)) - (.5*(chang)*((a*(sq(sin(t))))) / 2); //change varibale inverses curve when mouse is pressed
        y = (a* cos(t) * 7*(consT)*sin(t));  //constant manipulates the height of
        // the curve based on mouse x position      
        vertex(x, y);
    }
    endShape(CLOSE);
}

function drawFishie4() { //outline, which is slightly off
        var x; //x value for fish curve parametric equation 
        var y; //y value for fish curve parametric equation 
        var a = constrain(mouseY, 20, 450); //constrains a to value between 20 and 450
        var consT = map(mouseX, 0, width, 0, 6); //maps consT so that mouse X plots a number between 1 and 5
        stroke("orange");
        strokeWeight(5);
        noFill();
        
        beginShape();
        for (var i = 0; i < maxP; i++) { //for loop that sets maxiumum points form variable above 
            var t = map(i, 0, maxP, 0, TWO_PI); 

        //fish curve
        //http://mathworld.wolfram.com/FishCurve.html

        x = (a * cos(t)) - (.7*(chang)*((a*(sq(sin(t))))) / 2); //change varibale inverses curve when mouse is pressed
        y = (a* cos(t) * 10*(consT)*sin(t));  //constant manipulates the height of
        // the curve based on mouse x position      
        vertex(x, y);
    }
    endShape(CLOSE);
}

Fish Curve!
For this project, I had to experiment a lot with figuring out a way to build a shape that relied on the equations I gave it. I hadn’t really thought about it before, but we have been creating equations for the for loops we’ve been generating these past 2 weeks, so once I wrapped my head around this concept, I was able to understand how to plug these equations in and turn them into code. I originally played around with a cruciform curve (which I forgot to screenshot!), but after figuring out the fish curve, I wasn’t as inspired by it’s shape. The fish curve, by the way, is a curve that is based off an ellipse’s equation, with a pedal point at a specific point of eccentricity e^2 = 1/2. I had fun manipulating the variables on my various curves so that the different fish outlines took on slightly different characteristics, and adding interactions (click on screen!).

 

My first fish I created (after experimenting with a couple other types of curves, which I forgot to document. At first, I wanted to make the fish tiny like an actual fish, but I decided something that grew with the mouse was more exciting.

Looking Outwards 06-Jaclyn Saik

As soon as I saw the theme for this week’s Looking Outwards, I immediately knew what I wanted to talk about. There is an art installation between gates 22 and 23 in the San Jose International Airport that I have been walking under and marveling at for about seven years now, but I’ve never looked into how it was actually made or the details of what it represents. This assignment was a great opportunity to do just that.

eCLOUD, from down below.It is suspended beneath a window and reflects real time weather patterns from all around the world.
this is eCLOUD’s information kiosk, which provides information about the weather pattern currently being displayed.

“eCLOUD” is a dynamic, generative sculpture created to simulate the actual behavior and physical make of a natural cloud. The piece, which stretches 120 feet and hangs suspended from the ceiling, is composed of these specialized polycarbonate tiles that transition between different states of transparency. The degree of opacity is determines by weather patterns from around the world, collected and transmitted in real time to create a cloud that appears the same way one would in that particular time zone.

The random element in this piece is the weather, and I think this is an example of biased but true randomness, since rather than it being a “pseudo-random” quantity generated by a computer, it relied complexity on data from the natural world. And because the algorithm pulls data from around the world and a bunch of different climates, some of the weather bias is avoided because multiple regions are covered.

I love this art piece because of the aesthetics: I think a lot of generative computer art can get wildly technical to the point of losing that “easy beauty” that more traditional fine art has, but their piece is so simplistic yet so complex in build that is satisfies both aesthetic appeal and the technical intrigue of a stand-out installation.

Jaclyn Saik- Project 06

sketch

/* Jaclyn Saik 
Section E
jsaik@andrew.cmu.edu
Assignment-06-Project
*/




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


function draw() {
    background("DimGray"); 
    
    // current time variables
    var H = hour();
    var M = minute();
    var S = second();

    var skin = ("OliveDrab");
    var earPositionX = 390;
    var earPositionY = 200;
    var noseW = 10;
    if ((S % 2) > 0) { //if statement that changes variables based on whether seconds are odd or even 
        earPositionX = 390; 
        earPositionY = 200;
        noseW = 10; //variable that changes nostril size
    } else if ((S % 2) == 0) {
        earPositionX = 380;
        earPositionY = 190;
        noseW = 15;
    }
   


    
    
    var lidPosition = 180-(map(H, 0, 23, 0, 180)); //position of eyelids, how wide the eyes are opened 
    var mouthSize = map(M, 0, 59, 10, 300); //map to create gradual transition in size of mouth

    
    //background elements
    noStroke(); 
    fill("DarkMagenta");
    ellipse(150, 200, 580, 690);
    fill("Purple")
    ellipse(150, 200, 480, 530);
    fill("DarkOliveGreen");
    rect(20, 300, 260, 300);


    //the face:
    fill(skin)
    ellipse(150, 200, 450, 500);

    fill("DarkOliveGreen");
    ellipse(40, 135, 140, 190)
    ellipse(230, 135, 140, 190)

    fill("white");
    ellipse(40, 130, 130, 180)
    ellipse(230, 130, 130, 180)

    fill(0);
    ellipse(40, 130, 50, 80);
    ellipse(230, 130, 50, 80);

    //mouth
    stroke("DarkGreen");
    strokeWeight(6);
    fill("black")
    arc(140, 240, 300, mouthSize, 0, PI, CHORD);
    noStroke();

    //ear 
    fill(skin);
    ellipse(earPositionX, earPositionY, 80, 100) //relies on seconds for x and y position

    //eyelids
    fill(skin)
    rect(-30, 40, 140, lidPosition); //eyelids gradually open as the hours get higher/day goes on 
    rect(160, 40, 140, lidPosition); //rely on mapped position variable declared above

    //right eyelash
    stroke(0);
    strokeWeight(4);
    line(163, 40+lidPosition, 300, 40+lidPosition+7); 
    line(163, 40+lidPosition, 310, 40+lidPosition-2);

    //left eyelash
    line(105, 40+lidPosition, -30, 40+lidPosition+7); 
    line(105, 40+lidPosition, -30, 40+lidPosition+3);
    line(105, 40+lidPosition, -30, 40+lidPosition-2);
    

    //eyebrow
    stroke("Purple");
    strokeWeight(8);
    noFill();
    arc(40, 60, 130, 60, PI, 0)
    arc(230, 60, 130, 60, PI, 0)

    //nose

    noStroke();
    fill(0);
    ellipse(125, 200, noseW, 20);
    ellipse(150, 200, noseW, 20);



}

 

This project was an interesting way to create an animation that relied on the entire length of the day to complete, instead of confined within the frame rate we usually declare. I had a lot of different ideas for representing time after browsing that blog post about the different ways that time was represented before modern clocks. I was drawn to the use of sunlight to create elaborate timekeeping sculptures: to me, they looked as much like tools as beautiful works of art.

My sketches. I played with the idea of using sunflowers and other solar imitations, but I really liked how funny a face could be. I was inspired by all of the moving features on a face to accommodate different units of time.

However, for this project  I wanted to include humor and pull myself away from using traditional numerical qualities to tell time. I decided on a face early on, and as I built this person I felt like making this project Halloween-themed is a fitting start to October. This was also my first time really manipulating the map function, which I’m grateful for because now I have a much better grasp on how to use it.

In this clock, I made the witch’s eyelids reliant on the hour: when it is very early in the morning, her eyes are barely open, but as the day progresses they get wider and wider. Her muppet mouth is reliant on the minute, so her mouth gets progressively wider as the minutes increase, and resets at zero every hour. Her ears and nostrils are designed to be more timekeeping devices, as they tick back and forth with each second.

 

Jaclyn Saik-Looking Outwards 05

Dalmiro Buigues is a 3D graphics and motion designer from Buenos Aires. He is a director at the Argentinian design studio “Buda”, and has created 3D work for a variety of high profile clients like Nickelodeon and FOX. One project that really stood out to me was a series of 6 animations he created for the Argentinian launch of the running shoe NIKE EPIC REACT. Each animation sequence is defined by a descriptions of wearing the shoe, and the resulting video includes graphics that show this paired with actual users describing the experience.

It’s like riding a marshmallow unicorn.

It’s like jumping into a cotton candy pool.

It’s like a pillow fight in space

It’s like jumping on velvet springs.

It’s like huging a real size jelly bear.

it’s like diving on a cake made of clouds.”

Original sketches, without 3D graphics
Now with graphics applied.

I was drawn to this project because there was so much information published about the process. First, I watched the final video, and the graphics were stunning in their complexity and photorealistic lighting, even though the animated character were cartoons. I think it’s impressive and important to note that the entire video is spoken in spanish, and yet I could understand practically everything that was going on because the visuals were so compelling and informative of the mood. I think Buigues’s main goal was to create a happy-go-lucky feeling with bright colors and big, smilling characters, and juxtapose the seriousness of the shoe and the task of running with the pleasure of comfort and high jumping and other fun activities that he chose to animate.

I think it is especially interesting to see the process work because I can see Buigues’s original sketches, where he was brainstorming the character, and then I can see renderings using photoshop or other 2D-focused software, and then move onto the final stills, where he used CG software to create these fantastic effects like reflected lighting on space helmets and spongey-yet-metallic texture of springs. I am curious about computer graphic software now because I want to learn more about how you can create characters that have set widths and heights and limbs that maintain their form, and then move them within a space so that the light adjusts accordingly. I know this is how they animate most films now, and I think this is one of the most complex and widely consumed forms of computer art today.

Project 5: Wallpaper

sketch

/* Jaclyn Saik 
Section E
jsaik@andrew.cmu.edu
Project-05-Wallpaper
Eyeballs
*/

function setup() {
    createCanvas(600, 600);
    background("CadetBlue");
    var xs = 70; //x spacing
    var ys = 50 //y spacing
    var yo = 30; //y offset
    var xo = 30; //x offset

    
    for (var y = 0; y < 20; y++) {
        for (var x = 0; x < 20; x++)  {
            if (x % 2 > 0) { //odd-numbered rows are offset by 1.5 times the y position 
                yo = 30 * 1.5;
                //sleepy eye
                strokeWeight(4);
                stroke("DarkSlateGray"); 
                line(px-3, py-3, px-20, py-15);
                line(px-4, py-3, px-25, py-10);
                line(px-5, py, px-28, py-3);
                strokeWeight(2);
                line(px+20, py+2, px+10, py+10);
                fill("Burlywood");
                arc(px, py, 40, 40, PI, 0);
                fill("PeachPuff");
                arc(px, py, 40, 20, PI, 0);
                arc(px, py, 40, 12, 0, PI);
                fill("DarkSlateGray");
                ellipse(px, py-5, 10, 10);

                //accent dots, which are connected to the odd-numbered rows, so sleepy eyeball
                strokeWeight(0);
                fill("Yellow");
                ellipse(px-35, py-35, 2, 4);
                fill("gold");
                ellipse(px-12, py-30, 3, 3);
                fill("Orange");
                ellipse(px+45, py-15, 4, 3);
                fill("Khaki");
                ellipse(px+30, py-20, 3, 3);

            } else if (x % 2 == 0) { //even numbered rows stick to original variable values
                yo = 30;
                //wide awake eye 
                strokeWeight(2);
                line(px-4, py-3, px-28, py-7);
                line(px-5, py, px-35, py-3);
                fill("PeachPuff");
                arc(px, py, 40, 40, PI, 0);
                fill("AliceBlue");
                arc(px, py, 40, 30, PI, 0);
                arc(px, py, 40, 20, 0, PI);
                fill("Sienna");
                ellipse(px, py-3, 17, 17)
                fill("DarkSlateGray");
                ellipse(px, py-3, 7, 7);

                //some fun text! 
                textSize(7);
                strokeWeight(1);
                text("z z . . ", px+12, py-27);

            }
            var py = yo + y * ys; //position y is y offset plus y multplied by spacing
            var px = xo + x * xs; //position x is x offset plus x multplied by spacing
            

        }

    }
    noLoop(); //so that it is static
}

 

This project was really fun to do, probably because it’s exciting to see what a design looks like when the visual elements repeatedly interact with themselves across a page. I was inspired by wallpapers that were loud and intrusive, since I felt like the broke the classic look of something appealing and ornamental, and would be something I would be more likely to put in my own home. I found an image online from an artist who creates odd, curious designs.

Inked eyeball wallpaper design

I wanted to see if I could create something on the same subject matter, but with a different, more computed aesthetic. I played a lot with stoke weights and colors to achieve the final look that I wanted, and got to experiment using text as an ornamental feature. I had to be careful with the text and make sure it didn’t say anything that would be irritating if repeated often. I used what I learned Assignment 05-B about offsetting grids in order to alternate the spacing between rows, which I think makes the wallpaper flow better when looking at it from far away.  Here are some of my initial sketches for decided what type of eyes to include.

My crude sketches

Jaclyn Saik Project 04: String Art

sketch

/* Jaclyn Saik 
Section E
jsaik@andrew.cmu.edu
Project-04
*/
var x1; //global values for all points that create curves
var y1;
var x2;
var y2;
var increment;
var rectW;
var rectH;

function setup() {
    createCanvas(400, 300);
    background("RosyBrown");
    strokeWeight(2);
    increment = 15;
    increment = random(5, 9); //resets spacing everytime you refresh the page


}

function draw() {
    stroke("Pink");

//top right swoop
    for(var i = 0; i < width; i+= increment) { //increment variable set so I can randomize it
        x1 = width; //starting points incrementing along right edge
        y1 = i; //increments
        x2 = i; //paired with fized width to create curves
        y2 = 0; //i is paired with zero to create curves
        line(x1, y1, x2, y2);
    }
//bottom left swoop
    for(var i = 0; i < height; i+= increment) {
        x1 = i; //values flipped in order to create different curve location
        y1 = height;
        x2 = 0;
        y2 = i;
        line(x1, y1, x2, y2);
    }
//purple rectangle
    noFill(); //created a rectangle in front of the background pink curves
    stroke("DarkMagenta");
    rectW = 280;
    rectH = 220;
    rect(60, 40, rectW, rectH);

    //rectangle swoop bottom right
    push();
    translate(60, 40); //new axis for creatign curves
    for(var i = 0; i <= rectH; i+= increment) {
        x1 = i;
        y1 = rectH;
        x2 = rectW;
        y2 = rectH-i; //new curve position, so increments work opposite based on starting height 
        //another option would have been to rotate the origin 
        line(x1, y1, x2, y2);
    }
    pop(); //push pop used because I translated the origin 
   
    //rectangle swoop upper left
    push();
    translate(60, 40);
    for(var i = 0; i <= rectH; i+= increment) {
        x1 = rectW-i;
        y1 = 0;
        x2 = 0;
        y2 = i;
        line(x1, y1, x2, y2);
    }
    pop();

    
    //blue rectangle 

    noFill();
    stroke("DarkTurquoise");
    rectW = rectW-40
    rectH = rectH-40
    rect(60, 40, rectW, rectH);

    //rectangle swoop bottom right
    push();
    translate(60, 40);
    for(var i = 0; i <= rectH; i+= increment) {
        x1 = i;
        y1 = rectH;
        x2 = rectW;
        y2 = rectH-i;
        line(x1, y1, x2, y2);
    }
    pop();
   
    //rectangle swoop upper left
    push();
    translate(60, 40);
    for(var i = 0; i <= rectH; i+= increment) {
        x1 = rectW-i;
        y1 = 0;
        x2 = 0;
        y2 = i;
        line(x1, y1, x2, y2);
    }
    pop();

    //design lines
    stroke("AliceBlue");
    line(0,0, width/2, height)
    line(0, 0, width, height/2);
    line(width, height, 0, height/2);
    line(width, height, width/2, 0);

    //gold rectangle 

    noFill();
    stroke("Gold");
    rectW = rectW-40
    rectH = rectH-40
    rect(60, 40, rectW, rectH);

    //rectangle swoop bottom right
    push();
    translate(60, 40);
    for(var i = 0; i <= rectH; i+= increment) {
        x1 = i;
        y1 = rectH;
        x2 = rectW;
        y2 = rectH-i;
        line(x1, y1, x2, y2);
    }
    pop();
   
    //rectangle swoop upper left
    push();
    translate(60, 40);
    for(var i = 0; i <= rectH; i+= increment) {
        x1 = rectW-i;
        y1 = 0;
        x2 = 0;
        y2 = i;
        line(x1, y1, x2, y2);
    }
    pop();


}

Creating string art was a challenging process, especially after translating the origin of my piece around a couple times to experiment. This was definitely an exercise in understanding the coordinate system enough to assign opposing values to the ends of points. I liked playing with the foreground and background of my curves, and I thought it was definitely one the prettiest projects we have made so far.

Looking Outwards -04 Jaclyn Saik

For this assignment, I shopped around a lot and looked at a variety of sound and new media artists to see what caught my eye. There was some really astounding work in a wide range of forms, such as computing sound into visual representation, or using computer programming to form sounds out of things that don’t generally create it. It reminded me of a podcast I listened to awhile ago that talked about being able to identify noises that were playing in the background of silent videos simply because of the way the objects appear. Computers were used to detect tiny movements and vibrations in the frames, and used it to bring out people’s voices. I thought that was not only crazy interesting, but also a possible window into making artwork that reflects on the past.

And speaking of reflecting on the past, the artist that really caught my eye, Robert Henke, combined engineering and sound to document a past tragedy in a beautiful way. In his audiovisual laser installation, “Fall” (2016), he was inspired by the village in southern Bavaria of the same name that disappeared underwater in the 1950’s after a reservoir was built. Henke, a German-based artist who creates mainly installation combinations of contemporary electronic music and laser work,  was inspired when the ruins of this village resurfaced in 2015, and created a hanging sound installation that completely engrossed me as soon as I watched the video (above).

The installation is made of hanging fabric structures, which are distributed by an algorithm Henke created. This is one thing that I think really defines this artist as a new media computer artist: he generates algorithms for almost every installation and sound he creates, and in this way his work is very technical but very individual. Lasers are used to illuminate the translucent and pieced-together build of the fabric construction, and an entire show plays through in about 10 minutes, varying in color and texture to create a water-like effect on the ceiling.

An still from the 2016 installation “Fall” by Robert Henke. Even without the movement or sound, the visuals are captivating.

The sound that plays is particularly interesting. Henke generated his own track of music that is of course algorithm based, and it sounds kind of like a jungle mixed with clinking glass layered on top of static or big noises or something– I can’t describe it, but it’s somehow very electronic and very organized all at the same time, and very interesting ot listen to. The lasers are also punctuated by some larger noises, and every movement is matched with sounds or electronic percussion somehow.

I have no idea how he generated algorithms as complex as those he used to make these noises. I know that there is defiantly code that relates the movements of the lasers to the beat of the track he created, and since the tempo seems to be constantly changing as the pace ebbs and flows (like water). I especially wonder how he can achieve sounds that feel so organic and natural with technical algorithms.

Jaclyn Saik Looking Outwards 3

Computational digital fabrication is a really practical application of code. Having a little bit of experience with laser cutting and 3d printing and talking to a lot of passionate people about CNC mills, I see how many technical applications there are for physical objects generated out of code. In Professor Levin’s article about Parametric 3D form, I was especially interested in the design system for the parametric human body. It reminded me a lot of a video game I used to play when I was younger, Sims 3, where you could go in and highly customize a character’s physical appearance, but a lot of the traits would be related and relative to each other. I also found his article neat because it used phrases like “artist-researchers”: Aa a designer interested in STEM applications, it’s cool to see a word that synthesizes these things.

I was drawn to Oxman’s Mediated Matter group at the MIT Media Lab because they talked a lot about using computation to mimic or explore nature-driven designs, which is something I discovered while researching for last week’s Looking Outwards and something I think is a fascinating way to pull computer science full circle into the natural world. One project that this group made is called “Rottlace” (September 2016), where they designed a mask system for the popular Icelandic singer Björk. This mask is designed to look like “a face without skin”, and I think they achieved their goal, as you can see in the image.

Björk’s “Face without Skin”. This is the singer first trying on the mask, after going through weeks of measuring and testing in order to generate code to create it.

I really admire this work because it is so technical in creation, but so natural in final form. It takes a great deal of artistic decision-making to make sure it is accurate, but not gory. The reason this example of computational digital fabrication is so interesting is because this team is tasked with generating very organic objects, like muscles and ligaments in the face, from code. They account for what they call “property transitions”, which means when there is harder bone versus cartilage versus soft tissue versus muscle, by changing the way their algorithms are set up. Bones are more geometric-based, while ligaments are obtained as “cloud point data” based on plotted points from the shape of Björk’s face. All in all, this sounds like a beautiful and complicated project. Like IDeAte on steroids!

Project 03 Dynamic Drawing

sketch

/* Jaclyn Saik 
Section E
jsaik@andrew.cmu.edu
Assignment-00-A
*/

//general set up 

var circleX = 50  //x position of circles
var circleY = 50 //y positions of circles
var circleOFFSET = 3
var circleSIZE = 50 //diameter of circle, set so later can be manipulated by mouse
var conOFFSET = 100 //offset value used to space out the triangles
var angle = 0
var angle2 = 0
var angleCHANGE = 6


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

function draw() {
    background(25, mouseX/5, 25, mouseY/3); 
    //modifies alpha value so it's relative to y value, determines shape trail
    //X value of mouse controls background color 

    circleSIZE = constrain(mouseX/5, 20, 300); //circle size controlled by mouse X position, but constrained within 2 and 300
    circleSIZE = circleSIZE/2 //reduced size again in half so managebale within canvas


    //changing texts set up

    fill(255);
    if (mouseX > width/2) {
        text('NICE!!!!!!!!!', 100, 300); //all text switches when the mouse's 
        //X position is in second half of canvas
    }  else { text('wow', 100, 310)
    }

    fill(255);
    if (mouseX > width/2) {
        text('cool', 150, 350);
    }  else { text('YIKES!', 150, 340)
    }

    fill(255);
    if (mouseX > width/2) {
        text('rock on!', 500, 50);
    }  else { text('super!!!', 500, 60)
    }

    fill(255);
    if (mouseX > width/2) {
        text('that is crazy dude!', 450, 200);
    }  else { text('NUTS!', 440, 190)
    }
    

    //stroke set up

    if (mouseY < height/2) {
        stroke(237, 107, 170);
        strokeWeight(mouseX/20) //stroke weight is determines by mouse's X position
    } else { noStroke(); //stroke is determined by mouse's Y position 
    }


    //Circle position and rotation set up

    //line 1

    //line 1, circle 3
    push();
    translate(width/2, height/2); //moves origin to the center of canvas
    rotate(radians(angle)); 
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE); //white circle in front 
    angle = (angle + angleCHANGE); //determines angle of rotation 
    pop();


    //line 1, circle 4
    push();
    translate(width/2+conOFFSET, height/2+conOFFSET); //moves new origin, using offset to keep it regular 
    //I use translate throughout to change the rotation center for each ellipse
    rotate(radians(angle));
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE);
    pop();
    
    //line 1, circle 2
    push();
    translate(width/2-conOFFSET, height/2-conOFFSET);
    rotate(radians(angle));
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE);
    pop();
    
    //line 1, circle 5
    push();
    translate(width/2+conOFFSET*2, height/2+conOFFSET*2);
    rotate(radians(angle));
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE);
    pop();

    // line 1, circle 1
    push();
    translate(width/2-conOFFSET*2, height/2-conOFFSET*2);
    rotate(radians(angle));
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE);
    pop();


    //line 2

    //line 2, circle 3
    push();
    translate(width/2, height/2);
    rotate(radians(angle2));
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE); //white circle in front 
    angle2 = (angle2 - angleCHANGE);
    pop();


    //line 2, circle 4
    push();
    translate(width/2+conOFFSET, height/2+conOFFSET);
    rotate(radians(angle2));
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE);
    pop();
    
    //line 2, circle 2
    push();
    translate(width/2-conOFFSET, height/2-conOFFSET);
    rotate(radians(angle2));
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE);
    pop();
    
    //line 2, circle 5
    push();
    translate(width/2+conOFFSET*2, height/2+conOFFSET*2);
    rotate(radians(angle2));
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE);
    pop();

    // line 2, circle 1
    push();
    translate(width/2-conOFFSET*2, height/2-conOFFSET*2);
    rotate(radians(angle2));
    fill(44, 131, 204);
    ellipse(circleX+circleOFFSET, circleY+circleOFFSET, circleSIZE, circleSIZE); //blue circle
    fill(232, 86, 71);
    ellipse(circleX-circleOFFSET, circleY-circleOFFSET, circleSIZE, circleSIZE); //red circle
    fill(255);
    ellipse(circleX, circleY, circleSIZE, circleSIZE);
    pop();
   

}

 

Jaclyn Saik Project 03

This project was definitely the most challenging because it was so open ended. I was originally inspired by another geometric animation I saw on Colossal, where there were a bunch of very small white dots that had slight colored shadows, which made them look extremely mesmerizing and gave them an appearance of movement even in the moments they were static. With my sketch, I wanted to play with the idea of rotating and spinning elements that are changes by the mouse.  While making the circles rotate around an origin, I played with making them all revolve around the mouse, but I ended up making something that was a steadier in composition so that you could more easily interact with it with your mouse. I had the mouse position change the little text that cheers you on, as well as the stroke and color changes. I had a lot of fun making the objects create a trailed background, and I think it made the project look even crazier, which is what I was going for.

Jaclyn Saik Looking Outwards 02

After exploring a bunch of generative artist’s portfolios and the websites of a lot of different design and art firms, I found a generative art project that really grabbed my attention. The design studio “Nervous System” created and exhibited a project called “Growing Objects” which, simply put, explored patterns that occur in nature and then simulated them. This caught my eye particularly because the project was hosted by the Simons Center for Geometry and Physics, but the images of the objects and visuals they created were beautifully delicate and artistic.   The above picture is just one of the many digitally fabricated sculptures in the series, called “Laplacian Cave.” Laplacian growth is one of the four computational systems that the studio featured and explored: this one particularly “involves a structure which expands at a rate proportional to the gradient of a laplacian field.” This type of growing and the resulting pattern can be found in nature in crystallization effects and with different types of fungi and algae.

The studio produced a variety of both 2D and 3D models that used a similar algorithm. They made sure to specify why they were not trying to recreate exactly something that is found in nature, but rather explore how synthetically building objects using these algorithms brings up similarities in the natural world.

I think this project is a really interesting combination of math and art, and I think it is fitting and very “full-circle” that the mimicking of nature and living organisms brings about such an elegant synthesis.