Lydia Jin- Looking Outwards Week2

It is very enlightening to see an art project based on nature. This project is based on an ongoing research by artist Rihards Vitols. His ambition lies with replacing some bird species with artificial ones so that in case the bird population reduces, the artificial birds can still help maintain a natural forest balance. The project is based on science. Vitols tried to use his woodpeckers to understand the communication among trees, insects, and woodpeckers. For now, the project is still pretty vague. But the idea of having backup artificial birds to maintain an ecosystem balance is very impressive and practical. The design of the artificial also looks vintage and natural, there is a woodpecker carving on each of the woodpeckers which makes the design natural and artsy.
2aweekb_b-1

ShanWang-LookingOutwards-02

forms02-03-640x427

The Forms project is an interactive video installation exhibited at National Media Museums, a collaborative work by Memo Akten and Quayola. It explored the invisible relationships of “power, balance and conflict” between human’s body movement, especially the one of the athlete. The abstraction of forms and visual elements came from live footage, and without specification, I suppose that the algorithm takes in change in position, speed and sound of the athletes and generates artistic elements based on these data.
I found it particularly interesting because it transformed, or rather materialized the invisible trajectory, strength and even energy of instant movements, into highly artistic and articulated mechanical forms, something more palpable.
I think the project took an interesting approach in representation. Not only were the sound and graphic elements embodiment of vibrant movement, but the competitive and challenging athletic performance became easier and more interesting for people to appreciate and understand.

http://www.memo.tv/forms/

Project-02-Variable-Face

sketch-98.js

var hairColor = "black" 
var cheekHeight = 160;
var cheekWidth = 160;
var jawHeight = 320;
var jawWidth = 160;
var chinY = jawHeight+100;
var chinX = 320;
var skin = (229,160,115);
var eyeWidth = 64;
var squint = 24;
var eyeBLX = 320-cheekWidth/2;
var eyeBY = cheekHeight; 
var eyeBRX = eyeBLX+cheekWidth;
var eyeY = eyeBY +50 ;
var eyeLX = eyeBLX;
var eyeRX = eyeBRX;
 
var eyeSize = 75;
var irisSize = eyeSize/2;
var pupilSize = irisSize/4;
var eyeColor = "blue"
var noseWidth=25;
var noseLength=80;
var nostrilWidth = noseWidth+20

var mouthHeight = jawHeight
var mouthWidth = jawWidth - 60
var lipsize = 10

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

