katieche – final project

final project

// BORROWED FROM IRA GREENBERG
var radius = 45, rotAngle = -90;
var accelX = 0.0, accelY = 0.0;
var deltaX = 0.0, deltaY = 0.0;
var springing = 0.0009, damping = 0.98;

//corner nodes
var nodes = 5;

//zero fill arrays
var nodeStartX = [];
var nodeStartY = [];
var nodeX = [];
var nodeY = [];
var angle = [];
var frequency = []; // END OF BORROWED CODE

// array for the rings and boxes
var rings = [];
var boxes = [];

// initializing colors for keypressed changes
var r = 250;
var g = 250;
var b = 250;

var frames = [];

//var score = 0;

function preload() { // loading ring popping animation frames
	var f = [];
		f[0] = "https://i.imgur.com/AZJNy6P.png";
		f[1] = "https://i.imgur.com/coAJvFm.png";
		f[2] = "https://i.imgur.com/Y3RE12y.png";
		f[3] = "https://i.imgur.com/9sTJNBz.png";


		for(var i =0; i < 4; i++){
			frames[i] = loadImage(f[i]);
		}
}


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


  // BORROWED FROM IRA GREENBERG: initialize arrays to 0
  for (var i=0; i<nodes; i++){
    nodeStartX[i] = 0;
    nodeStartY[i] = 0;
    nodeY[i] = 0;
    nodeY[i] = 0;
    angle[i] = 0;
  } // END OF BORROWED CODE

  // initializes collection of rings 
  for (var i = 0; i < 3; i++){
    	var ry = random(-300, 0); //rings are falling from above the canvas at random
        rings[i] = makeRing(ry);
        boxes[i] = makeBox(ry);
        }

  // BORROWED FROM IRA GREENBERG: iniitalize frequencies for corner nodes
  for (var i = 0; i < nodes; i++){
    frequency[i] = random(4, 5);
  } // END OF BORROWED CODE

  noStroke();
  frameRate(30);
}

function draw() {
	fill(50);
	rect(0,0,width, height);

	// display rings + boxes
	updateAndDisplayRings();
	ringAdd();

	updateAndDisplayBox();
	boxAdd();

	// for the character
  	drawShape();
  	moveShape();

  	// instructional text
  	text("press 'Q' to eat blue, 'W' to eat pink, 'E' to eat yellow", 180, 450);


}
// CHARACTER
// CODE IS BASED ON IRA GREENBERG'S SOFT BODY EXAMPLE:
// https://p5js.org/examples/simulate-soft-body.html
// HAS BEEN HEAVILY EDITED BY ME
function drawShape() {
  //  calculate node  starting locations
  for (var i=0; i<nodes; i++){
    nodeStartX[i] = mouseX+cos(radians(rotAngle))*radius;
    nodeStartY[i] = mouseY+sin(radians(rotAngle))*radius;
    rotAngle += 360.0/nodes;
  }

  // draw polygon
  curveTightness(0.5); // to create soft body like organic shape
  noStroke();
  fill(r,g,b);
  beginShape();
  // creates a point at each (nodeX, nodeY) for the 5 corners in the array
  for (var i=0; i<nodes; i++){
    curveVertex(nodeX[i], nodeY[i]);
  }
  // to make shape connect all the way around
  for (var i=0; i<nodes-1; i++){
    curveVertex(nodeX[i], nodeY[i]);
  }
  endShape(CLOSE); // END OF BORROWED CODE

  // eyes
  fill(149, 166, 193);
  ellipse(mouseX+30, mouseY, 10, 10);
  ellipse(mouseX-30, mouseY, 10, 10);

  push();
  noFill();
  stroke(149, 166, 193);
  strokeWeight(3);
  ellipse(mouseX+30, mouseY, 15, 15);
  ellipse(mouseX-30, mouseY, 15, 15);
  pop();
}


function moveShape() { // BORROWED FROM IRA GREENBERG
  //move center point
  deltaX = mouseX;
  deltaY = mouseY;

   //create springing effect
  deltaX *= springing;
  deltaY *= springing;
  accelX += deltaX*0.8;
  accelY += deltaY*0.8;

  // slow down springing
  accelX *= damping;
  accelY *= damping;

  //move nodes
  for (var i=0; i<nodes; i++){
    nodeX[i] = nodeStartX[i]+sin(radians(angle[i]))*(accelX);
    nodeY[i] = nodeStartY[i]+sin(radians(angle[i]))*(accelY);
    angle[i] += frequency[i];
  }
} // END OF BORROWED CODE

