Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
//Title: Xray_Machine
//Description: This program draws a face that will avoid the mouse around the screen (its eyes will follow). Pressing any key will enable Xray vision (the key can be held). The face's parts are all listed from the perspective of the face (the eye on the left side of the screen is the face's right eye).
//Author: Paolo Di Filippo; Student ID: 991442028
//Course: PROG14998 Introduction to Media Computation - 1169_89545; Instructor: Nicolas Hesler
void setup() {
  size(400, 400);
}

void draw() {
  background(255);
  //I specify a frameRate at the begining of the draw loop because the change I make to frameRate in the keyPressed event would affect the whole program after being called
  frameRate(30);


  /*SKULL*/
  noFill();
  stroke(0);
  strokeWeight(5);

  //outline for skull's jaw (with the br and bl corners of the rect using 100 as the radius value)
  rect(width - mouseX, (height + 60) - mouseY, 195, 120, 0, 0, 100, 100);
  fill(255);
  //skull top
  ellipse(width - mouseX, (height - 40) - mouseY, 230, 220);
  noStroke();
  //skull bottom
  rect(width - mouseX, (height + 60) - mouseY, 195, 120, 0, 0, 100, 100);

  fill(0);
  //right skull eye
  ellipse((width - 50) - mouseX, (height - 30) - mouseY, 60, 50);
  //left skull eye
  ellipse((width + 50) - mouseX, (height - 30) - mouseY, 60, 50);

  //right skull nostril (tl corner is most round, tr is close to bridge of nose and is straighter, br is slightly curver and bl is as curved as tl)
  rect((width - 10) - mouseX, height - mouseY, 15, 50, 100, 5, 15, 100);
  //left skull nostril (tl corner is close to bridge of nose and is straighter, tr corner is most round, br is as curved as tr and bl is slightly curved)
  rect((width + 10) - mouseX, height - mouseY, 15, 50, 5, 100, 100, 15);

  noFill();
  stroke(0);
  strokeWeight(3);
  //skull mouth
  ellipse(width - mouseX, (height + 75) - mouseY, 100, 40);
  rectMode(CORNERS);

  //skull's teeth: the first rect in this series is the rightmost tooth, and they are all drawn from right to left
  rect((width - 48) - mouseX, (height + 55) - mouseY, (width - 36) - mouseX, (height + 95) - mouseY);
  rect((width - 36) - mouseX, (height + 55) - mouseY, (width - 24) - mouseX, (height + 95) - mouseY);
  rect((width - 24) - mouseX, (height + 55) - mouseY, (width - 12) - mouseX, (height + 95) - mouseY);
  rect((width - 12) - mouseX, (height + 55) - mouseY, width - mouseX, (height + 95) - mouseY);
  rect(width - mouseX, (height + 55) - mouseY, (width + 12) - mouseX, (height + 95) - mouseY);
  rect((width + 12) - mouseX, (height + 55) - mouseY, (width + 24) - mouseX, (height + 95) - mouseY);
  rect((width + 24) - mouseX, (height + 55) - mouseY, (width + 36) - mouseX, (height + 95) - mouseY);
  rect((width + 36) - mouseX, (height + 55) - mouseY, (width + 48) - mouseX, (height + 95) - mouseY);
  stroke(255);
  strokeWeight(12);
  //skull mouth outer lining
  ellipse(width - mouseX, (height + 75) - mouseY, 115, 55);
  /*SKULL*/


  /*HEAD*/
  noStroke();
  ellipseMode(CENTER);
  //skin colour for head
  fill(250, 190, 190);
  //head 
  ellipse(width - mouseX, height - mouseY, 250, 300);
  //hair colour
  fill(120, 60, 60);
  //hair
  arc(width - mouseX, (height - 10) - mouseY, 254, 350, radians(170), radians(370));
  //skin colour for head
  fill(250, 190, 190);
  //skin coloured arc to cover up hair drawn over head
  arc(width - mouseX, (height + 21) - mouseY, 200, 300, radians(180), radians(360));
  /*HEAD*/


  /*EYES*/
  //the different parts of the eyes move at different rates to simulate a parallax effect
  //whites of the eyes
  fill(255);
  //right eye
  triangle((width - 80) - mouseX, (height - 10) - mouseY, (width - 50) - mouseX, (height - 50) - mouseY, (width - 30) - mouseX, (height - 10) - mouseY);
  //left eye
  triangle((width + 80) - mouseX, (height - 10) - mouseY, (width + 50) - mouseX, (height - 50) - mouseY, (width + 30) - mouseX, (height - 10) - mouseY);

  //black for eye rings
  fill(0, 200);
  //right eye ring
  ellipse(((width - 50) - mouseX) - ((width/2 - mouseX) * 0.02), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.02), 30, 30);
  //left eye ring
  ellipse(((width + 50) - mouseX) - ((width/2 - mouseX) * 0.02), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.02), 30, 30);

  //brown for iris
  fill(150, 55, 55);
  //right iris
  ellipse(((width - 50) - mouseX) - ((width/2 - mouseX) * 0.03), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.03), 25, 25);
  //left iris
  ellipse(((width + 50) - mouseX) - ((width/2 - mouseX) * 0.03), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.03), 25, 25);

  //black for pupil
  fill(0);
  //right pupil
  ellipse(((width - 50) - mouseX) - ((width/2 - mouseX) * 0.04), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.04), 10, 10);
  //left pupil
  ellipse(((width + 50) - mouseX) - ((width/2 - mouseX) * 0.04), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.04), 10, 10);

  noFill();
  //skin colour for triangles around eyes to cover moving inner eye when it goes outside bounds of white eye triangle
  stroke(250, 190, 190);
  strokeWeight(7);
  //right eye triangle
  triangle((width - 89) - mouseX, (height - 8) - mouseY, (width - 50) - mouseX, (height - 57) - mouseY, (width - 21) - mouseX, (height - 8) - mouseY);
  //left eye triangle
  triangle((width + 89) - mouseX, (height - 8) - mouseY, (width + 50) - mouseX, (height - 57) - mouseY, (width + 21) - mouseX, (height - 8) - mouseY);
  /*EYES*/


  /*NOSE*/
  noStroke();
  //darker skin colour for nose
  fill(240, 170, 170);
  rectMode(CENTER);
  //bridge of nose
  rect(width - mouseX, height - mouseY, 50, 100, 50);
  fill(250, 190, 190);
  //right curve of nose
  arc((width - 30) - mouseX, (height - 10) - mouseY, 30, 50, radians(270), radians(450));
  //left curve of nose
  arc((width + 30) - mouseX, (height - 10) - mouseY, 30, 50, radians(90), radians(270));
  /*NOSE*/


  /*EYEBROWS*/
  //eyebrow lining colour
  stroke(100, 60, 60);
  strokeWeight(2);
  //eyebrow inner colour
  fill(120, 60, 60);
  //right eyebrow
  arc((width - 50) - mouseX, (height - 60) - (mouseY + (0.05 * (height/2 - mouseY))), 50, 25, radians(170), radians(370));
  //left eyebrow
  arc((width + 50) - mouseX, (height - 60) - (mouseY + (0.05 * (height/2 - mouseY))), 50, 25, radians(170), radians(370));
  /*EYEBROWS*/


  /*EYE BAGS*/
  noStroke();
  //purple skin colour for under eyes
  fill(210, 170, 200);
  ellipseMode(CORNERS);
  //right eye bag
  arc((width - 70) - mouseX, (height - 20) - mouseY, (width - 30) - mouseX, (height + 5) - mouseY, 0, PI);
  //left eye bag
  arc((width + 30) - mouseX, (height - 20) - mouseY, (width + 70) - mouseX, (height + 5) - mouseY, 0, PI);
  /*EYE BAGS*/


  /*LIPS*/
  //lip colour
  fill(240, 100, 125);
  //lip outline colour
  stroke(240, 175, 185, 150);
  ellipseMode(CENTER);
  //upper lip
  arc(width - mouseX, (height + 80) - mouseY, 100, 40, PI, TWO_PI);
  //bottom lip
  arc(width - mouseX, (height + 80) - mouseY, 80, 40, 0, PI);
  /*LIPS*/
}

