Project – 11 – Landscape

sketch
//Dreami Chambers; Section C; dreamic@andrew.cmu.edu; Assignment-11-Project

var stars = []
var planets = []
var moon = []
var noiseParam = 0
var noiseStep = 0.1
var sky
var astronaut
var planet
var meteor 
var mx = 300
var my = 0
var mdx
var mdy
var ax = 0
var ay = 100
var ady = 1
var frameCount = 0

function preload() { 
	sky=loadImage("https://i.imgur.com/zfE0rbY.jpg")
	astronaut=loadImage("https://i.imgur.com/0GaKn9k.png")
	planet=loadImage("https://i.imgur.com/UCrpkmB.png")
	meteor=loadImage("https://i.imgur.com/gcfvaqR.png")
} 

function setup() {
    createCanvas(400, 300)
    //meteor velocity
	mdx = random(-10,-15)
	mdy = random(10,15)
    //stars setup
    for (var i = 0; i < 100; i++) {
    	var rx = random(width)
    	var ry = random(height)
    	var rdx = random(4)
        stars[i] = makeStars(rx, ry, 2, rdx)
    }
    //planets setup
    for (var j = 0; j < 2; j++) {
    	var rx = random(width)
    	var ry = random(150)
        planets[j] = makePlanets(rx, ry)
    }
    //moon surface setup
    for (var k = 0; k < width; k++){
		var n = noise(noiseParam)
		var value = map(n, 0, 1, 10, 50)
		moon.push(value)
		noiseParam += noiseStep
	}
    frameRate(10)
}

function draw() {
	image(sky, 0, 0, 400, 400)

	//draws stars
	starUpdate()
	starsRemove()
	starsAdd()

	//draws planets
	planetUpdate()
	planetsRemove()
	planetsAdd()
	
	//draws moving meteor
	drawMeteor(mx, my, mdx, mdy)

	//draws moon surface
	drawMoon()

	//draws astronaut
	drawAstronaut(ax, ay)

	//moves meteors across screen
	mx+=mdx
	my+=mdy

	//moves astronaut up and down
	ay+=ady
	if (ay > 110){
		ady*=-1
	}
	if (ay < 90){
		ady*=-1
	}
	frameCount++
}

function drawAstronaut(x, y){
	image(astronaut, x, y, 55, 60)
}

function drawMoon(){
	stroke(200, 180, 200)
	strokeWeight(200)
	moon.shift()
	var n = noise(noiseParam)
	var value = map(n, 0, 1, 10, 50)
	moon.push(value)
	noiseParam += noiseStep
	for (var i=0; i < width; i++){
		line(i*15, 300+moon[i], (i+1)*15, 300+moon[i+1])
	}
}

function drawMeteor(x, y, dx, dy){
	image(meteor, x, y, 50, 45)
}

//star functions
function starUpdate(){
	for (var i = 0; i < stars.length; i++){
        stars[i].stepFunction()
        stars[i].drawFunction()
	}
}

function starsRemove(){
	starsToKeep = []
	for (var i = 0; i < stars.length; i++){
        if (stars[i].x + stars[i].size > 0){
        	starsToKeep.push(stars[i])
        }
	}
	stars = starsToKeep
}

function starsAdd(){
	var starProb = 0.5
	if (random(1) < starProb){
		stars.push(makeStars(random(width, 410), random(200), 2, random(4)))
	}
}

function starStep() {
    this.x -= this.dx
}

function starDraw() {
	stroke(this.c)
	strokeWeight(this.size)
	point(this.x, this.y)
}

function makeStars(px, py, pdx, ps) {
	var s = {x: px, y: py, dx: pdx, 
		size: ps, c: color(random(150, 230),random(100, 140),random(200, 255)),
		drawFunction: starDraw, stepFunction: starStep
	}
	return s
}

//planet functions
function planetUpdate(){
	for (var i = 0; i < 2; i++){
        planets[i].stepFunction()
        planets[i].drawFunction()
	}
}

function planetsRemove(){
	planetsToKeep = []
	for (var i = 0; i < planets.length; i++){
        if (planets[i].x + planets[i].size > 0){
        	planetsToKeep.push(planets[i])
        }
	}
	planets = planetsToKeep
}

