Srishty’s Project 11

The Sushi Bar Train

For my project I decided to create a restaurant on a train that serves japanese food via a conveyer belt. The dishes include: sashimi, tuna sushi, matcha, miso soup, ramen, and salmon. In the window of the train booth, you can watch as you travel through a bright city at night.

Sushi Bar TrainDownload

// SRISHTY BHAVSAR 
// 15104 SECTION C
//PROJECT 11

var buildings = [];

var fd = [] // 

// food items
var ramen; // https://imgur.com/H2R30Wg
var miso; // https://imgur.com/J5EhmuM
var salmon; // https://imgur.com/p6YrdLv
var sashimi;  // https://imgur.com/mJjnmVD
var matcha; // https://imgur.com/SErtIMf
var tunasushi; // https://imgur.com/HCUsYNh
var maki; // https://imgur.com/UI5eghR

var food = 
["https://i.imgur.com/H2R30Wg.png", "https://i.imgur.com/J5EhmuM.png", 
 "https://i.imgur.com/p6YrdLv.png", "https://i.imgur.com/mJjnmVD.png", 
 "https://i.imgur.com/SErtIMf.png" , "https://i.imgur.com/HCUsYNh.png", 
 "https://i.imgur.com/UI5eghR.png"]; // food contains the images of ramen,miso,salmon,etc.


function preload() {

    seats = loadImage("https://i.imgur.com/UEAssld.png");


    ramen = loadImage(food[0]); //ramen
    miso = loadImage(food[1]); //miso
    salmon = loadImage(food[2]); // salmon
    sashimi = loadImage(food[3]); //sashimi
    matcha = loadImage(food[4]); //matcha
    tunasushi = loadImage(food[5]); //tunasushi
    maki = loadImage(food[6]); //maki



    bg = loadImage("https://i.imgur.com/2zjN6qS.png");

}

function setup() {
    createCanvas(480, 480);
    background(220);
    imageMode(CENTER);
    frameRate(17);

    // create an initial collection of buildings
    for (var i = 0; i < 20; i++) {
        var rx = random(width);
        buildings[i] = makeBuilding(rx);
        
    }


    // collection of dishes
    var dist = 0;
    for (var i = 0; i <500; i++) {
        fd[i] = makeFood(dist);
        dist += 150; //distance between dishes
    }
    print(fd);

}

function draw() {
    createCanvas(480, 480);
    background(25,25,112);


    //buildings
    push();
    translate(0,-120);
    updateAndDisplayBuildings();
    removeBuildingsThatHaveSlippedOutOfView();
    addNewBuildingsWithSomeRandomProbability(); 
    pop();

    //bg
    image(bg, 266.4269, 240, 532.8539, 480);

    showFood();

    //seats
    image(seats,240,408.3845,480,143.231);




}


function makeFood(xloc){
    var fd = { x: xloc,
                speedx: 1.5,
                move: foodMove, 
                food : random([ramen, miso, salmon, sashimi, matcha, tunasushi, maki]),
                display: foodDisplay,
                }
    return fd;
}


function foodDisplay(){

    /*the width heights and y location are respective to the 
    ones mapped out on adobe illustrator. thats why they are typed manually */
    //xloc is the speed times 500 and the dist
    if (this.food == ramen){
        image(ramen,this.x -750*20, 310, 148, 108 );  // ramen
    }
    if (this.food == miso){
        image(miso,this.x  -750*20, 310, 119, 115 ); // miso
    }
    if (this.food == salmon){
        image(salmon,this.x -750*20, 318, 174, 126 ); // salmon
    }
    if (this.food == sashimi){
        image(sashimi,this.x -750*20, 309, 203, 147 ); //sashimi
    }
    if (this.food == matcha){
        image(matcha,this.x - 750*20, 324, 119, 86 ); // matcha
    }
    if (this.food == tunasushi){
        image(tunasushi,this.x  -750*20, 318, 164, 119); //tuna
    }
    if (this.food == maki){
        image(maki,this.x  -750*20, 294, 247, 179 ); //maki
    }
}

//speed of moving food
function foodMove() {
    this.x += this.speedx;  
}

//calling show and move function of dishes
function showFood(){
    for( var i = 0; i < fd.length; i++ ) {
        fd[i].display();
        fd[i].move();
        if ( i == fd.length){
            textSize(15);
            text('Sushi Bar closed. No more food for today!', 100, 200);
        }
    }

}