function keyPressed() { // changes blob's color

    if(keyCode == 81) { // "Q" blue
        r = 202;
        g = 220;
        b = 247;
    }
    if(keyCode == 87) { // "W" pink
        r = 247;
        g = 207;
        b = 207;
    }
    if(keyCode == 69) { // "E" yellow
        r = 255;
        g = 241;
        b = 193;
    }
}

// RINGS
function updateAndDisplayRings(){
    // Update the rings positions, and display them.
    for (var i = 0; i < rings.length; i++){
        rings[i].move();
        rings[i].display();
    }
}


function ringAdd() {
    // With a very tiny probability, add a new ring to the end.
    var newringLikelihood = 0.02; 
    if (random(0,1) < newringLikelihood) {
        rings.push(makeRing(0));
        rings.push(makeRing(0));

    }
}

// moving the rings
function ringMove() {
    this.y += this.speed;

}
    
// drawing the rings
function ringDisplay() {
	noFill();
	stroke(210);
	strokeWeight(2);

	if (dist(mouseX, mouseY, this.x, this.y) <= 50) { // if the mouse is 50 points close to the ring, it pops
		this.isPopped = true;
		this.timePopped = frameCount; // record the framecount at which it pops
	}


	if (this.isPopped == false) { // if the state of the ring is not popped
		ellipse(this.x, this.y, this.diam, this.diam);
	}

	else {
		this.popped(); // if this.isPopped == true, then calls ringPop which displays pop animation

	}


}

function ringPop() { // animating rings popping
	var num = frameCount-this.timePopped;
	if (num >= frames.length) {
		// if num goes past the number of animation frames, the pop dissapears
	}
	
	else {
    image(frames[num], this.x, this.y, 50, 50);
	}
}


// making the rings
function makeRing(cy) {
    var ring = {y: cy,
    			x: random(0,600),
    			diam: random(15,25),
 				speed: random(2.0, 3.0),
                move: ringMove,
                display: ringDisplay,
                isPopped: false,
                popped: ringPop,
                timePopped: -10
            }
    return ring;
}

// SQUARES
function updateAndDisplayBox(){
    // Update the clouds' positions, and display them.
    for (var i = 0; i < boxes.length; i++){
        boxes[i].bmove();
        boxes[i].bdisplay();
    }
}


function boxAdd() {
    // With a very tiny probability, add a new ring to the end.
    var newboxLikelihood = 0.02; 
    if (random(0,1) < newboxLikelihood) {
        boxes.push(makeBox(0));
    }
}

// moving the rings
function boxMove() {
    this.by += this.bspeed;
    this.py += this.pspeed;
    this.yy += this.yspeed;

}
    
// drawing the rings
function boxDisplay() {

	// blue box
	if (dist(mouseX, mouseY, this.bx, this.by) <= 50 & r == 202 && g == 220 && b == 247) { 
	// if the mouse is 50 points close to the box and the blob is blue
		this.bisEaten= true;
	}


	if (this.bisEaten == false) { // if the state of the box is not eaten
		noStroke();
		fill(202, 220, 247);
		rect(this.bx, this.by, this.bs, this.bs, 5);
	}

	else {
	}

	// pink box
	if (dist(mouseX, mouseY, this.px, this.py) <= 50 & r == 247 && g == 207 && b == 207) { 
	// if the mouse is 50 points close to the box and the blob is pink
		this.pisEaten = true;
	}


	if (this.pisEaten == false) { // if the state of the box is not eaten
		noStroke();
		fill(247, 205, 202);
		rect(this.px, this.py, this.bs, this.bs, 5);
	}

	else {
		// box disapears when state is true
	}

	// yellow box
	if (dist(mouseX, mouseY, this.yx, this.yy) <= 50 & r == 255 && g == 241 && b == 193) { 
	// if the mouse is 50 points close to the box and the blob is pink
		this.yisEaten = true;
	}

	if (this.yisEaten == false) { // if the state of the box is not eaten
		noStroke();
		fill(255, 241, 193);
		rect(this.yx, this.yy, this.bs, this.bs, 5);
	}

	else {
		// box disapears when state is true
	}

}