function planetsAdd(){
	var planetsProb = 0.3
	if (random(0, 1) < planetsProb){
		planets.push(makePlanets(random(width, 450), random(150)))
	}
}

function planetStep() {
    this.x -= this.dx
}

function planetDraw() {
	image(planet, this.x, this.y, this.size, this.size)
}

function makePlanets(px, py) {
	var p = {x: px, y: py, dx: 2, 
		size: random(10,60), c: color(random(200,200),random(140,170),random(140,170)),
		drawFunction: planetDraw, stepFunction: planetStep
	}
	return p
}

For this project, I wanted to create a landscape capturing space. I used clip art for a few of the objects here. The meteor moves past the screen at the beginning of the animation. The objects that move with the camera are the stars, the planets, and the moon surface. The stars are created by randomly placing points with different sizes and slightly different colors. The planets have random sizes and locations as well. For the moon surface, I referred to the stock market example that we did in lab previously. I had originally planned to add craters to the moon, but decided not to for the sake of time. Here is my sketch for this project:

11 – Landscape

I was motivated by my experiencing driving. Additionally, a lot of the projects from previous years and such seem to have objects move left or right off the screen, or top to bottom, but I haven’t seen any with “one-point” perspective, so I thought I would give it a try. It was a little challenging and I would’ve like to have made the roadlines move in the mirror as well, but I just couldn’t figure it out.

sketch.sarlDownload
// Sarah Luongo
// Sluongo
// Section A
// Project

// This code aims to articulate the perspective of driving on the road, showing
//different scenery as the car moves forward.

var lines = [];
var cds = [];
var gps;

function preload() {
    gps = loadImage('https://i.imgur.com/tOwIpKP.png');
}

function setup() {
    createCanvas(420, 480);
    background(17, 124, 19);
    gps.resize(100, 100);
    // Creates 6 initial roadline objects
    for (var i = 0; i < 6; i++) {
        lines[i] = makeRoadlines(220,i*(7+(i*7)), i+4, (i+1)*10, -0.1, 0.4, i);
    }
    // Creates 2 initial cloud objects
    for (var i = 0; i < 2; i++) {
        cds[i] = makeCloud(100+(i*200), 40, 50, 40, .3);
    }
}

function draw() {
    road();
    roadlines();
    sky();
    updateRoads();
    driverseat();
}

function driverseat() {
    //Dashboard
    noStroke();
    fill(50);
    rect(0, 360, width, 120);

    //Fuel Meter and Speedometer
    fill('white');
    circle(110, 430, 50);	
    circle(190, 430, 50);
    fill('black');
    circle(110, 430, 40);
    circle(190, 430, 40);

    // Fuel meter lines
    push();
    translate(110, 430)
    rotate(radians(-45));
    for (var i = 0; i < 5; i++) {
	stroke('white');
        strokeWeight(.8);
	line(-15, 0, -10, 0);
	rotate(radians(55));
    }
    pop();

    // Speedometer lines
    push();
    translate(190, 430)    
    rotate(radians(-45));
    for (var i = 0; i < 10; i++) {
        stroke('white');
        strokeWeight(.8);
        line(-15, 0, -10, 0);   
        rotate(radians(25));
    }
    pop();
   
    // Needle
    fill('red');
    push();
    translate(110, 430);
    triangle(-2, -6, 8, 16, 12, 14);
    translate(80, 0);
    triangle(-2, -6, 8, 16, 12, 14);
    pop();

    //Steering Wheel
    stroke('black');
    strokeWeight(20);
    noFill();
    arc(150, 490, 200, 200, PI, PI);
    noStroke();
    fill('black');
    ellipse(150, 500, 200, 100);

    // GPS
    image(gps, 300, 380);

    //Mirror
    fill('black');
    rect(300, 0, 120, 45);
    fill(17, 124, 19);
    rect(310, 0, 100, 35);
    fill('gray');
    triangle(310, 35, 350, 0, 400, 35);
    fill('lightblue');
    rect(310, 0, 100, 10); 
}