function makeBuilding(birthLocationX) {
    var bldg = {x: birthLocationX,
                breadth: 30,
                speed: -1.0,
                nFloors: round(random(2,8)),
                move: buildingMove,
                color: color(random(255),random(255), random(255), 80), // random color buildings with low opacity to look distant
                display: buildingDisplay
            } 
    return bldg;
}


function updateAndDisplayBuildings(){
    // Update the building's positions, and display them.
    for (var i = 0; i < buildings.length; i++){
        buildings[i].move();
        buildings[i].display();
    }
}


function removeBuildingsThatHaveSlippedOutOfView(){

    var buildingsToKeep = [];
    for (var i = 0; i < buildings.length; i++){
        if (buildings[i].x + buildings[i].breadth > 0) {
            buildingsToKeep.push(buildings[i]);
        }
    }
    buildings = buildingsToKeep; // remember the surviving buildings
}


function addNewBuildingsWithSomeRandomProbability() {
    // With a very tiny probability, add a new building to the end.
    var newBuildingLikelihood = 0.007; 
    if (random(0,1) < newBuildingLikelihood) {
        buildings.push(makeBuilding(width));
    }
}


// method to update position of building every frame
function buildingMove() {
    this.x += this.speed;
}
    

// draw the building and some windows
function buildingDisplay() {
    var floorHeight = 20;
    var bHeight = this.nFloors * floorHeight; 
    fill(this.color); 
    push();
    translate(this.x, height - 40);
    strokeWeight(0);
    rect(0, -bHeight, this.breadth, bHeight);
    for (var i = 0; i < this.nFloors; i++) {
        rect(5, -15 - (i * floorHeight), this.breadth - 10, 10);
    }
    pop();
}



Looking Outwards – 11

Impressions from women in media art

In Anna Gruaber’s “Women in Media Arts: Does AI think like a (white) man?” Gruaber features different artist/activists and their projects related to AI and feminism. Artificial intelligence is becoming a very important topic in regards to diversity and ethics. Activists have started pointing out problematic prejudices and distortions of supposedly objective algorithms. While there is a low proportion of women in IT professions, the real problem are the biased data sets used in AI and Machine learning.

Joy Buolamwini and Timnit Gebru are activists who investigate the prejudice of AI recognition systems. In this project, “Gender Shades,” the error rate is significantly higher among women; especially those with darker skin. Information about skin color is extremely important in the context of medical applications. 

Mary Flanagan’s project “help me know the truth,” shows that a discriminating algorithm does not come from the sexist or racist nature of the machine, but from the systemically racist structure of our society. “Help me know the truth” creates a perfect stereotype from a digital self portrait based on findings of cognitive neuroscience. 

Caroline Sinders wants to counterset bias. Her project, “Feminist Data Set,” is a multi-year art project that combines lectures and workshops to create interventions in the field of machine learning. Sinders wants to collect feminist data through them. The feminist data inclides artworks, essays, interviews, and books on feminism. The data attempts to introduce data collection as a feminist practice.

https://ars.electronica.art/aeblog/en/2020/04/10/women-in-media-arts-ai/

Srishty’s Project 10

I made a simple story about a girl (me) who goes on a walk to the park. During her time there as she walks by, she sees tom and jerry start chasing each other all over the park and she starts laughing. The background d elements and all elements other than tom and jerry were done on illustrator and imported to imgur. My 4 characters are the cloud making the wind sound, the tom making the meow sound, the girl laughing, and the bird chirping.

sketch

// SRISHTY BHAVSAR
//SECTION C
//PROJECT 10
/*
I made a simple story about a girl (me) who goes on a walk to the park. During her time there as she walks by, 
she sees tom and jerry start chasing each other all over the park and
she starts laughing. The background d elements and all elements other than tom and jerry were done on illustrator
and imported to imgur. My 4 characters are the cloud making the wind sound, the tom making the meow sound, the girl 
laughing, and the bird chirping.
*/



// call global variables

//background image
var bgPhoto

//CHARACTERS
// cloud
    var cloudX = 0;

    // bird
    var birdImage = [];
    var birdX = 500;
    var birditem = 0;
    var birdwidth = 80

    // srishty (me)
    var srishtyImage;
    var srishtyx =500;

    // cloud
    var cloudImage;
    var cloudx = 300

    // tom and jerry
    var tomandjerry = [];
    var tomandjerryx = 70;
    var tomandjerryitem = 0;
    var tjdy = 1
    var tjdx = 1