// making the rings
function makeBox(ty) {
    var box = {	// blue box coord
    			by: ty,
    			bx: random(0,600),
    			// pink box coord
    			py: random(0,200),
    			px: random(0,600),
    			// yellow box coord
    			yy: random(0,200),
    			yx: random(0,600),

    			bs: random(20,25),
 				bspeed: random(1.0, 2.0),
 				pspeed: random(1.0, 2.0),
 				yspeed: random(1.0, 2.0),
                bmove: boxMove,
                bdisplay: boxDisplay,

                bisEaten: false, // blue false
                pisEaten: false, // pink false
                yisEaten: false, // yellow false
            }
    return box;
}

For my final project, I wanted to create a game with a fun ambiguous character. In a way, the game is like a fight between an organic shape and geometric shapes. It’s slightly different from my proposal but I like the way it turned out. It uses a modified version of the generative landscape functions, making the terrain (falling objects) fall downwards instead of sideways. It was difficult to modify the code so that the shapes would fall in a way that was relatively even, and not in lines or waves. The character is done using a heavily modified version of the soft body code found on the p5.js examples.

The objective of the game is to clear the screen! The rings pop whenever the character touches them, but the character’s own color must match up with the color of the squares to eat them. To change the character’s color, the player must select Q, W or E on their keyboard.

katieche- project 12 proposal

For my project, I wanted to create an interactive game that is minimalistic but fun and somewhat challenging. The user represents an organic shape that follows the mouse and is going to be animated using photos preloaded. It will have a constant waving fluid like motion to look more interesting. There will be geometric shapes falling from the top of the canvas that interact with the user. The two shapes that can win the user points are the circles and squares. To get points from the circles, you (the organic shape) must touch the circle, which causes it to burst. To get points from the squares, the user must press one of four keys which will coordinate with the blob’s color, to allow the blob to eat the square of the same color (i.e. if the user presses “Q” the blob will change to pink, letting it eat the pink squares, but if the blob is pink and it touches a yellow square, the yellow square will just pass through it). Beware of the triangles! Touching the triangle will cause the user to lose a life. There is also a score counter at the bottom right. The higher the user’s score, the faster the shapes will fall from the top of the screen. If the user doesn’t hit a square or a circle, the user does not die, they just lost the opportunity to gain that point.

draft made in illustrator of what the game might potentially look like. The blob starts off white until the user changes its color by hitting a key.

katieche-project 11

katieche-10

var t1;
var t2;
var t3;

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

    // starts the turtle at a random location in the canvas
    t1 = makeTurtle(random(0, 480), random(0, 480));
    t2 = makeTurtle(random(0, 480), random(0, 480));
    t3 = makeTurtle(random(0, 480), random(0, 480));

    //puts pen down and sets colors and weight of each line
    t1.penDown();
    t1.setColor(color(190, 210, 240));
    t1.setWeight(3);
    t2.penDown();
    t2.setColor(color(200, 240, 210));
    t2.setWeight(3);
    t3.penDown();
    t3.setColor(color(250, 190, 210));
    t3.setWeight(3);
    frameRate(10);
}
 
function draw() {
    //starts making the turtle move
    t1.forward(10);
    t2.forward(10);
    t3.forward(10);
    //makes the turtle turn towards the mouse
    t1.turnToward(mouseX, mouseY, 10);
    t2.turnToward(mouseX, mouseY, 10);
    t3.turnToward(mouseX, mouseY, 10);

}

function turtleLeft(d){this.angle-=d;}function turtleRight(d){this.angle+=d;}
function turtleForward(p){var rad=radians(this.angle);var newx=this.x+cos(rad)*p;
var newy=this.y+sin(rad)*p;this.goto(newx,newy);}function turtleBack(p){
this.forward(-p);}function turtlePenDown(){this.penIsDown=true;}
function turtlePenUp(){this.penIsDown = false;}function turtleGoTo(x,y){
if(this.penIsDown){stroke(this.color);strokeWeight(this.weight);
line(this.x,this.y,x,y);}this.x = x;this.y = y;}function turtleDistTo(x,y){
return sqrt(sq(this.x-x)+sq(this.y-y));}function turtleAngleTo(x,y){
var absAngle=degrees(atan2(y-this.y,x-this.x));
var angle=((absAngle-this.angle)+360)%360.0;return angle;}
function turtleTurnToward(x,y,d){var angle = this.angleTo(x,y);if(angle< 180){
this.angle+=d;}else{this.angle-=d;}}function turtleSetColor(c){this.color=c;}
function turtleSetWeight(w){this.weight=w;}function turtleFace(angle){
this.angle = angle;}function makeTurtle(tx,ty){var turtle={x:tx,y:ty,
angle:0.0,penIsDown:true,color:color(128),weight:1,left:turtleLeft,
right:turtleRight,forward:turtleForward, back:turtleBack,penDown:turtlePenDown,
penUp:turtlePenUp,goto:turtleGoTo, angleto:turtleAngleTo,
turnToward:turtleTurnToward,distanceTo:turtleDistTo, angleTo:turtleAngleTo,
setColor:turtleSetColor, setWeight:turtleSetWeight,face:turtleFace};
return turtle;}