function draw() {
    background(180,23,230);
    //noStroke();
    strokeWeight(3);

   //hair
    fill(hairColor);
    ellipse(width/2,height/2,500,500);

    fill(skin);
    beginShape();
    curveVertex(width/4,100);
    curveVertex(width/4,100);//left temple

    curveVertex(cheekWidth,cheekHeight);
    curveVertex(jawWidth, jawHeight);

    curveVertex(chinX,chinY);

    curveVertex((width-jawWidth),jawHeight); 
    curveVertex((width-cheekWidth),cheekHeight);
    curveVertex(width-(width/4),100);

    curveVertex(width-(width/4),100);//right temple
    endShape();

    //eyebrows
    fill(hairColor);
    beginShape();
    vertex(eyeBLX-eyeWidth,eyeBY);
    bezierVertex(eyeBLX,eyeBY,eyeBLX+(eyeWidth/2),eyeBY+squint,eyeBLX+eyeWidth,eyeBY);
    bezierVertex(eyeBLX,eyeBY,eyeBLX+(eyeWidth/2),eyeBY-squint,eyeBLX-eyeWidth,eyeBY);
    endShape();

    beginShape();
    vertex(eyeBRX-eyeWidth,eyeBY);
    bezierVertex(eyeBRX, eyeBY, eyeBRX+(eyeWidth/2),eyeBY-squint,eyeBRX+eyeWidth,eyeBY);
    bezierVertex(eyeBRX,eyeBY,eyeBRX+(eyeWidth/2),eyeBY+squint, eyeBRX-eyeWidth,eyeBY);
    endShape();

    //eyes
   fill("white"); //eyeball
   ellipse(eyeLX,eyeY,eyeSize*1.2,irisSize);
   ellipse(eyeRX,eyeY,eyeSize*1.2,irisSize);

   fill(eyeColor); //iris
   ellipse(eyeLX,eyeY, irisSize, irisSize);
   ellipse(eyeRX, eyeY,irisSize,irisSize);

   fill("black");//pupils
   ellipse(eyeLX,eyeY, pupilSize, pupilSize);
   ellipse(eyeRX,eyeY,pupilSize,pupilSize);

   //nose
   strokeWeight(2);
   fill(skin);
   beginShape();
   curveVertex(noseWidth+(width/2),cheekHeight+30);
   curveVertex(noseWidth+(width/2),cheekHeight+30);
   curveVertex((width/2)+nostrilWidth,cheekHeight+noseLength+30);
   curveVertex((width/2)+noseWidth, cheekHeight+noseLength+30);

   curveVertex(width/2,noseLength+cheekHeight+40);

   curveVertex((width/2)-noseWidth,noseLength + cheekHeight+30);
   curveVertex((width/2)-nostrilWidth,noseLength + cheekHeight+30);
   curveVertex((width/2)-noseWidth,cheekHeight+30);
   curveVertex((width/2)-noseWidth,cheekHeight+30);
   endShape();
   
   //mouth 

   fill(255,10,10);

   beginShape(); //lower lip
   curveVertex((width/2)-mouthWidth,mouthHeight);
   curveVertex((width/2)-mouthWidth,mouthHeight);
   curveVertex((width/2)-(mouthWidth/2),mouthHeight+(lipsize/2));
   curveVertex(width/2, mouthHeight+lipsize);
   curveVertex((width/2)+(mouthWidth/2),mouthHeight+(lipsize/2));
   curveVertex((width/2)+mouthWidth,mouthHeight);
   curveVertex((width/2)+mouthWidth,mouthHeight);
   //upper lip
   curveVertex((width/2)-mouthWidth,mouthHeight);
   curveVertex((width/2)-mouthWidth,mouthHeight);

   curveVertex((width/2)-(mouthWidth/2), mouthHeight-(lipsize));
   curveVertex(width/2,mouthHeight-lipsize);
   curveVertex((width/2)+(mouthWidth/2), mouthHeight-(lipsize));

   curveVertex((width/2)+mouthWidth,mouthHeight);
   curveVertex((width/2)+mouthWidth,mouthHeight);
   endShape();

}

function mousePressed() {
    cheekHeight = height/3 + random(-20,20);
    cheekWidth = width/4 + random(-20,20);
    jawHeight = (height/4) + random(150,200);
    jawWidth = (width/4) + random(0,100);

    chinY = jawHeight+random(100,200);
    eyeWidth = width/10 + random(0,25);
    squint = height/20 + random(-20,20);
    
    eyeBY = cheekHeight + random(-10,10);
    eyeBRX = eyeBLX + cheekWidth + random(-10,10);
    hairColor = (random(0,255),random(0,255),random(0,255));

    eyeY = eyeBY + random(30,75);
    eyeSize = random(40, 100);
    irisSize = random((eyeSize/2), eyeSize/10);
    //pupilSize = ranodom((irisSize/4),irisSize/20);
    eyeColor = ((random(0,255),random(0,255),random(0,355)));

    noseWidth = random(10,40);
    noseLength = random(10,100);
    nostrilWidth = noseWidth + random(10,40);

    mouthHeight = jawHeight + random(20,100);
    mouthWidth = random(10,90);
   // lipSize = random(5,20);
    
    skin = random("chocolate", "coral", "khaki","LightSalmon", "moccasin");
}
  

 

Upon doing this project, I realized that I had issues with scaling things in the way that I wanted them. In order to correct that, I utilized the randomized feature to click through facial features that would fit and not fit. Eventually, I decided to have my faces look comedic more than anything else. I also had trouble with randomizing colors.

SEckert-Project-02-Variable Face

seckert-project-02

var hairWidth = (400);
var hairHeight = (420);
var hairColor = ('#A62BFF');
var eyeColor = ('#000000');
var eyeSize = (10);
var mouthSize = (10);
var eyebrowHeight = 50;
var backgroundColor = 255;


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