function road() {
    noStroke();
    fill('gray');
    triangle(-(width), height, width/2, 80, 1.5*width, height);
}

function sky() {
    noStroke();
    fill('lightblue')
    rect(0, 0, width, 100);
    
    // Sun
    fill('yellow');
    circle(10, 10, 70);

    // Clouds
    clouds();
    updateClouds();
}

function roadlines() {
    fill('white');
    push();
    rotate(radians(20));
    for (var i = 0; i < 6; i++) {                           
        rect(lines[i].x, lines[i].y, lines[i].sx, lines[i].sy);
    }
    pop();
}

function makeRoadlines(xPos, yPos, xSize, ySize, changeX, changeY, c) {
    var roadlines = {x: xPos, y: yPos,
	             sx: xSize, sy: ySize,
                     dx: changeX, dy: changeY,
                     change: c}
    return roadlines;
}

// Updates roadlines & adds to size of road as it moves towards bottom of canvas
function updateRoads() {
    for (var i = 0; i < 6; i++) {
        // Makes new line when each line is greater than 300
        if (lines[i].y > 300) {
            lines[i] = makeRoadlines(220,0*(7+(0*7)),
	    0+4, (0+1)*10, -0.1, 0.4, 0);
	    // How far apart each line is
	    var k = i;
            for (var j = 0 ; j < 6; j++) {
	        if (k > 5) {
		    k = 0;
		}
	        lines[k].change = j;
		k++;
	    }
        }
	// Makes lines move and change size toward bottom of canvas
	lines[i].y += lines[i].dy + lines[i].change/4;
	lines[i].sx += 0.01;
	lines[i].sy += 0.1;
    }
}

function makeCloud(xPos, yPos, w, h, changeX) {
    var clouds = {x: xPos, y: yPos,
	          dx: changeX}
    return clouds;
}

function clouds() {
    fill('white');
    for (var i = 0; i < 2 ; i++) {
        ellipse(cds[i].x, cds[i].y, 50, 40);
        ellipse(cds[i].x + 20, cds[i].y + 20, 50, 40);
        ellipse(cds[i].x + 30, cds[i].y - 10, 50, 40);
        ellipse(cds[i].x + 60, cds[i].y + 15, 50, 40);
        ellipse(cds[i].x + 70, cds[i].y, 50, 40);
    }
}

// Makes cloads reappear at the left of the screen
function updateClouds() {
    // If cloads greater than 450 makes new one reappear from left of canvas
    for (var i = 0; i < 2; i++) {
        if (cds[i].x > 450) {
	    cds[i].x = -100;
	}
        // Makes them move towards right of canvas
	cds[i].x += cds[i].dx;
    }
}

Project 11: Deep Sea

For the project this week, I wanted to create a scene that depicts marine life, with fish seaweed and bubbles blown by the wish.

The objects in this scene are of three types:

  1. Stable – pebbles, seabed
  2. Movement – seaweed, which moves between constraints for the effect of swaying in water
  3. Motion – the fish and the bubbles.

I planned the scene in a sketch and then, using the starter code, tried to explore different ways of making the scene dynamic.

For the fish, I first, used the constructor, to make the shape of the fish and then used transparency to create an element of uniqueness in each new fish that is born on the canvas. This also enhances the effect of transparency scales and that eveything under water is bobbing and swaying.

For the motion of the seaweed, I used the random() function so that the height of the rectangle moves between two constraints, this giving the movement effect.

Please view the full code and visual preview here:

https://editor.p5js.org/ssahasra/full/R7Sh-om9z

LO-11-Women Practitioners

Jenny Sabin Studio, Ada, 2018-2019. 

Jenny Sabin, Ada, 2018-2019. Source.

Ada is a project by Jenny Sabin’s studio for the Microsoft Research Artist in Residence program. The project was named after Ada Lovelace, one of the first computer programmers and a woman as well. This project uses AI and architecture to create an interactive pavilion using responsive photo-luminescence. The project uses 3d printed nodes to connect fiberglass rods, with a knitted main structure that contains the responsive aspects of the pavilion.  

