For this project, I was inspired by the intricacies of different snowflakes. Each snowflake is made out of a pattern that repeats throughout the design of the snowflake. I first made an initial leg of a snowflake, and afterward I put them into a for loop to make them repeat in a circular pattern to replicate a snowflake.
Attached are two images that inspired two of my snowflake designs. I am very pleased with the final result and I think I made it just in time for Pittsburgh’s first snow!
//Angela Rubin
//Section C
//aerubin@andrew.cmu.edu
//Project-11-Playing with Turtles
//initial x and y positions of snowflakes
var x1 = 40;
var y1 = 10;
var x2 = 200;
var y2 = 50;
var x3 = 330;
var y3 = 50;
var x4 = 250;
var y4 = 200;
//velocities for snowflakes
var yvel1 = 1;
var yvel2 = .75;
var yvel3 = 1.5;
var yvel4 = .5;
function setup() {
createCanvas(400, 400);
}
function draw() {
background(148, 164, 183);
strokeJoin(MITER);
strokeCap(PROJECT);
//first snowflake on left
var turtle = makeTurtle(x1, y1); //initial position of snowflake
turtle.penDown();
turtle.setWeight(1);
turtle.setColor(255);
var ed1 = 5;
var ed2 = ed1 * 2;
var ed3 = ed1 * 3;
for (var i = 0; i < 6; i++) {
turtle.right(25);
turtle.forward(ed3-ed1);
turtle.left(115);
turtle.forward(ed1+(ed1/5)*3);
turtle.left(40);
turtle.forward(ed2);
turtle.right(40);
turtle.forward(ed1+ed1);
turtle.right(140);
turtle.forward(ed2);
turtle.left(140);
turtle.forward(ed2-ed1);
turtle.left(40);
turtle.forward(ed2-ed1);
turtle.right(75);
turtle.forward(ed2+ed1);
//after tip of snowflake
turtle.right(105);
turtle.forward(ed2+ed1);
turtle.right(75);
turtle.forward(ed2-ed1);
turtle.left(35);
turtle.forward(ed2-ed1);
turtle.left(140);
turtle.forward(ed2);
turtle.right(140);
turtle.forward(ed1+ed1);
turtle.right(40);
turtle.forward(ed2);
turtle.left(40);
turtle.forward(ed1+(ed1/5)*3);
turtle.left(115);
turtle.forward(ed3-ed1);
turtle.right(85);
}
turtle.penUp();
turtle.right(60);
turtle.forward(ed2);
for(var n = 0; n < 6; n++) {
turtle.penDown();
turtle.left(30);
turtle.forward(ed2-(ed1/5)*2);
turtle.right(60);
turtle.forward(ed2-(ed1/5)*2);
turtle.right(120);
turtle.forward(ed2-(ed1/5)*2);
turtle.right(60);
turtle.forward(ed2-(ed1/5)*2);
turtle.penUp();
turtle.right(90);
turtle.forward(20);
turtle.right(120);
}
//second snowflake in middle
var turtle2 = makeTurtle(x2, y2); //initial position of snowflake
turtle2.penDown();
turtle2.setWeight(2);
turtle2.setColor(255);
var s1 = 6;
var s2 = (s1 * 2)-2;
var s3 = s1 * 5;
for(a = 0; a < 4; a++) {
turtle2.forward(s3);
turtle2.back(s1);
turtle2.left(50)
turtle2.forward(s2)
turtle2.back(s2);
turtle2.right(110);
turtle2.forward(s2);
turtle2.back(s2);
turtle2.right(120);
turtle2.forward(s2+s1/3);
turtle2.left(130);
//start of inner diamond shape
turtle2.forward(s2);
turtle2.right(116);
turtle2.forward(s2);
turtle2.right(55);
turtle2.forward(s3-s2-s1);
turtle2.back(s3-s2-s1);
turtle2.back(s3);
turtle2.forward(s1);
turtle2.left(130);
turtle2.forward(s2);
turtle2.back(s2);
turtle2.left(100);
turtle2.forward(s2);
turtle2.back(s2);
turtle2.left(130);
turtle2.forward(s1);
turtle2.right(130);
turtle2.forward(s2+s1/2);
turtle2.back(s2+s1/2);
turtle2.right(100);
turtle2.forward(s2+s1/2);
turtle2.back(s2+s1/2);
turtle2.right(130);
turtle2.forward(s2+s2/1.3);
turtle2.left(120);
turtle2.forward(s2);
turtle2.right(110);
turtle2.forward(s2);
turtle2.right(55);
turtle2.forward(s2+s1/.8);
}
//third snowflake right
var turtle3 = makeTurtle(x3, y3); //initial position of snowflake
turtle3.setWeight(1);
turtle3.setColor(255);
var w1 = 5;
var w2 = w1*2;
var w3 = w1*7;
var w4 = w1*3;
var w5 = w1*4;
var w6 = w1*8;
var w7 = w1*6;
for (m = 0; m < 6; m++) {
turtle3.penUp();
turtle3.left(180);
turtle3.forward(w6);
turtle3.right(45); //changes closeness of petals
turtle3.penDown();
turtle3.forward(w2);
turtle3.right(90);
turtle3.forward(w2);
turtle3.left(110);
turtle3.forward(w4);
turtle3.right(65);
//tip of snowflake
turtle3.forward(w5);
turtle3.right(90);
turtle3.forward(w5);
turtle3.right(60);
turtle3.forward(w4);
turtle3.penUp();
turtle3.forward(w6);
}
//inner diamonds
turtle3.left(60);
turtle3.forward(w1);
turtle3.right(48);
for(var q = 0; q < 6; q++) {
turtle3.penDown();
turtle3.forward(w7);
turtle3.left(50);
turtle3.forward(w1);
turtle3.left(90);
turtle3.forward(w1);
turtle3.left(53);
turtle3.forward(w7);
turtle3.penUp();
turtle3.forward(w2+w1);
turtle3.left(120);
turtle3.forward(w2);
turtle3.right(11);
}
//fourth turtle (smaller version of first snowflake)
var turtle = makeTurtle(x4, y4); //initial position of snowflake
turtle.penDown();
turtle.setWeight(1);
turtle.setColor(255);
var ed1 = 4;
var ed2 = ed1 * 2;
var ed3 = ed1 * 3;
for (var i = 0; i < 6; i++) {
turtle.right(25);
turtle.forward(ed3-ed1);
turtle.left(115);
turtle.forward(ed1+(ed1/5)*3);
turtle.left(40);
turtle.forward(ed2);
turtle.right(40);
turtle.forward(ed1+ed1);
turtle.right(140);
turtle.forward(ed2);
turtle.left(140);
turtle.forward(ed2-ed1);
turtle.left(40);
turtle.forward(ed2-ed1);
turtle.right(75);
turtle.forward(ed2+ed1);
//after tip of snowflake
turtle.right(105);
turtle.forward(ed2+ed1);
turtle.right(75);
turtle.forward(ed2-ed1);
turtle.left(35);
turtle.forward(ed2-ed1);
turtle.left(140);
turtle.forward(ed2);
turtle.right(140);
turtle.forward(ed1+ed1);
turtle.right(40);
turtle.forward(ed2);
turtle.left(40);
turtle.forward(ed1+(ed1/5)*3);
turtle.left(115);
turtle.forward(ed3-ed1);
turtle.right(85);
}
turtle.penUp();
turtle.right(65);
turtle.forward(ed2+2);
//inner part of snowflake
for(var n = 0; n < 6; n++) {
turtle.penDown();
turtle.left(30);
turtle.forward(ed2-(ed1/5)*2);
turtle.right(60);
turtle.forward(ed2-(ed1/5)*2);
turtle.right(120);
turtle.forward(ed2-(ed1/5)*2);
turtle.right(60);
turtle.forward(ed2-(ed1/5)*2);
turtle.penUp();
turtle.right(90);
turtle.forward(15);
turtle.right(120);
}
//make snowflake 1 fall at rate of yvel1
y1+=yvel1;
//if snowflake falls beyond canvas, start again at the top
if (y1>height+40) {
y1 = 0;
}
//make snowflake 2 fall at rate of yvel2
y2+=yvel2;
//if snowflake falls beyond canvas, start again at the top
if (y2>height+40) {
y2 = 0;
}
//make snowflake 3 fall at rate of yvel3
y3+=yvel3;
//if snowflake falls beyond canvas, start again at the top
if (y3>height+40) {
y3 = 0;
}
//make snowflake 4 fall at rate of yvel4
y4+=yvel4;
//if snowflake falls beyond canvas, start again at the top
if (y4>height+40) {
y4 = 0;
}
//make the snow covered ground
fill(255);
ellipse(width/2, 400, 500, 200);
}
function turtleLeft(d) {
this.angle -= d;
}
function turtleRight(d) {
this.angle += d;
}
function turtleForward(p) {
var rad = radians(this.angle);
var newx = this.x + cos(rad) * p;
var newy = this.y + sin(rad) * p;
this.goto(newx, newy);
}
function turtleBack(p) {
this.forward(-p);
}
function turtlePenDown() {
this.penIsDown = true;
}
function turtlePenUp() {
this.penIsDown = false;
}
function turtleGoTo(x, y) {
if (this.penIsDown) {
stroke(this.color);
strokeWeight(this.weight);
line(this.x, this.y, x, y);
}
this.x = x;
this.y = y;
}
function turtleDistTo(x, y) {
return sqrt(sq(this.x - x) + sq(this.y - y));
}
function turtleAngleTo(x, y) {
var absAngle = degrees(atan2(y - this.y, x - this.x));
var angle = ((absAngle - this.angle) + 360) % 360.0;
return angle;
}
function turtleTurnToward(x, y, d) {
var angle = this.angleTo(x, y);
if (angle < 180) {
this.angle += d;
} else {
this.angle -= d;
}
}
function turtleSetColor(c) {
this.color = c;
}
function turtleSetWeight(w) {
this.weight = w;
}
function turtleFace(angle) {
this.angle = angle;
}
function makeTurtle(tx, ty) {
var turtle = {x: tx, y: ty,
angle: 0.0,
penIsDown: true,
color: color(128),
weight: 1,
left: turtleLeft, right: turtleRight,
forward: turtleForward, back: turtleBack,
penDown: turtlePenDown, penUp: turtlePenUp,
goto: turtleGoTo, angleto: turtleAngleTo,
turnToward: turtleTurnToward,
distanceTo: turtleDistTo, angleTo: turtleAngleTo,
setColor: turtleSetColor, setWeight: turtleSetWeight,
face: turtleFace};
return turtle;
}