function draw() {

	background(backgroundColor);
  noStroke();
//hair
  fill(hairColor);
    ellipse ((width/2), (height/2), hairWidth, hairHeight);
//face
  fill('#F0DEFF');
    ellipse((width/2), (height/2), 250, 250);
//hair bangs
  fill(hairColor);
    ellipse ((width/2), ((height/2)-125), 150, 100);
//eyes
  fill(eyeColor);
    ellipse (((width/2)-50), ((height/2)-40), eyeSize, eyeSize);
    ellipse (((width/2)+50), ((height/2)-40), eyeSize, eyeSize);
//eyebrows
  fill (hairColor);
    rect (((width/2)-65), ((height/2)-eyebrowHeight), 30, 5);
    rect (((width/2)+(35)), ((height/2)-eyebrowHeight), 30, 5);
//mouth
  fill ('#000000');
    ellipse ((width/2), ((height/2)+30), mouthSize, mouthSize);
//nose
  fill ('#EBBAFF');
    ellipse ((width/2), (height/2), 30, 10);

  //noLoop()
}

function mousePressed() {
    hairWidth = random(400, 600);
    hairHeight = random(420, 620);
    hairColor = random(255);
    eyeColor = random(255);
    eyeSize = random(10, 30);
    mouthSize = random(10, 50);
    eyebrowHeight = random(50, 70);
    backgroundColor = random(0-255);
}

This project made me very aware of how little I remembered about programing in colors, particularly randomizing them. I’m sure that with more tinkering I could have added a lot more variety but I am happy with it as is.

Project-02-Variable Face

sketch

//Naomi Shimada
//15-104 Section D
//Project-02

       
   var r = 255;

   var g = 134;

   var b = 5; 

   var l = 110;   

   var c = 50;

   var h = 50;

   var e = 150;

   var b = 155;

   var d = 19;

   var z = 30;

function setup() {
    createCanvas(640, 480);
    background(0);
}


