sketch.js
var color1;
var color2;
function setup() {
createCanvas(770, 830); color1 = color(230, 38, 42);
color2 = color(251, 95, 41);
background(239, 94, 8);
angleMode(DEGREES);
}
function draw() {
noStroke();
setGradient(0, 0, 770, 830, color1, color2);
stroke(255, 255, 255, 20);
noFill();
ellipse(136 + 156,189 + 156,315,314);
var a = color(255);
stroke(a);
noFill();
arc(136 + 156,189 + 156,315,314, 44, 87);
stroke(255, 255, 255, 40);
noFill();
ellipse(315 + 142,124 + 142,282,282);
var a = color(255);
stroke(a);
noFill();
arc(315 + 142,124 + 142,282,282, 97, 168);
stroke(255, 255, 255, 30);
noFill();
ellipse(331 + 125,140 + 125,248,248);
stroke(255, 255, 255, 10);
noFill();
ellipse(351 + 107,158 + 107,212,212);
stroke(255, 255, 255, 20);
noFill();
ellipse(243 + 116,289 + 116,234,234);
var a = color(255);
stroke(a);
noFill();
arc(243 + 116,289 + 116,234,234, 250, 333);
stroke(255, 255, 255, 40);
noFill();
ellipse(415 + 67,544 + 67,133,133);
stroke(255, 255, 255, 40);
noFill();
ellipse(277 + 51,350 + 54,91,96);
stroke(255, 255, 255, 40);
noFill();
ellipse(251 + 29,413 + 29,56,57);
var a = color(255);
stroke(a);
noFill();
arc(251 + 29,413 + 29, 56,57, 0, 70);
stroke(255, 255, 255, 40);
noFill();
ellipse(281 + 192,180 + 225,384,453);
var neck = color(255, 40);
stroke(neck);
line(439, 415.26, 439, 544.5);
var rightcollar = color(255, 40);
stroke(rightcollar);
line(439, 544, 481, 544);
var rightshoulder = color(255, 200);
stroke(rightshoulder);
arc(415 + 67,544 + 67,133,133, 270, 0);
stroke(255, 255, 255, 40);
noFill();
ellipse(120 + 133,355 + 133,209,267);
var a = color(255);
stroke(a);
noFill();
arc(120 + 133,355 + 133,209,267, 0, 90);
stroke(255, 255, 255, 40);
ellipse(144 + 70,235 + 117,141,234);
var a = color(255);
stroke(a);
noFill();
arc(144 + 70,235 + 117,141,234, 31, 60);
stroke(255, 255, 255, 200);
line(262, 437, 282, 437);
var hairbase = color(255, 40)
stroke(hairbase)
line(647.78, 503, 286.35, 503);
var sidehair = color(255, 200);
stroke(sidehair);
line(439, 406.71, 438.89, 504.29);
var slanthair = color(255, 200);
stroke(slanthair);
line(463, 352, 547, 504);
line(546.83, 504, 439.71, 504);
stroke(255, 255, 255, 40);
noFill();
ellipse(292 + 24,366 + 24,47,47);
var a = color(255);
stroke(a);
fill(255);
var diagonalline = color(255);
stroke(diagonalline);
line(301.36, 406.64, 344, 377);
var c = color(255, 40);
stroke(c)
line(406, 410.26, 406, 451);
stroke(255, 255, 255, 40);
noFill();
ellipse(406 + 14.5,395 + 15,28,28);
}
function setGradient(x, y, w, h, color1, color2) {
noFill();
for (var i = y; i <= y+h; i++) {
var inter = map(i, x, x+w, 0, 1);
var c = lerpColor(color1, color2, inter);
stroke(c);
line(i, y, i, y+h);
}
}
Using and familiarizing myself with the p5 library for this assignment was an absolute blast. Having very little experience with it, I expected to feel the complete opposite as I’d cowered in fear of programming for years. Instead, setting up this composition felt oddly and incredibly satisfying, from design to debugging.
I composed my portrait from a series of intersecting ellipses and lines. Where these objects overlap is where the features of my profile are formed. I drew arcs atop the objects to highlight the important and recognizable features. I also added a slight horizontal gradient to add a smidgeon of depth.
In hindsight, it would’ve been nice to figure out how to increase the opaqueness of the parts of the objects that form the features rather than redrawing separate arcs on top. I also wish that I iterated further to explore other color relationships. Looking forward, I’d like to make this sketch respond to mouse position, specifically to have the highlighted arc areas glide around the ellipses they are based on, deconstructing and reforming my profile.