Kit Kat Klock
// Kit Kat Klock - Jim Bumgardner
// @pjs font="Limelight";
PFont font;
int fontOffset = 24; // compensates for vertical offset bug in google font rendering
// set to zero if using vlw font
void setup()
{
size(200,500);
smooth();
font = createFont("Limelight",48);
textFont(font, width*.12);
}
void draw()
{
float clockRadX = width*.4;
float clockRadY = width*.5;
background(255);
float msa = (millis() % 2000)*TWO_PI/2000; // Position of tail and eyes in cycle
float am = map(minute()+second()/60.0,0,60,0,TWO_PI); // angle of minute hand, from 12
float ah = map(hour()+minute()/60.0,0,24,0,TWO_PI*2); // angle of hour hand, from 12
float mLen = width*.3; // length of hands (m,s,h)
float hLen = width*.2;
pushMatrix();
translate(width/2,height/2); // Much simpler if we translate to the center of the screen
// Draw Head
fill(0);
stroke(0);
strokeWeight(1);
// Head Center
pushMatrix();
translate(0, -width*.8);
// Head
ellipse(0, 0, width*.7, width*.6);
// Whiskers
stroke(0);
strokeWeight(4);
float wLen = width*.4;
for (int i = 0; i < 3; ++i) {
float a = radians(10 + 5*i);
line(0,0, cos(a)*wLen, sin(a)*wLen);
line(0,0, cos(PI-a)*wLen, sin(PI-a)*wLen);
}
// Muzzle
fill(255);
stroke(0);
strokeWeight(2);
arc(0, 0, width*.68, width*.58, 0, PI);
fill(0);
// Cheeks
ellipse(-width*.175, 0, width*.35, width*.1);
ellipse( width*.175, 0, width*.35, width*.1);
// Nose
ellipse( 0, 0, width*.2, width*.18);
// Mouth
strokeWeight(3);
noFill();
arc(0, 0, width*.4, width*.35, PI/5, 4*PI/5);
strokeWeight(1);
fill(0);
// Ears
beginShape();
vertex(-width*.35,0);
vertex(-width*.325,-width*.34);
vertex(0,-width*.2);
vertex(width*.325,-width*.34);
vertex(width*.35,0);
endShape(CLOSE);
// Eyes
float xd = sin(msa)*width*.05;
for (int i = 0; i < 2; ++i) {
pushMatrix();
translate((width*.16) * (i==0?-1:1), -width*.1);
fill(255);
ellipse(0, 0, width*.24, width*.24);
fill(0);
beginShape();
curveVertex( xd/2, -width*.09 );
curveVertex( xd/2, -width*.09 );
curveVertex( xd-5, 0 );
curveVertex( xd/2, width*.09 );
curveVertex( xd+5, 0 );
curveVertex( xd/2, -width*.09 );
curveVertex( xd/2, -width*.09 );
endShape();
popMatrix();
}
popMatrix(); // end head
// Tail
strokeWeight(20);
stroke(0);
pushMatrix();
rotate(radians(sin(msa)*6));
beginShape();
for (int i = 0; i < 10; ++i)
curveVertex(sin(i*TWO_PI/10.0)*10,i*height*.55/10);
endShape();
popMatrix();
strokeWeight(1);
// Clock Body
fill(0);
ellipse(0,0,clockRadX*2.1, clockRadY*2.1);
noFill();
stroke(255);
strokeWeight(4);
ellipse(0,0,clockRadX*2, clockRadY*2);
fill(0);
strokeWeight(1);
// Hour markers
fill(255);
textAlign(CENTER, CENTER);
for (int i = 0; i < 12; ++i) {
float a = radians(i*30);
text(i==0? 12 : i, sin(a)*clockRadX*.8, fontOffset-cos(a)*clockRadY*.8);
}
// Minute hand
fill(255,0,0);
strokeWeight(.25);
stroke(128);
pushMatrix();
rotate(am);
triangle(-5,10,0,-mLen,5,10); // draw as if it's at noon, rotation takes care of the rest
popMatrix();
// Hour hand
pushMatrix();
rotate(ah);
triangle(-5,10,0,-hLen,5,10); // draw as if it's at noon, rotation takes care of the rest
popMatrix();
// Bow Tie
pushMatrix();
translate(0, -width*.5);
fill(255,255,0);
stroke(0);
strokeWeight(2);
quad(-width*.2,-width*.07, 0, -width*.04,
0, width*.04, -width*.2, width*.07);
quad( width*.2,-width*.07, 0, -width*.04,
0, width*.04, width*.2, width*.07);
ellipse(0,0,width*.12, width*.12);
fill(0);
popMatrix();
popMatrix();
}