I just wanted to do something that reminded me of like things flying in the air, so I went with powerpuff girls colored lines that fly and do spins in the air. They fly following your mouse, and do circles in place when you mouse is not in motion.



katieche-looking outwards 11

Carsten Nicolai

Berlin based German artist and musician, Carsten Nicolai, works in a transitional field between music, art, and science. He seeks to override the individualized sensory perceptions by creating works that appeal to multiple senses at a time (i.e. using sound and light frequencies to appeal to ears and eyes simultaneously). In terms of computation, he often uses mathematical patterns like random, grids, error, consistency, etc.

In his 2016 installation, Reflektor Distortion, viewers can both hear the sounds being played, and see the light bars seemingly move in the water bowl. It works by creating sound waves through a speaker that shifts the water in the bowl accordingly, therefore creating the illusion that the series of light bars being reflected in the water are also moving. The result is a mesmerizing movement of lights that coincide with whatever sound is being displayed. I think that the light bas are a very effective and beautiful way to display sound waves, contrary to the stereotypical up-down cosine/sine looking sound waves that we’re all used to seeing.

katieche-looking outwards 10

NEUROTiQ

The sensoree NEUROTiQ spa was headed by Kristin Neidlinger, a biomedia concept designer. It consists of a headpiece that “animates” your brain by illuminating and mapping brain waves using color. It was applied in the setting of a yoga class, as an experimental project. The headpiece uses the Muse Brain Sensing Headband to identify activity and brain wave patterns of the user, and then animated the headpiece to display colors according to the user’s cognition levels, attention, resting rate, meditation and sense of deep sleep.

This technology would be used in notifying people of their more relaxed states of mind, which would promote mental well being.

katieche-project-10

katieche-10

/*
katie chen
katieche@andrew.cmu.edu
project 10
section e
*/

var terrainSpeed = 0.0002;
var terrainDetail = 0.002;
var backdetail = 0.003;
var clouds = [];
var cacti = [];
var camelfr = [];
var cam = [];

function preload() {
	var camelfile = [];
		camelfile[0] = "https://i.imgur.com/bDUcYTm.png";
		camelfile[1] = "https://i.imgur.com/6dVVrob.png";
		camelfile[2] = "https://i.imgur.com/hbSKaEk.png";
		camelfile[3] = "https://i.imgur.com/7mLCzwN.png";
		camelfile[4] = "https://i.imgur.com/ajswkv9.png";
		camelfile[5] = "https://i.imgur.com/5PYiIL8.png";
		camelfile[6] = "https://i.imgur.com/izwJZyn.png";
		camelfile[7] = "https://i.imgur.com/bHlNbyH.png";

		for(var i =0; i < 8; i++){
			camelfr[i] = loadImage(camelfile[i]);
		}
}


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

    // making initial collection of objects
    for (var i = 0; i < 10; i++){
    	var rx = random(width);
        clouds[i] = makeCloud(rx);
        cacti[i] = makeCactus(rx);
        cam[i] = makeCam(rx);
    }

  	frameRate(10);
}
 
function draw() {
    background(185, 174, 176);
    push();
    noStroke();
    fill(188, 177, 178);
	rect (0, 140, width, height-140);
	fill(195, 180, 176);
    rect (0, 170, width, height-170);
   	fill(200, 185, 176);
    rect (0, 230, width, height-230);
    fill(207, 187, 172);
    rect (0, 260, width, height-260);
    pop();
    
    ground();

	updateAndDisplayCacti();
	cactusAdd();

	updateAndDisplayCam();
    camAdd();
    camDisplay();

    updateAndDisplayClouds();
	cloudAdd();
    
}