function draw(){

     
    // REGULAR FACE CODE

       fill(83,39,5);              //hair
    ellipse(300,300,475,900);

    
       strokeWeight(0);
       fill(229,171,110);             //face
    ellipse(300,200,300,400);
    
        strokeWeight(0);
        fill(255);
    ellipse(240,190,50,40);         //white of the eye, right
    
        strokeWeight(0);
        fill (159,56,d);           //brown
    ellipse(240,190,z,z);
        
        strokeWeight(0);
        fill(217,155,88);         //bridge of the nose
    triangle(305,190,330,260,275,260); 

        strokeWeight(0);
        fill(253,208,229);            //cheek L
    rect(200,225,h,c);
  
        strokeWeight(0);
        fill(253,208,229);                   //cheek R
    rect(350,225,c,h);

        fill(83,39,5);                //hair swoop
    ellipse(330,50,250,e);

        strokeWeight(7);           //Left eyebrow 1
        stroke(83,39,5); 
    line(330,165,355,155);
        
        strokeWeight(7);           //Left eyebrow 2
        stroke(83,39,5); 
    line(355,155,380,155);

        strokeWeight(7);           //Left eyebrow 3
        stroke(83,39,5); 
    line(380,155,400,165);

        strokeWeight(0);         //neck
        fill(229,171,110); 
    rect(250,350,100,300);

    strokeWeight(0);
        fill(r,g,b);            //barrett 1
    ellipse(470,100,20,20);

        stroke(r,g,b);
        strokeWeight(0);           //barrett L
    triangle(480,95,500,70,520,110);

        stroke(226,52,123);
        strokeWeight(0);           //barrett R
    triangle(462,105,420,90,435,130);

        strokeWeight(10);
        stroke(83,39,5);          //ribbon L
    line(470,100,460,140);

        strokeWeight(9);
               //ribbon R
    line(470,100,500,135);

        strokeWeight(0);
                  //barrett 1
    ellipse(470,100,20,20);
    
        strokeWeight(9);
        stroke(r,g,b);          //ribbon L Yellow
    line(470,100,500,140);


        strokeWeight(9);                     //ribbon R Color
    line(470,100,540,135);

      
        strokeWeight(0);         //body
        fill(g,r,b); 
    ellipse(300,500,300,150);


    //hair flow
   

        strokeWeight(60);                        //flowing hair brown 
        stroke(83,39,5);
    curve(0,0,478,170,600,400,1000,600);

        fill(83,39,5);                //filler
    ellipse(550,500,195,275);

        fill(83,39,5);                      //hair filler
    ellipse(525,350,125,225);


        strokeWeight(70);              //black flowing hair line
        stroke(0);
    curve(0,0,70,465,480,600,600,600);

   
        strokeWeight(0);           //winking eye
        fill(229,171,110);
    ellipse(370,190,55,45); 

        strokeWeight(7);                        //wink of the eye
        stroke(0);
    curve(10,100,335,190,390,190,190,300);

        //eyelashes starting at inner corner
        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(332,190,333,195,336,190);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(336,190,339,197,340,190);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(336,190,339,202,341,191);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(341,190,344,202,347,191);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(347,192,350,203,353,192);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(353,193,356,204,359,193);
        
        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(360,194,363,205,366,194);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(366,194,369,205.5,372,194);

        strokeWeight(3);
        stroke(0);
    triangle(372,194,375,205,378,194);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(378,193,381,204,384,193);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(384,192,387,202,390,192);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(390,190,393,200,396,191);

        strokeWeight(3);
        stroke(0);
        fill(0);
    triangle(396,190,399,197,402,188);

        strokeWeight(0);          //lower lip
        fill(229,171,l);
    quad(240,310,370,310,355,335,255,335);

        strokeWeight(2);
        stroke(229,171,l);         //upper lip R
        fill(229,171,l);
    triangle(240,310,290,300,305,310);
 
        strokeWeight(2);  
        stroke(229,171,l);         //upper lip L
        fill(229,171,l);
    triangle(305,310,330,300,370,310);

        strokeWeight(10);              //smile
        stroke(201,42,88);
    line(240,310,370,310);

        strokeWeight(10);              //smile
        stroke(201,42,88);
    curve(0,0,240,310,370,310,420,300);

        strokeWeight(0);              //teeth
        fill(225);
    quad(248,310,370,310,335,317,262,317);

        strokeWeight(8);           //Undos original Right eyebrow 2
        stroke(229,171,110); 
    line(250,155,225,155);

        strokeWeight(9);           //Undos original Right eyebrow 3
        stroke(229,171,110); 
    line(225,155,205,165);

        strokeWeight(7);           //Right eyebrow 1
        stroke(83,39,5); 
    line(275,165,250,155);

        strokeWeight(7);           //Right eyebrow 2
        stroke(83,39,5); 
    line(250,155,215,b);

        strokeWeight(7);           //Right eyebrow 3
        stroke(83,39,5); 
    line(215,b,205,155);
     
    
}

function mousePressed(){
 
         r = random(0,255);

         g = random(0,255);

         b = random(0,255);

         l = random(100,120);

         c = random(10,85);

         h = random(10,85);

         e = random(150,240);     
        
         b = random(120,155);
   
         d = random(0,105);

         z = random(30,40);
       

    }

I had a lot of fun with this program.  It took a while to make sure draw the original face but once I got into the rhythm of creating the variables, the random variability was fairly easy.

Looking Outwards-02

 

cam3_flashreference_eyes_v06

The Digital Human League’s Wikihuman project is an extensive collaborative effort to create realistic looking digital humans. As someone with a fine arts and theatre background and a large appreciation for Disney, the potential of digital actors both excites and frightens me. The Wikihuman project takes scans of people’s faces and then those scans are turned into various maps: diffuse, single scatter, specular, and displacement to name a few. The maps are then complied into one compound image using Autodesk’s Maya. The finished image, a head, then follows the mouse on the screen turning from side to side and looking up and down.

I don’t know how the program works, but I assume that it has to take the input from the mouse and then construct the newly exposed portion of the face. I like the potential for CGI that the Wikihumans project creates. While CGI is widely utilized in movies, the digital actor opens up new possibilities for bridging the world between animation and real life.

Link: http://gl.ict.usc.edu/Research/DigitalEmily2/

Alison Hoffman Looking Outward 2