// frame counter initializer
var count = 0; 




//load images to imgur
function preload() {
    bgPhoto = loadImage("https://i.imgur.com/75aDbMe.png");
    // images
    birdImage[0] = loadImage("https://i.imgur.com/o1P0pBO.png"); // first image in the bird list
    birdImage[1] = loadImage("https://i.imgur.com/48woLcm.png"); // first image in the bird list
    srishtyImage = loadImage("https://i.imgur.com/b5N2LzO.png"); // srishty image
    cloudImage = loadImage("https://i.imgur.com/xG8RjYF.png"); // cloud image
    tomandjerry[0] =loadImage("https://i.imgur.com/8nNCYkE.png");
    tomandjerry[1] =loadImage("https://i.imgur.com/cDSNU65.png");
    tomandjerry[2] =loadImage("https://i.imgur.com/LcYpbag.png");
    tomandjerry[3] =loadImage("https://i.imgur.com/wYhvMJo.png"); 

    //sounds
    wind = loadSound("https://courses.ideate.cmu.edu/15-104/f2022/wp-content/uploads/2022/11/wind.wav");
    meow = loadSound("https://courses.ideate.cmu.edu/15-104/f2022/wp-content/uploads/2022/11/meow.wav");
    laugh = loadSound("https://courses.ideate.cmu.edu/15-104/f2022/wp-content/uploads/2022/11/laugh.wav");    
    chirp = loadSound("https://courses.ideate.cmu.edu/15-104/f2022/wp-content/uploads/2022/11/chirp.wav");  
}


function soundSetup(){
    wind.setVolume(.1);
    meow.setVolume(2);
    chirp.setVolume(.1);
    laugh.setVolume(2);
}

function setup() {
    createCanvas(400, 400);
    //frameRate(5);
    imageMode(CENTER);
    useSound();

}

function draw() {
    count++; // add one frame to draw function
    //background image
    image(bgPhoto, width/2, height/2, width, height);



    wind.play();
    chirp.play();



    //call characters
    drawCloud();
    drawbird();
    drawTandJ()
    drawSrishty();
  
    if (count == 450 || count == 750) {
        meow.play();
    }
    if (count == 500 || count ==800) {
        laugh.play();
    }
}

// function for bird flapping

function drawbird() {

    image(birdImage[birditem], birdX, 104, birdwidth,30); 
    // if the frame counter is odd have the bird's item be the first one, if even have it be the second one 
    //fkapping affect 
    if (count % 2 === 0 ) { // bird frame 1
        birditem = 1;
        birdwidth = 100
        birdX -= .5; // bird flies to left
    }
    if (count % 2 === 1 ) {    // bird frame 0
        birditem = 0;
        birdwidth = 80;
        birdX -= .5; // bird flies to left
    }

}

function drawSrishty() {
    var heightcount = .5
    if (count >= 30) { // srishty walks in 30 frames after bird

        // staggering heights so it looks like walking rather than glide
        if (count % 2 === 0 ) { //odd
            image(srishtyImage, srishtyx - heightcount, 325, 66.2218, 205.4745); 
            srishtyx -= .3; // srishty walks to left

        }
        if (count % 2 === 1 ) { //even
            image(srishtyImage, srishtyx, 325 + heightcount, 66.2218, 205.4745); 
            srishtyx -= .3; // srishty walks to left

        }
    }

}

function drawCloud() { // draw cloud
    image(cloudImage, cloudx, 69, 130.2123 , 46.6313 );
    cloudx -= 0.09; //cloud moves very slowly
}

function drawTandJ() { // tom and jerry frames chasing eachother

        if (count >= 0 & count <= 400 ) { 
            image(tomandjerry[tomandjerryitem], tomandjerryx, 300, 216.9349, 162.7012);
            tomandjerryitem = 0
        }

        if (count >= 400 & count <= 500) { 
            image(tomandjerry[tomandjerryitem], (tomandjerryx + 100) + tjdx, 300, 216.9349, 162.7012);
            tomandjerryitem = 1
            tjdx += .5
        }

        if (count >= 500 & count <= 750) {
            image(tomandjerry[tomandjerryitem], (tomandjerryx + 300) -tjdx, 400 - tjdy, 220, 120.7012);
            tomandjerryitem = 2
            tjdy += .5;
            tjdx += .5
        }
        if (count >= 750 & count <= 2000 ) { 
            image(tomandjerry[tomandjerryitem], (tomandjerryx + 200)-tjdx, 400 - tjdy, 216.9349/2, 162.7012/2); 
            tomandjerryitem = 3
            tjdy += .5;
            tjdx += 2;

        }

}
 