void keyPressed() {
  //set framerate lower to prevent flickering when event is called
  frameRate(7);
  background(0);
  println("Xray mode engaged!");
  //all primitives except the skull have the alpha value in their fill functions reduced to create the illusion of an Xray


  /*SKULL*/
  noFill();
  stroke(0);
  strokeWeight(5);

  //outline for skull's jaw (with the br and bl corners of the rect using 100 as the radius value)
  rect(width - mouseX, (height + 60) - mouseY, 195, 120, 0, 0, 100, 100);
  fill(255);
  //skull top
  ellipse(width - mouseX, (height - 40) - mouseY, 230, 220);
  noStroke();
  //skull bottom
  rect(width - mouseX, (height + 60) - mouseY, 195, 120, 0, 0, 100, 100);

  fill(0);
  //right skull eye
  ellipse((width - 50) - mouseX, (height - 30) - mouseY, 60, 50);
  //left skull eye
  ellipse((width + 50) - mouseX, (height - 30) - mouseY, 60, 50);

  //right skull nostril (tl corner is most round, tr is close to bridge of nose and is straighter, br is slightly curver and bl is as curved as tl)
  rect((width - 10) - mouseX, height - mouseY, 15, 50, 100, 5, 15, 100);
  //left skull nostril (tl corner is close to bridge of nose and is straighter, tr corner is most round, br is as curved as tr and bl is slightly curved)
  rect((width + 10) - mouseX, height - mouseY, 15, 50, 5, 100, 100, 15);

  noFill();
  stroke(0);
  strokeWeight(3);
  //skull mouth
  ellipse(width - mouseX, (height + 75) - mouseY, 100, 40);
  rectMode(CORNERS);

  //skull's teeth: the first rect in this series is the rightmost tooth, and they are all drawn from right to left
  rect((width - 48) - mouseX, (height + 55) - mouseY, (width - 36) - mouseX, (height + 95) - mouseY);
  rect((width - 36) - mouseX, (height + 55) - mouseY, (width - 24) - mouseX, (height + 95) - mouseY);
  rect((width - 24) - mouseX, (height + 55) - mouseY, (width - 12) - mouseX, (height + 95) - mouseY);
  rect((width - 12) - mouseX, (height + 55) - mouseY, width - mouseX, (height + 95) - mouseY);
  rect(width - mouseX, (height + 55) - mouseY, (width + 12) - mouseX, (height + 95) - mouseY);
  rect((width + 12) - mouseX, (height + 55) - mouseY, (width + 24) - mouseX, (height + 95) - mouseY);
  rect((width + 24) - mouseX, (height + 55) - mouseY, (width + 36) - mouseX, (height + 95) - mouseY);
  rect((width + 36) - mouseX, (height + 55) - mouseY, (width + 48) - mouseX, (height + 95) - mouseY);
  stroke(255);
  strokeWeight(12);
  //skull mouth outer lining
  ellipse(width - mouseX, (height + 75) - mouseY, 115, 55);
  /*SKULL*/


  /*HEAD*/
  noStroke();
  ellipseMode(CENTER);
  //skin colour for head
  fill(250, 190, 190, 50);
  //head
  ellipse(width - mouseX, height - mouseY, 250, 300);
  //hair colour
  fill(120, 60, 60, 50);
  //hair
  arc(width - mouseX, (height - 10) - mouseY, 254, 350, radians(170), radians(370));
  //skin colour for head
  fill(250, 190, 190, 50);
  //skin coloured arc to cover up hair drawn over head
  arc(width - mouseX, (height + 21) - mouseY, 200, 300, radians(180), radians(360));
  /*HEAD*/


  /*EYES*/
  //whites of the eyes
  fill(255, 50);
  //right eye
  triangle((width - 80) - mouseX, (height - 10) - mouseY, (width - 50) - mouseX, (height - 50) - mouseY, (width - 30) - mouseX, (height - 10) - mouseY);
  //left eye
  triangle((width + 80) - mouseX, (height - 10) - mouseY, (width + 50) - mouseX, (height - 50) - mouseY, (width + 30) - mouseX, (height - 10) - mouseY);

  //black for eye rings
  fill(0, 25);
  //right eye ring
  ellipse(((width - 50) - mouseX) - ((width/2 - mouseX) * 0.02), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.02), 30, 30);
  //left eye ring
  ellipse(((width + 50) - mouseX) - ((width/2 - mouseX) * 0.02), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.02), 30, 30);

  //brown for iris
  fill(150, 55, 55, 50);
  //right iris
  ellipse(((width - 50) - mouseX) - ((width/2 - mouseX) * 0.03), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.03), 25, 25);
  //left iris
  ellipse(((width + 50) - mouseX) - ((width/2 - mouseX) * 0.03), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.03), 25, 25);

  //black for pupil
  fill(0, 50);
  //right pupil
  ellipse(((width - 50) - mouseX) - ((width/2 - mouseX) * 0.04), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.04), 10, 10);
  //left pupil
  ellipse(((width + 50) - mouseX) - ((width/2 - mouseX) * 0.04), ((height - 20) - mouseY) - ((height/2 - mouseY) * 0.04), 10, 10);

  noFill();
  //skin colour for triangles around eyes to cover moving inner eye when it goes outside bounds of white eye triangle
  stroke(250, 190, 190, 50);
  strokeWeight(7);
  //right eye triangle
  triangle((width - 89) - mouseX, (height - 8) - mouseY, (width - 50) - mouseX, (height - 57) - mouseY, (width - 21) - mouseX, (height - 8) - mouseY);
  //left eye triangle
  triangle((width + 89) - mouseX, (height - 8) - mouseY, (width + 50) - mouseX, (height - 57) - mouseY, (width + 21) - mouseX, (height - 8) - mouseY);
  /*EYES*/


  /*NOSE*/
  noStroke();
  //darker skin colour for nose
  fill(240, 170, 170, 50);
  rectMode(CENTER);
  //bridge of nose
  rect(width - mouseX, height - mouseY, 50, 100, 50);
  fill(250, 190, 190, 50);
  //right curve of nose
  arc((width - 30) - mouseX, (height - 10) - mouseY, 30, 50, radians(270), radians(450));
  //left curve of nose
  arc((width + 30) - mouseX, (height - 10) - mouseY, 30, 50, radians(90), radians(270));
  /*NOSE*/


  /*EYEBROWS*/
  //eyebrow lining colour
  stroke(100, 60, 60, 50);
  strokeWeight(2);
  //eyebrow inner colour
  fill(120, 60, 60, 50);
  //right eyebrow
  arc((width - 50) - mouseX, (height - 60) - (mouseY + (0.05 * (height/2 - mouseY))), 50, 25, radians(170), radians(370));
  //left eyebrow
  arc((width + 50) - mouseX, (height - 60) - (mouseY + (0.05 * (height/2 - mouseY))), 50, 25, radians(170), radians(370));
  /*EYEBROWS*/


  /*EYE BAGS*/
  noStroke();
  //purple skin colour for under eyes
  fill(210, 170, 200, 50);
  ellipseMode(CORNERS);
  //right eye bag
  arc((width - 70) - mouseX, (height - 20) - mouseY, (width - 30) - mouseX, (height + 5) - mouseY, 0, PI);
  //left eye bag
  arc((width + 30) - mouseX, (height - 20) - mouseY, (width + 70) - mouseX, (height + 5) - mouseY, 0, PI);
  /*EYE BAGS*/


  /*LIPS*/
  //lip colour
  fill(240, 100, 125, 50);
  //lip outline colour
  stroke(240, 175, 185, 25);
  ellipseMode(CENTER);
  //upper lip
  arc(width - mouseX, (height + 80) - mouseY, 100, 40, PI, TWO_PI);
  //bottom lip
  arc(width - mouseX, (height + 80) - mouseY, 80, 40, 0, PI);
  /*LIPS*/
}