/** A Koch snowflake under your control, dancing a slightly nauseating dance. */ PFont font; float[][] snowflake; float flakeRotation; float flakeSize; //----------------------------- void setup(){ size(300,300); framerate(15); smooth(); //colorMode(HSB); flakeRotation = 0f; flakeSize = 0f; // the snowflakes first and last vertex must be doubly specified // i.e. a simple triangle have 4 vertices snowflake = generateTriangle(); scaleSnowflake(snowflake, 90f); snowflake = subdivideSnowflake(snowflake, 3, 0.5f); background(0); } //----------------------------- void draw(){ noStroke(); fill(0,80); rect(0,0,width,height); float d = dist(width/2,height/2,mouseX,mouseY); float desiredRot = -atan2(mouseY-height/2,mouseX-width/2); float rotDiff = desiredRot-flakeRotation; if( rotDiff > PI ) rotDiff -= TWO_PI; if( rotDiff < -PI ) rotDiff += TWO_PI; flakeRotation += constrain( rotDiff*0.02, -1f,1f); flakeSize += (d-flakeSize)*0.01; snowflake = generateTriangle(); scaleSnowflake(snowflake, flakeSize); rotateSnowflake(snowflake, flakeRotation); snowflake = subdivideSnowflake(snowflake, (int)(flakeSize/20) , (flakeSize%20f)/20); drawSnowflake(snowflake, color(0,255,0), color(0,255,0,16) ); } //----------------------------- void keyPressed(){ } //----------------------------- float[][] generateTriangle(){ float[][] sf = new float[4][2]; sf[0] = new float[]{ 1f,0f }; sf[1] = new float[]{ cos(TWO_PI/3),sin(TWO_PI/3) }; sf[2] = new float[]{ cos(-TWO_PI/3),sin(-TWO_PI/3) }; sf[3] = new float[]{ 1f,0f }; return sf; } //----------------------------- void drawSnowflake(float[][] snowflake, color strokeColor, color fillColor){ translate(width/2,height/2); stroke( strokeColor ); fill( fillColor ); beginShape(POLYGON); for( int i=0;i5){ subdivs = 5; s = 1f; } for( int i=1;i<=subdivs;i++ ){ if(i==subdivs) snowflake = singleSubdivideSnowflake(snowflake, s); else snowflake = singleSubdivideSnowflake(snowflake, 1f); } return snowflake; } //----------------------------- float[][] singleSubdivideSnowflake(float[][] snowflake, float s){ float[][] newflake = new float[(snowflake.length-1)*4+1][2]; float x,y; for( int i=0;i