Looking Outwards 09

Caroline is a UI/UX designer, machine learning design researcher and artist concerned about consent in technology. She is the founder of convocation design and research agency which focuses on machine learning and ux design that is for public good. As a ux designer and ux researcher she worked with Intel, IBM Watson, Wikimedia Foundation, Amnesty Foundation, and more. She additionally has partnered with Harvard Kennedy School and the Mozilla Foundation.

What I admire about Caroline is that she is a UX/UI designer which is the job I aspire to have. Her work focusing on public good also inspires me to learn more about social issues related to technology rather than just aesthetics. In her project, “How to Explain a Hurricane to an Algorithm,” Caroline explains that when her grandmother’s home was destroyed in Hurricane Katrina, she found a bunch of personal and private objects that belong to the family. She spent her last 12 years photographing and looking at archives. Using an algorithm Caroline was able to represent a documentation of loss, anxiety, grief, and post trauma culture at home.

Website: https://carolinesinders.com/how-to-explain-a-hurricane-to-an-algorithm/

Archives and images of destructed items Hurricane Katrina

Srishty’s Project 9 Portrait

For my portrait, I decided to do something similar to pointillism but instead of dots, I used words. I made a list of words that are about my passions/ideal career choices and then loaded a word randomly from the list to take place of each pixel in my image. Each word matches the color of the pixel in its respective x and y location. The words are all a pretty small font so they can pick up the details of the pixels well.

sketch

Screenshot of image 10 minutes in
Image 5 minutes in
Image about 30 seconds in
// SRISHTY BHAVSAR
// PROJECT 9
// SECTION C 15-104
/*
let img;
let smallPoint, largePoint;

function preload() {
  img = loadImage('nameofimage');
}

*/


var srishty;
var passions;

function preload() {
    srishty = loadImage("https://i.imgur.com/kczcnA1.jpg"); // image of me, srishty
    passions = ["designer", "artist", "UI","UX", "researcher", "HCI", "architecture", 
    "color", "painting", 'music', "running", "singing"]; // list of my passions and career interests
    print(passions);

}

function setup() {
    createCanvas(480,480);
    srishty.resize(480,480); // resizes the ima2ge upload to imgur to be 480 by 480
    background('white');
    imageMode(CENTER); // centers image
    srishty.loadPixels();
    //noLoop();

}


function draw() {
    var x = floor(random(srishty.width));
    var y = floor(random(srishty.height));
    var c = srishty.get(x,y); // identifies the color of each pixels
    fill(c,255);
    textSize(8);
    textFont('Helvetica')
    text(passions[Math.floor((Math.random() * passions.length))] , x, y); // takes a random word from the list of passions and places it to be in the position of the image pixel
}

Looking Outwards – 08

Jennifer Daniel is a designer and is pursuing a career in illustration. Originally from Kansas, she moved to New York. Since then, her work has been published in a variety of publications. Jennifer has taught visual narratives for SVA’s masters program and recently moved to San Francisco. She was a professional communicator before working at an engineering company and now makes visual art.

In the eyeo festival Jennifer Daniel talks about an app she helped develop called allo. In the app you take a selfie and it makes automated emojis cartoons of your face. Traditional computers utilize mapping on the art to analyze pixels of an image. Algorithmically it examines attribute values to look for shape and colors. A well known problem is the uncanny valley of images. Emojis that look too close to the picture look scary. Machine learning can access and confront people about what they look like. Instead alo produces low resolution emojis which create a less realistic emoji. There is a customization feature of emojis. She talks about how she can as an art director design something for everyone when machine learning can reduce data about unique stories. She is aware of  bias in computer algorithms and how it can promote racism and sexism. Art directors who work on these projects can work with artists with many perspectives to articulate their world. Not enough to make an avatar that is a literal representation of you when there are many versions of you.