function ground() {
	// background
    push();
    beginShape(); 
    noStroke();
	fill(200, 164, 140); 
    for (var x = 0; x < width; x++) {
        var t = (x * backdetail) + (millis() * terrainSpeed);
        var y = map(noise(t), 0,1, 200, height-50);
        vertex(0,480);
        vertex(480,480);
        vertex(x, y); 
    }
    endShape();
    pop();

    // foreground
	push();
    beginShape(); 
    noStroke();
	fill(181, 121, 78); 
    for (var x = 0; x < width; x++) {
        var t = (x * terrainDetail) + (millis() * terrainSpeed);
        var y = map(noise(t), 0,1, 270, height);
        vertex(0,480);
        vertex(480,480);
        vertex(x, y); 
    }
    endShape();
    pop();
}

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


function cloudAdd() {
    // With a very tiny probability, add a new cloud to the end.
    var newcloudLikelihood = 0.02; 
    if (random(0,1) < newcloudLikelihood) {
        clouds.push(makeCloud(width));
    }
}

// moving the clouds
function cloudMove() {
    this.x += this.speed;

}
    
// drawing the clouds
function cloudDisplay() {
	push();
	translate(this.x, 50);
	noStroke();
	if (this.z < 30) {
		fill(225, 210, 192);
	}

	if (this.z > 30 & this.z < 50) {
		fill(222, 202, 182);
	}
	if (this.z > 50) {
		fill(218, 194, 174);
	}
	
	rect(23+this.x, 50+this.z, 100+this.l, 25+this.h, 200, 200, 200, 200);
	rect(60+this.x, 25+this.z, 50, 50, 200, 200, 200, 200);
	rect(50+this.x, 35+this.z, 30, 30, 200, 200, 200, 200);
	pop();

}

// making the clouds
function makeCloud(cx) {
    var cloud = {x: cx,
    			z: random(0, 150),
    			l: random(0,20),
    			h: random(0,20),
 				speed: -1.0,
                move: cloudMove,
                display: cloudDisplay
            }
    return cloud;
}

// CACTUS
function updateAndDisplayCacti(){
    // Update the cacti positions, and display them.
    for (var i = 0; i < cacti.length; i++){
        cacti[i].tmove();
        cacti[i].tdisplay();
    }
}

function cactusAdd() {
    // With a very tiny probability, add a new cactus to the end.
    var newcactusLikelihood = 0.02; 
    if (random(0,0.5) < newcactusLikelihood) {
        cacti.push(makeCactus(width));
    }
}

// moving the cactus
function cactusMove() {
    this.mx += this.mspeed;

}

// draw the cactus
function cactusDisplay() {
    push();
    noStroke();
    translate(this.mx, 200);
    fill(131-this.cr, 170, 124-this.cr);
    rect(50+this.mx,50+this.cacter,25+this.wid, 90+this.hei, 200, 200, 0,0);
    rect(50+this.mx+this.wid,80+this.cacter,40,10,200,200,200,200);
    rect(80+this.mx+this.wid,60+this.cacter,10,30,200,200,200,200);
    rect(30+this.mx,90+this.cacter,40,10,200,200,200,200);
    rect(30+this.mx,70+this.cacter,10,30,200,200,200,200);
    pop();
}

// making the cacti
function makeCactus(tx) {
    var cactus = {mx: tx,
 				mspeed: -2.5,
 				hei: random(-10,20), // tallness of main cactus body
 				wid: random(0,5), // fatness of main cactus body
 				cr: random(0,50), // color 
 				cacter: random(70, 180), // y value
                tmove: cactusMove,
                tdisplay: cactusDisplay
            }
    return cactus;
}

// CAMEL
function updateAndDisplayCam(){
    // Update the camel positions, and display them.
    for (var i = 0; i < cam.length; i++){
        cam[i].cmove();
        cam[i].cdisplay();
    }
}

function camAdd() {
    // With a very tiny probability, add a new camel to the end.
    var newcamLikelihood = 0.02; 
    if (random(0,1) < newcamLikelihood) {
        cam.push(makeCam(width));
    }
}

// moving the camel
function camMove() {
    this.camx += this.cspeed;

}