This project was fascinating to me in its manipulation of what architecture tends to be– static. The pavilion constantly changes in response to the clients it is made for–humans. Thus, the pavilion explores the bounds on which architecture can morph in real time as a response to human stimulus and movements. By integrating the light responsive aspect, the pavilion has yet another transformative variable that generates constant new experiences of Ada. The exploration Jenny Sabin does in this project introduces the possibilities of architecture that become fluid and almost free form to an extent using real time data sets that respond to the environment. It is inspiring in the ways Jenny Sabin uses Ada and artificial intelligence to connect humans to material forms and thus forming an intimate conversation between the pavilion and us where we are able to communicate through interpreted data.

Project 11 – Landscape

sketchDownload
//Ian Lippincott
//ilippinc@andrew.cmu.edu
//Section: D
//Project 11

var hill = [];
var mountains = [];
var trees = [];
var c1;
var c2;
var noiseParam = 0;
var noiseStep = 0.03;

function setup() {
    createCanvas(400, 240);
    //Define background colors
    c1 = color(228, 90, 41);
    c2 = color(221, 197, 75);
    strokeWeight(1);
    frameRate(20);
    for (var i = 0; i < (width / 5) + 1; i++) {
      var n = noise(noiseParam);
      var value = map(n, 0, 1, 50, 200);
      hill.push(value);
      noiseParam += noiseStep;
    }
}

 // create an initial collection of mountains 
    for (var i = 0; i < 10; i++){
        var rx = random(width);
        mountains[i] = makemountain(rx);
    }

// create an initial collection of trees 
    for (var i = 0; i < 10; i++){
        var r = random(width);
        trees[i] = maketree(r);
    }    

function draw() {
  setGradient(c1, c2);
  strokeJoin(BEVEL);
  stroke(0);
  strokeWeight(4);
  fill(63, 77, 44);
  hill.shift(); 
  var n = noise(noiseParam);
  var value = map(n, 0, 1, 50, 150);
    hill.push(value);
    noiseParam += noiseStep;
    beginShape();
    vertex(0, height);
    for (var i = 0; i < (width / 5) + 1; i++) {
      vertex(i * 5, hill[i]);
    } 
    vertex(width, height);
    endShape();

    //Ground
    fill(95, 110, 73);
    rect(0, 199, width, height);

    //mountains
    updateAndDisplayMountains();
    removeMountainsThatHaveSlippedOutOfView();
    addNewMountainsWithSomeRandomProbability();

    //Trees
    updateAndDisplayTrees();
    removeTreesThatHaveSlippedOutOfView();
    addNewTreesWithSomeRandomProbability();
}

//mountains
function makeMountain(birthLocationX) {
    var mntn = {x: birthLocationX,
                breadth: 70,
                speed: -5.5,
                nFloors: round(random(2,8)),
                move: mountainMove,
                display: mountainDisplay}
    return mntn;
}

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

// draw the mountain
function mountainDisplay() {
    var floorHeight = 8;
    var cHeight = this.nFloors * floorHeight; 
    
    strokeWeight(4);
    stroke(0);
    fill(156, 119, 76);
    push();
    translate(this.x, height - 40);

    //Mountain
    triangle(-7,0,this.breadth/2,-cHeight-20,this.breadth + 7,0);
    //Shadow
    fill(87, 66, 42);
    triangle(-7,0,this.breadth/2,-cHeight-20,20,0);
    //Snow
    pop();
}

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

function removeMountainsThatHaveSlippedOutOfView(){
  var mountainToKeep = [];
  for (var i = 0; i < mountains.length; i++){
    if (mountains[i].x + mountains[i].breadth > 0) {
        mountainToKeep.push(mountains[i]);
    }
  }
  mountains = mountainToKeep; // remember the surviving mountain
}

function addNewMountainsWithSomeRandomProbability() {
    // With a very tiny probability, add a new cabin to the end.
    var newMountainLikelihood = 0.02; 
    if (random(0,1) < newMountainLikelihood) {
        mountains.push(makeMountain(width));
    }
}


//trees
function makeTree(birthLocationX) {
    var tr = {x: birthLocationX,
                breadth: 70,
                speed: -6.0,
                nFloors: round(random(2,8)),
                move: treeMove,
                display: treeDisplay}
    return tr;
}

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