What I really like about Jennifer Daniel’s app and project is that she takes an approach to illustrating similar to a UI UX designer, which is my dream career. She explains that visual vocabulary online is very vast. There are text, emoticons, emoji, and tiny illustrations. Emojis, gifs, stickers all make up an emergent complexity. Texting is closer to speaking than writing. People spoke first to communicate. Writing only came later. Writing is very different from talking. Writing is a conscious process while Speech is looser, text is like that. No one thinks about capitalization, we text the way we speak. Emoji is a Japanese word which is a combination of emoji and character and a very important form of digital communication in japan. Easy way to apologize or show nuanced communications. Emojis have a problem when trying to communicate something detailed. Automatic emojis can change meanings of texts. I’ve seen this with slack and face messenger. Emojis are not perfectly transferable across mediums. Ios emojis sent to an android emoji may look much different. Important emojis look similar across platforms and are cohesive but she wishes emojis used unicode like type fonts. More styles there are, the more variations can exist. Emojis have broadened the world of communication and it will be interesting to see how it shifts our language in the future.

https://vimeo.com/channels/eyeo2017

Project 7 Curves – Flower Blossom

sketch
//SRISHTY BHAVSAR
//15-104 SECTION C
//PROJECT 7

var nPoints = 500;

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

}


function draw() {
    createCanvas(480, 480);
    background(0);
    // draw the curve

    fill(154,205,40,70); // yellow green color
    ranunculoid(10,20);
    hypotro();
    noFill();
    ranunculoid(30,50);
    ranunculoid(40,60);


}

//--------------------------------------------------
function hypotro() {
    // Hypotrochoid
    // https://mathworld.wolfram.com/Hypotrochoid.html
    
    push();
    noFill();
    stroke('magenta');
    strokeWeight(1);
    translate(width/2 , height/2);
    var x = constrain(mouseX, 0, width);
    var y = constrain(mouseY, 0, height);
    var a = map(x, 0, width, 60, 160); //radius of still circle
    var b = map(y, 0, height, 1, 8); // radius b of rolling circle inside still circle
    var h = constrain(a/2, 100, 100); //
    beginShape();
    for (var i = 0; i < nPoints; i++) {
        var t = map( i, 0, nPoints, 0, TWO_PI); // tangent?
        //PARAMETRIC EQUATIONS
        x = (a - b) * cos(t) + (h * cos(((a-b)/b)*t)); 
        y = (a - b) * sin(t) - (h * sin(((a-b)/b)*t));
        vertex(x,y); // connected to center vertex

    }
    endShape();
    pop();
}

//--------------------------------------------------

function ranunculoid(xsize,ysize) {
    // https://mathworld.wolfram.com/Ranunculoid.html
    push();
    stroke('green');
    strokeWeight(1);
    translate(width/2 , height/2);  
    var x = constrain(mouseX, 0, width);
    var y = constrain(mouseY, 0, height);
    var a = map(mouseX, 0, width, xsize, ysize); 
    beginShape();
    for (var i = 0; i < nPoints/10; i++) {
        var t = map(i, 0, nPoints/10, 0, TWO_PI);

        x = a * (( 6 * cos(t)) - cos(6*t))
        y = a * (( 6 * sin(t)) - sin(6*t))
        vertex(x, y);
    }
    endShape();
    pop();
}

equations

Looking Outwards 7: Information Visualization – Stefanie Posavec

Writing Without Words

Drawing The Dictionary

Stefanie Posavec is an artist and designer experimenting and researching ways to visualize and communicate computational data to all ages and audiences. What I like and find most special about Stefanie’s work is that it is very colorful, fun, and visually appealing. Usually when I think of computational data, I don’t necessarily imagine something animated, cartoon-like, or age friendly. Stefanie’s visualizations deliver themselves like artwork in a children’s book.
In her work, “Drawing the Dictionary,” Stefanie responds to a theme of collections including parts of speech, syllables, first letter of the words, and alphabet. The words in the collection are specifically the 1000 most frequently used words. And used 1000 different colored index cards for each word. The words paper colors were organized by part of speech, background shape by syllables, placement by how frequently they are used, pattern by part of speech, and the pen color by first letter in word.
In her work, “Writing without words,” Stefanie visually showcased text in order to highlight the similarities and differences in writing styles when comparing different authors. She wanted to create a data visualization that was straight forward and one with a subject that was emotionally connecting to humans. To create this, she focused on a book called “On the Road,” by Jack Kerouac and its themes. She did not want to use expressive typography or imagery but rather a subjective representation of information. She wanted the graphics to be quantifiable. She gathered data related to the english language structure.She wanted to visualize the novel as a living element full of energy and thus the novel is split into chapters, paragraphs, sentences, and words like a plant structure. Shorter sentences mean a choppy text and stiff writing style while longer sentences mean they are more free and leisurely. She gathered all data by hand and used math and a calculator to find final sums. Finally she used a computer graphics program instead of a data information one to watch the data generate bit by bit.