function camDisplay() {
    push();
    noStroke();
    scale(0.3);
    for (var i = 0; i < 10; i++) {
    var num = frameCount % 8;
        image(camelfr[num],600, 900);
    }
    pop();
}

// making the camel
function makeCam(ax) {
    var camel = {camx: ax,
 				cspeed: -1.0,
                cmove: cactusMove,
                cdisplay: cactusDisplay
            }
    return camel;
}

I had a lot of fun working on this project. I wanted to create a desert landscape, so I selected colors from an image of the grand canyon. I made the background sort of have a gradient to give more of a “never ending stretch of land” horizon line feeling. The cactuses were a fun addition that I created in p5.js before realizing that I could’ve made them in illustrator and uploaded them as image files. Upon realization, I decided to add the moving camel. The original gif is from here, but I took each frame and edited it in illustrator to make it look more uniform in my code.

katieche looking outwards 09

dayoungl Looking Outwards -05

In her looking outwards, Sharon looked at the works of Columbian based artist, Daniel Aristizabal. I picked this looking outwards because I was shocked at the images were made from a computer program and not actually real. I love that the artist’s drive is to make mundane, everyday things look so surreal with the pop of contrasting colors, while at the same time maintaining the realism of the images. I also agree with the artist’s method of working: starting with pen and paper. I feel like the convenience of modern technology sometimes causes us to lock in on too many details before even having a desirable idea. I always became locked in on changing minute details in Photoshop or inDesign, and kind of got tunnel vision for hours, before realizing I wasn’t even that into the idea I was working on.

katieche-project 09

katieche-09

var underlyingImage;

function preload() {
    var myImageURL = "https://i.imgur.com/bDkozta.jpg ";
    underlyingImage = loadImage(myImageURL);
}

function setup() {
    createCanvas(480, 480);
    background(0);
    underlyingImage.loadPixels();
    //frameRate(10);
}

function draw() {
    var px = random(width);
    var py = random(height);

    var w = random(0,20);
    var h = random(0,20);

    var ix = constrain(floor(px), 0, width);
    var iy = constrain(floor(py), 0, height);
    var theColorAtLocationXY = underlyingImage.get(ix, iy);

    noStroke();
    fill(theColorAtLocationXY);
    arc(px, py, w, h, PI+QUARTER_PI, TWO_PI);
    arc(px, py, w, h, PI+QUARTER_PI, TWO_PI);
    arc(px, py, w, h, PI+QUARTER_PI, TWO_PI);
    arc(px, py, w, h, PI+QUARTER_PI, TWO_PI);
    arc(px, py, w, h, PI+QUARTER_PI, TWO_PI);
    arc(px, py, w, h, PI+QUARTER_PI, TWO_PI);

    var theColorAtTheMouse = underlyingImage.get(mouseX, mouseY);
    fill(theColorAtTheMouse);
    noStroke();
    var z = random(0,80);
    var d = random(0, 10);
    ellipse(mouseX, mouseY, d,d);
    arc(pmouseX, pmouseY, w, h, PI+QUARTER_PI, TWO_PI);
}

My code creates lots of small arcs in random areas like scales. I was inspired by when you run your finger through scales and the sheen on them changes. The mouse also creates small ellipses like a brush, if you’d like to speed up the image creation process.

katieche-looking outwards 08

CLOUDS

Browsing the list of speakers, the thumbnail for CLOUDS caught my attention. It’s an interactive documentary representing open source communities through depicting the stories of invention and discovery of 45 programmers. The team behind CLOUDS consists of James George, an artist who uses computational photography for making portraits and interactive storytelling, and Jonathan Minard, an alum of the Carnegie Mellon Robotics Institute who uses an anthropological approach to tell stories of the shifts of science and art.

The use of computational graphics to tell these stories lends an even more cohesive approach to telling these stories. It adds another dimension to the idea of marrying videography, design, and programming.

katieche – looking outwards – 07

I chose the work of Nicolas Felton because I had found out about him back when I was in high school, and I thought everything he did at the time was just through adobe programs, not through computation or coding! His work is really fascinating as he essentially records every moment of his life for an entire year (every year), and then complies them into informational graphics for an annual report on each January 1st. He uses processing to create graphs and charts, and then exports them into Adobe InDesign to create his reports. He’s even created an app which sends users reminders to record data, and essentially collects, and categorizes the user’s everyday data.

feltron
article