Overview
For this assignment, I initially had a bit of uncertainty about the theme involved with creating a self-portrait using JavaScript. Stick figures seemed like a starting point, but I decided to draw inspiration from the cartoon TV show Gravity Falls. My goal was to capture the same facial structure that made the show so memorable from my childhood, appreciating its cool graphics. So, let me introduce you to Sara, the new character on Gravity Falls!
Challenges
Drawing inspiration from Gravity Falls presented several challenges, particularly in replicating the facial structures of the original characters using only ellipses, rectangles, and triangles. Coordinating the shapes, especially the triangles, definitely tested my patience. Gladly & after several attempts, I sought assistance from Desmos (advanced graphing calculator) to recreate and visualize my canvas in terms of coordinates, I found that pretty helpful!
reflection
My initial intention was to animate multiple objects on the screen, including the sun transforming into a darker color against an ombre background to symbolize sunset (ideally, user-controlled). However, I underestimated the time required for the graphic design itself & hope to implement animations in future projects. While I consider myself familiar with other languages, I wouldn’t claim that p5.js is my expertise. Overall, I found great enjoyment in this project and am proud of the results, particularly the implementation of a simple animation for the “Mukhawar” or Emirati traditional wear. If anyone is interested in the code, you can find it below!
// Welcome to the behind-the-scenes of Sara's self-portrait!
function setup() {
createCanvas(500, 600);
frameRate(10);
}
function draw() {
background(153, 175, 191);
// sun
noStroke();
fill(242, 209, 44);
ellipse(0, 0, 300, 300);
// clouds
noStroke();
fill(240);
ellipse(100, 200, 60, 50);
ellipse(60, 200, 60, 50);
ellipse(20, 200, 60, 50);
ellipse(75, 180, 60, 50);
ellipse(45, 180, 60, 50);
ellipse(500, 170, 70, 60);
ellipse(460, 170, 70, 60);
ellipse(420, 170, 70, 60);
ellipse(485, 140, 70, 60);
ellipse(445, 140, 70, 60);
ellipse(300, 80, 70, 60);
ellipse(260, 80, 70, 60);
ellipse(220, 80, 70, 60);
ellipse(280, 60, 70, 60);
ellipse(245, 60, 70, 60);
// ground
fill(54, 99, 57);
rect(0, 500, 500, 100);
// neck
fill(138, 98, 134);
rect(190, 295, 130, 100);
// hijab
noStroke();
fill(138, 98, 134);
ellipse(245, 300, 190, 140);
rect(165,180,175,120)
triangle(325, 158, 410, 480, 300, 680);
// face
noStroke();
fill(214, 176, 150);
ellipse(240, 295, 160, 120);
rect(175,180,145,120)
//eyelashes
push();
stroke(0);
strokeWeight(2)
line(160, 240, 200, 255);
line(170, 230, 200, 255);
line(295, 240, 200, 255);
line(285, 230, 200, 255);
pop();
// eyes
fill(255);
stroke(0)
ellipse(200, 250, 60, 60);
ellipse(255, 250, 60, 60);
fill(0);
ellipse(200, 245, 7, 7);
ellipse(255, 245, 7, 7);
// hair
noStroke();
fill(38, 20, 2);
push();
rotate(PI/9);
rect(280, 45, 98, 50);
rotate(PI/-6);
rect(135, 200, 80, 30);
pop();
// hijab 2 (top part)
fill(138, 98, 134);
arc(253, 180, 175, 100, PI, TWO_PI);
rect(165, 185, 10, 30);
// hair 2
fill(38, 20, 2);
arc(250, 185, 155, 60, PI, TWO_PI);
// mouth
fill(255);
stroke(0);
arc(230, 305, 60, 37, 0, PI, CHORD);
// hijab 3
fill(138, 98, 134);
noStroke();
rect(166, 177, 9, 30);
rect(320, 170, 17, 60);
// eyebrows
push();
stroke(21, 19, 19);
strokeWeight(2);
noFill();
arc(195, 215, 35, 10, PI, TWO_PI, OPEN);
arc(255, 215, 35, 10, PI, TWO_PI, OPEN);
pop();
// body
fill(163, 106, 145);
rect(130, 385, 240, 255, 20, 15, 10, 5);
push();
rotate(PI/14);
rect(210, 343, 65, 225, 20, 15, 10, 5);
rotate(PI/-9);
rect(260, 427 , 65, 220, 20, 15, 10, 5);
pop();
// sleeves
fill(138, 98, 134);
triangle(330,440,350,600,340,600);
triangle(165,440,140,600,130,600);
// dress
fill(50, 46, 82);
rect(210, 390, 65, 220, 20, 15, 10, 5);
// crystal animation
// inspired by https://editor.p5js.org/nanou/sketches/rJ-EMpxa
var spot = {
x:50,
y: 25,
};
var col = {
r:255,
g:0,
b:0,
};
spot.x= random (215, 270);
spot.y= random (390, 480);
noStroke();
col.r = random (100, 255);
col.g = (0);
col.b = random (100, 200);
fill (col.r, col.g, col.b, 120);
ellipse (spot.x, spot.y, 10, 10);
// neckline
fill(138, 98, 134);
arc(240, 384, 100, 80, 0, PI, CHORD);
// mark
fill(0,95);
ellipse(280,290,2,2);
// nose
fill(214, 176, 150);
stroke(0);
arc(228, 279, 15, 25, 0, PI/3 + PI);
}
// Thank you so much!