Sources:

http://www.stefanieposavec.com/work

Project 6 – Abstract Clock

I created an ice cream clock. The scoops run on standard time rather than military time so for every hour, a scoop is added. At 12 pm there is no scoop and it resets. For every second, a new sprinkle falls to the bottom and the chocolate ice cream slowly changes to a raspberry color. With every minute, the ice cream puddle at the bottom of the canvas gets larger ( as if its rising).

sketch
// SRISHT BHAVSAR
// SECTION C 15-104
// PROJECT 6

var diam = 30; // scoop diam
var h; //hours 
var m; //min
var s; //second

var c = [];

function setup() {
    createCanvas(200, 20);
    background(220);
    text("p5.js vers 0.9.0 test.", 10, 15);
    for (var i=0; i < 60; i++)  {
        c[i] = color(random(255), random(255), random(255));
    } 
}

function draw() {
    createCanvas(480, 480);
    background('lightblue'); // light blue

    let h = hour();
    let m = minute();
    let s = second();


    //minutes equals height of puddle
    translate(0,0)
    stroke(210, 180, 140);
    fill('beige');
    rect(0,480,480,-(m));


    push()
    noStroke();
    translate(500,510);
    rotate(radians(180));
    for (var i = 0; i < diam ; i+= diam) {
        for (var j = 0; j < (h-12) * diam ; j+= diam) { // instead of military time, it is 12 hr time
            
            if ( j % 4 == 0) {
                fill(98 + s,52,18+s); // chocolate// changes color by second
            }

            if ( j % 4 == 1) {
                fill('beige'); // vanilla

            }

            if ( j % 4 == 2) {
                fill('lightpink'); // strawberry
            }


            circle(250,j+150,diam); // scoop

        }
    }
    pop();


// ice cream cone w month and date
    push();
    fill(210, 180, 140);
    strokeWeight(5);
    stroke('beige');
    translate(150,320);
    scale(.5);
    triangle(155,100,203,300,245,100); 
    pop();



// ice cream sprinkles are seconds
    push();
    fill(c[i])
    scale(0.8);

    for(var i =0; i < 4; i+= 4){
        for(var j = 0; j < (s*10); j+= 7) {
            ellipse(310, j, 3, 5);
        }
    }
    pop();
    frameRate(1);

} 



Looking Outwards-06 Randomness in Art

Untitled (Collage with Squares Arranged according to the Law of Chance)

During World War 1, in Zurich Germany, artist Jean Hans Arp created a collage that uses a principle of randomness to dictate the artwork. The artwork, Untitled (Collage with Squares Arranged according to the Law of Chance) interests me because it is a rare and good example of dadaist art. Dadaist art stems from the dada movement; a movement that promoted randomness, nonsense, and satire. The movement itself had been created in reaction to the horrific trauma of the war. Themes of authorship and control were associated with authoritarian and controlling powers, and thus the random and accidental nature of Dadaist art most likely reflects freedom, liberation, and choice. 

In this artwork, Arp demands for a movement of new art; thinking outside the box without intention. She tore up heavyweight fine art papers with torn fiber edges, held them up in air, and then released them, letting the pieces land on the ground wherever gravity and the surrounding atmosphere took it. Then, she would mark the spot that it landed on and accordingly paste the piece in that exact arrangement. 

The use of randomness in Arp’s artwork is an example of Real randomness. While tasks like flipping a coin may be martingale random, or functions like random(); may be pseudo random, dropping papers and letting them land wherever is real random as there is no provable sequence or range involved. However, a factor of the artwork that may take away from the randomness is that it likely had a canvas which the pieces needed to fall on. Thus, she probably only chose pieces which were within the range and bounds of the canvas.