// draw the tree
function treeDisplay() {
    var floorHeight = 8;
    var cHeight = this.nFloors * floorHeight; 
    
    strokeWeight(4);
    stroke(0);
    fill(71, 145, 80);
    push();
    translate(this.x, height - 40);

    //Tree
    triangle(0, 0, 10,-cHeight, 20, 0);
    triangle(0, -8, 10,-cHeight, 20, -8);
    triangle(0, -16, 10,-cHeight, 20, -16);
    pop();
}

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

function removeTreesThatHaveSlippedOutOfView(){
  var treeToKeep = [];
  for (var i = 0; i < trees.length; i++){
    if (trees[i].x + trees[i].breadth > 0) {
        treeToKeep.push(trees[i]);
    }
  }
  trees = treeToKeep; // remember the surviving mountain
}

function addNewTreesWithSomeRandomProbability() {
    // With a very tiny probability, add a new cabin to the end.
    var newTreeLikelihood = 0.08; 
    if (random(0,1) < newTreeLikelihood) {
        trees.push(makeTree(width));
    }
}

//Makes Gradient Background
function setGradient(c1, c2) {
  noFill();
  for (var b = 0; b < height; b++) {
    var inter = map(b, 0, height, 0, 1);
    var c = lerpColor(c1, c2, inter);
    stroke(c);
    line(0, b, width, b);
  }
}

LO-11 : Tega Brain

Keeping Time: a time visualisation with photos

Of all the women practitioners I have come across in the field of interaction design and computation, I find Tega Brain’s voice to be one of the most unique. Tega Brain uses computation and combines it with environmental interpretation of computers and her work forms bridges between computation and design as it occurs in nature. She creates computation systems/projects that respond to natural phenomena and vice versa. 

Tega Brain is an Australian-born computational designer/artist. She has a background in environmental engineering. She is a professor of New Media at NYU and is associated with Processing.org – a language similar to p5.js for visual computation.

The project I found the most interesting, especially because we recently learnt about images in p5.js is called “Keeping Time”. As described on her website – “Keeping Time portrays a complex biological system living through the Anthropocene. The series is made by scraping the Flickr database for images of particular plant species and laying the results out according to their time stamp. Photographs for each year are arranged in rows and are ordered across each row according to date.”

She uses transparency of images and their density in a given area of pixels to visualise time and the age of species. I admire that she uses images to visualise data and this project speaks to her larger body of work where she combines design with environmental phenomena.

LO 11 – A Focus on Women Practitioners

Madeline Gannon is a designer of interactive tools for digital fabrication at Madlab. The project I am highlighting is called Tactum, which is an augmented modeling tool that is used to design 3D printed wearables. This tool uses depth-sensing and projection mapping to sense different inputs and in turn, project touch gestures on the user’s skin. This is a very ingenious method of rapid prototyping that allows anybody to design a 3D printed wearable, and see real-time feedback throughout the process. It is very interesting to see the limitations of a program with a finite amount of possible creations (due to the given size and number of bands). I would really like to explore this tool and discover new methods of interaction and how they would produce different outcomes.

http://www.madlab.cc/tactum

Project 11 – Generative Landscape

My project is a simple landscape with hills, trees, buildings, birds, and the sun. The trees vary in size and location, the building varies in width, and the birds vary in location and speed.

Maggie – Generative Landscape
//Maggie Ma
//Section D
//Generative Landscape

var buildings = [];
var hills = [];
var noiseParam = 0;
var noiseStep = 0.02;
var trees = [];
var birds = [];


function setup() {
    createCanvas(400, 500); 
    strokeWeight(4);
    
    // create an initial collection of buildings
    for (var i = 0; i < 2; i++){
        var rx = random(width);
        buildings[i] = makeBuilding(rx);
    }
    //create an initial collection of birds
    for (var i = 0; i < 3; i++){
        var rx = random(width);
        birds[i] = makeBird(rx);
    }

    // drawing hills in the back
    for (var i = 0; i<width/5 +1; i++) {
    	var n = noise(noiseParam);
    	var value = map(n,0,1,0,height+50);
    	hills.push(value);
    	noiseParam+=noiseStep;
    }
    frameRate(15);
}