For this post I looked at the work of Memo Akten. His series on Simple Harmonic Motion immediately stood out to me. His instillation at the Blenheim Palace, Simple Harmonic Motion for Light #11,in particular is rather fascinating. I admire how he uses something as abundant as light to create something so unique and complex. Memo uses a generated a simple harmony to create the movement of the light beams. While the mechanics are simple, the end product is nothing short of complex due to the natural properties of light. The harmonic motion is generated by an algorithm, but the refraction of light due to cloud coverage makes the work unpredictable.Memo used openFrameworks, a C++ ‘toolkit’, to create the algorithm for this piece.

SadieJohnson-Project02-VaribleFaces

variablefaces

/*
*Sadie Johnson
*15-104 Section C
*sajohnso@andrew.cmu.edu
*Project-02
*This program draws random faces
*/

var eyeWidth = 20;
var eyeHeight = 20;
var faceWidth = 100;
var faceHeight = 150;
var earSize = 30; 
var x = 10;
var lensSize = 40;
var hairWidth = 100;
var hairHeight = 100;
var mouthSize = 30;

function setup() {
    createCanvas(640, 480);
    g = color(120);
    b = color(120);
    
    //rgb colors for the hair 
    //i wanted to put them in  certain range
    h = color(10);
    i = color(15);
    j = color(20);
}

function draw() {
    //fill();
    background(234,237,216);
    //draw background triange
    fill(140, g, b, 127); //color  
    triangle(0, 0, 0, 480, 640, 480);

    //draw hair
    fill (h,i,j); //random hair color
    ellipse(width / 2, height / 2 - 30, hairWidth,  hairHeight);

    //draw ears
    fill (168, 133, 73);
    var earLX = width / 2 - faceWidth / 2
    var earRX = width / 2 + faceWidth / 2
    ellipse(earLX, height / 2 + x, earSize, earSize);
    ellipse(earRX, height / 2 + x, earSize, earSize);

    //draw face
    ellipse(width / 2, height / 2, faceWidth,  faceHeight);

    //draw eyes  
    fill(225);
    var eyeLX = width / 2 - faceWidth * 0.25;
    var eyeRX = width / 2 + faceWidth * 0.25;
    ellipse(eyeLX, (height/2) -5, eyeWidth, eyeHeight);
    ellipse(eyeRX, (height/2) -5, eyeWidth, eyeHeight);

     //draw glasses
     fill(140, g, b, 127); //color glasses 
     ellipse(eyeLX, height/2 + x, lensSize, lensSize);
     ellipse(eyeRX, height/2 + x, lensSize, lensSize);
     //noFill();
        //draw bridge of glasses
    var arcStart = (width/2) - (eyeWidth*.25)
    var arcFin = (width/2) + (eyeWidth*.25)
    line(arcStart, height/2, arcFin, height/2);

    //draw mouth
    fill(89,23,23);
    arc(width/2, height/2 + 40, mouthSize, mouthSize, 0, PI+QUARTER_PI, PIE);

    }

function mousePressed() {
    // when the user clicks, these variables are reassigned
    // to random values within specified ranges. For example,
    // 'faceWidth' gets a random value between 75 and 150.
    faceWidth = random(100, 175);
    faceHeight = random(100, 200);
        eyeWidth = random(10, 30);
    eyeHeight = random(10, 30);
    earSize = random(15,40);
    x = random(0,20);
    g = random(0,225);
    b = random(0,225);
     hairWidth = random(100,175);
 hairHeight = random(100,200);
    h = random(0,225);
    i = random(0,225);
    j = random(1,20);
    mouthSize = random(5,35);
    
}

The hardest part of this assignment by far was making sure that all of the features remained on the face- that is, that everything was controlled by interlocking variables and not “magic numbers”.

Generative Faces Project-02

I was trying to make the face resemble the style of characters from PowerPuff Girls and FairlyOdd Parents I really like the changing eye colors, which I did by replacing the g value in (r, g, b) with the variable eyeColor.

 

sketch index

//Arula Ratnakar
//Section C
//aratnaka@andrew.cmu.edu
//Generative Faces