function draw() {
    background(255,203,186); //light pink

    //sun
    fill(253,165,0); //yellow
    circle(width/2, height/2-70, 120.438 );

    //birds
    updateandDisplayBird();
    removeBirdThatHaveSlippedOutOfView();
    addNewBirdWithSomeRandomProbability();	

    //hills
    drawHills();
    displayHorizon();

    //building
    updateAndDisplayBuilding();
    removeBuildingsThatHaveSlippedOutOfView();
    addNewBuildingsWithSomeRandomProbability(); 

   //trees
    updateAndDisplayTrees();
    removeTreesThatHaveSlippedOutOfView();
    addNewTreesWithSomeRandomProbability(); 
}

function drawHills() {
	hills.shift();
    var n = noise(noiseParam);
    var value = map(n,0,1,0,height+50);
    hills.push(value);
    noiseParam += noiseStep;

    beginShape();
    vertex(0,height);
    for(var i =0; i <= width/5; i++) {
    	fill(255,163,130); //pink color
    	strokeWeight(4);
    	vertex((i*5),hills[i]);
    
    }
    vertex(width,height);
    endShape();
}

//creating trees
function makeTree(birthLocationX) {
    var t = {x: birthLocationX,
                breadth: round(random(10,30)),
                speed: -5.0,
                y: random(10, 40), //randomize tree size and location
                w: random(30, 40),
                h: random(40, 60),
                move: treeMove,
                display: treeDisplay}
    return t;
}

function treeMove() {
    this.x += this.speed;
}

function treeDisplay() {
    push();
    translate(this.x, height -125);
    strokeWeight(4); 
    fill(80,202,119);
    //leaves
  	ellipse(this.x,this.y, this.w, this.h);
  	//trunk
  	line(this.x, this.y+10, this.x, this.y+70);
    pop();
}

function updateAndDisplayTrees(){
    for (var i = 0; i < trees.length; i++){
        trees[i].move();
        trees[i].display();
    }
}

function removeTreesThatHaveSlippedOutOfView(){
    var treesToKeep = [];
    for (var i = 0; i < trees.length; i++){
        if (trees[i].x + trees[i].breadth > 0) {
            treesToKeep.push(trees[i]);
        }
    }
    trees = treesToKeep;
}
function addNewTreesWithSomeRandomProbability() {
    var newTreeLikelihood = 0.07; 
    if (random(0,1) < newTreeLikelihood) {
        trees.push(makeTree(width));
    }
}

//creating building
function makeBuilding(birthLocationX) {
    var bldg = {x: birthLocationX,
                breadth: 70,
                speed: -8.0,
                w: random(70,110), //randomize width
                move: buildingMove,
                display: buildingDisplay}
    return bldg;
}

function buildingMove() {
    this.x += this.speed;
}

function buildingDisplay() {
	push();
    strokeWeight(4); 
    fill(253,165,0); //yellow block on right side
  	rect(this.x ,315.478 ,this.w ,137.574);
  
  	rect(this.x - 55.901, 364.514 ,15.016 ,88.538); //yellow pillars
  	rect(this.x +7.51, 364.514 ,15.016 ,88.538);
  	rect(this.x-28.083,180.775,23.237,26.131); //yellow top
  	fill(255,255,255);
  	rect(this.x-33.153,206.996,33.377,33.377); //middle section
  	fill(253,165,0);
  	rect(this.x-21.845,219.566,10.762,20.807);
  	fill(255,255,255);
  	rect(this.x-40.661, 240.463,48.108 ,212.59 ); //bottom base
  	fill(0,195,227);
  	rect(this.x-40.661,259.105,15.016 ,25.094); //turquoise designs
  	rect(this.x-40.661,302.931,15.016 ,25.094);
  	rect(this.x-7.508,259.105,15.016 ,25.094 );
  	rect(this.x-7.508, 302.931,15.016 ,25.094);
  	fill(225,43,0);
  	rect(this.x-40.885,346.758,15.016,106.295); //red designs
  	rect(this.x-7.508,346.758,15.016,106.295);
  	line(this.x-25.869,240.8 ,this.x-25.869,453.053);
  	line(this.x-7.508,240.8 ,this.x-7.508,453.053);

    pop();
}