var eyeSize = 20;
var faceWidth = 120;
var faceHeight = 150;
var pupil = 20//I said pupil but I meant iris
var mouth = 20
var hairWidth = 200
var hairHeight = 150
eyeColor = 7

function setup() {
    createCanvas(640, 480);
}
 
function draw() {
    background(170, 204, 235);
    noStroke ()
    ellipse (width /2, ((height/2)-20), hairWidth, hairHeight)//adds hair to the face
    fill (184, 151, 123)// colors the face
    ellipse(width / 2, height / 2, faceWidth,  faceHeight);
    fill (0)
    ellipse (width/2, ((height/2)-50), 70, 70)
    var eyeLX = width / 2 - faceWidth * 0.25;
    var eyeRX = width / 2 + faceWidth * 0.25;
    fill (255)
    ellipse(eyeLX, height / 2, eyeSize, eyeSize);
    ellipse(eyeRX, height / 2, eyeSize, eyeSize);
    fill (116,eyeColor, 183)
    ellipse (eyeRX, height /2, pupil, pupil)//adds right iris
    ellipse (eyeLX, height/2, pupil, pupil)//adds left iris
    fill(0)
    ellipse (eyeLX, height/2, pupil/2, pupil/2)//adds left pupil
    ellipse (eyeRX, height/2, pupil/2, pupil/2)//adds right pupil
    ellipse (width/2, 280, 30, mouth);//adds a mouth
   
}
 
function mousePressed() {
    faceWidth = random(100, 200);
    faceHeight = random(100, 160);
    eyeSize = random(20, 30);
    pupil = random (15, 20)
    mouth = random (1, 40)
    hairWidth = random (200, 350)
    eyeColor= random (1, 255)// changes the eyecolor


} 

JamesKatungyi-Project02-VariableFaces

jameskatungyi-project02-variablefaces

//James Katungyi
//Section A (Tuesdays 9:00)
//jkatungy@andrew.cmu.edu
//Project-02-Variable-Faces

var hairWidth = 240;
var hairHeight = 240;
var LEheight = 20;
var LEwidth = 60;
var REheight = 20;
var REwidth = 60;
var NoseWidth = 30;
var EyeBrowStartY = 305;
 
function setup() {
    createCanvas(480, 640);
    background(135);

}

function draw() {
    //hair
    fill(0);
    ellipse(width/2, 260, hairWidth, hairHeight);
    //face
    fill(175, 135, 0);
    stroke(110);
    strokeWeight(1);
    ellipse(width/2, height/2, 240, 320);
    //more hair
    fill(0);
    noStroke();
    ellipse(width/2, 200, 180, 90);
    //lashes
    stroke(0);
    strokeWeight(4);
    line(270, EyeBrowStartY, 330, 290); //Right brow
    line(210, EyeBrowStartY, 150, 290); //Left brow
    //eyes
    fill(222);
    ellipse(300, height/2, REwidth, REheight); //Right Eye
    ellipse(180, height/2, LEwidth, LEheight); //Left Eye
    fill(45);
    ellipse(300, height/2, 10); //Right pupil
    ellipse(180, height/2, 10); //Left pupil
    //nose
    stroke(240, 150, 0);
    strokeWeight(1);
    fill(200, 135, 0);
    ellipse(width/2, 350, NoseWidth, 60); //bridge
    ellipse(225, 372, 15); //right nostril
    ellipse(255, 372, 15); //left nostril
    //mouth
    stroke(0);
    strokeWeight(1);
    noFill(200, 135, 0);
    curveVertex(195, 400);
    curveVertex(210, 408);
    curveVertex(240, 415);
    curveVertex(270, 408);
    curveVertex(285, 400);
    endShape();
}
 
function mousePressed() {
    // when the user clicks, these variables are reassigned
    // to random values within specified ranges. For example,
    // 'faceWidth' gets a random value between 75 and 150.
    hairWidth = random(240, 360);
    hairHeight = random(240, 360);
    LEheight = random(10, 30);
    LEwidth = random(30, 60);
    REheight = random(10, 30);
    REwidth = random(30, 60);
    NoseWidth = random(20, 40);
    EyeBrowStartY = random(275, 305);
}

A sketch helped. The outcome was close… I had to tamper down initial ambitions.

variablefacedraft