function updateAndDisplayBuilding(){
    for (var i = 0; i < buildings.length; i++){
        buildings[i].move();
        buildings[i].display();
    }
}

function removeBuildingsThatHaveSlippedOutOfView(){
    var buildingToKeep = [];
    for (var i = 0; i < buildings.length; i++){
        if (buildings[i].x + buildings[i].breadth > 0) {
            buildingToKeep.push(buildings[i]);
        }
    }
    buildings = buildingToKeep;
}
function addNewBuildingsWithSomeRandomProbability() {
    var newBuildingLikelihood = 0.015; 
    if (random(0,1) < newBuildingLikelihood) {
        buildings.push(makeBuilding(width));
    }
}

//creating birds
function updateandDisplayBird(){
    for (var i = 0; i < birds.length; i ++){
        birds[i].move();
        birds[i].display();
    }
}

function removeBirdThatHaveSlippedOutOfView(){
    var keepBirds=[];
    for (var i = 0; i < birds.length; i++) {
        if (birds[i].x < width) {
            keepBirds.push(birds[i]);
        }
    }
    birds = keepBirds;
}

function addNewBirdWithSomeRandomProbability(){
    var newBirdLikelihood = 0.01; 
    if (random(0,1) < newBirdLikelihood) {
        birds.push(makeBird(15, 15));
    }
}

function Birdmove(){
    this.x += this.speed;
}

function birdDisplay(){
    fill(0);
    stroke(0);
    push();
    translate(this.x, this.y);
    //wings
    triangle(0, 0, 3, 0, -2, -3);
    triangle(0, 0, 3, 0, 2, 3);
    pop();
}

function makeBird(birthLocationX, birthLocationY){
    var bird = {x: birthLocationX,
                y:random(100,200),
                speed:random(2, 9),
                move: Birdmove,
                display: birdDisplay};
    return bird;
}
//creating grass horizon line
function displayHorizon(){
    fill(106,207,124);
    stroke(4);
    rect(0, height-50, width, height-50);
}

Looking Outwards 11:

I’ve seen Angela Washko’s work before, and I find her exploration of feminism through interactive alternative video games. One such game I found interesting was The Game: The Game, a project that presents an exploration of consent and politics. The game is presented in the format of a dating simulator, where players experience the tactics and practices of male pick-up artists and “the seduction community”. These pick-up gurus attempt to seduce the player, providing and in-depth look into the specific social behaviors around dating, giving insight on the experiences many women have in the real world.

Angela Washko is a visiting assistant professor at Carnegie Mellon University, a small University in Pittsburgh, Pennsylvania (often mistaken for Central Michigan University). She was known for creating performances and “social stunts” in the game World Of Warcraft, where she discusses feminism and toxic masculinity in video games. Having attended a few of her classes, I find her style of critiquing patriarchal systems and toxic-masculinity online very amusing.

https://angelawashko.com/section/437138-The-Game-The-Game.html

LO 11 – A Focus on Women Practitioners

Claudia Hart

The Dolls House (2016)

For my female artist I chose to learn about Claudia Hart, a computational fine artist of interactive imagery. Her work features topics such as issues of the body, perception, the real vs. unreal, and the relationship between nature and technology. Hart’s work is “symbolist and poetic” (from her website bio), and can be described as mesmerizing and hypnotic. She describes her work as “post photography” —her pieces are generated from computer models instead of captured with a camera. 

I examined her piece The Dolls House—a special series of video, drawing and sculpture inspired by the media ballet The Dolls, based in the philosophical idea that history forever renews itself through “a process of decadence, decay and rebirth” (https://claudiahart.com/The-Dolls-House-2016). In this piece, Hart molded mathematical cycles into visual form: a figurative flicker film created with rhythmic animations and pulsing patterns. The passage of time is defined by a cyclical animation where a light moves around the virtual set, casting shadows to mimic sunrise and sunset.