/* spirograph */ void setup () { size (800, 600); background(0); noStroke(); noFill(); colorMode(HSB, 100); } float innerspeed; float outerspeed; float innerlength; float outerlength; float innersym; float pointwidth; float pointlength; float point2width; float point2length; float point3width; float point3length; int pointtype; int colortype; float randColor; int innerlengthtype; boolean rerotate; boolean doLine; boolean doublePoint; void draw () { if (frameCount == 1) {initvars();} noStroke(); translate (400, 300); colorPoint(frameCount); rotate (radians(frameCount*innerspeed)); translate (varinnerlength(innerlength, frameCount*innerspeed), 0); // ellipse(0,0,4,4); rotate (radians(frameCount*outerspeed)); if (doLine) { stroke(frameCount%100,100,100); line (0,0, outerlength,0); } else { translate (outerlength, 0); if (rerotate) { rotate (-1*(radians(frameCount*outerspeed))); rotate (-1*(radians(frameCount*innerspeed))); } drawpoint(); if (rerotate) { rotate (radians(frameCount*innerspeed)); rotate (radians(frameCount*outerspeed)); } translate (outerlength * -1, 0); if (doublePoint) { translate (outerlength* -1, 0); if (rerotate) { rotate ((radians(frameCount*outerspeed))); rotate ((radians(frameCount*innerspeed))); } drawpoint(); if (rerotate) { rotate (-1* radians(frameCount*innerspeed)); rotate (-1 *radians(frameCount*outerspeed)); } translate (outerlength, 0); } } rotate (radians(frameCount*outerspeed*-1)); translate (varinnerlength(innerlength, frameCount*innerspeed) * -1, 0); rotate (radians(frameCount*innerspeed*-1)); // } } float varinnerlength (float baselength, float angle) { if (innerlengthtype == 0) { return baselength; } else if (innerlengthtype == 1) { return (baselength * sin(radians(angle*innersym)) ); } else if (innerlengthtype == 2) { return abs (baselength * sin(radians(angle*innersym))); } else { return (baselength * (sin(radians(angle*innersym)) + cos(radians(angle)))); } } float speedgen () { float tempspeed; tempspeed = int(random(-50,50)); tempspeed = tempspeed/10; while (tempspeed < .1 && tempspeed > -.1) { tempspeed = speedgen(); } return tempspeed; } void initvars () { doLine = (round(random(0,3)) == 1); doublePoint = (round(random(0,1)) == 1); innerspeed = speedgen(); outerspeed = speedgen(); while ((abs(innerspeed) - abs(outerspeed) < .2) && (abs(innerspeed) - abs(outerspeed) > -.2)) { outerspeed = speedgen(); } innerlength = floor(random(10,200)); outerlength = floor(random(200-innerlength,200)); innersym = ceil(random(0,10)); innersym = innersym/2; pointwidth = floor (random(2,10)); pointlength = floor (random(5,50)); pointtype = floor (random(0,3)); point2width = floor (random(5, 50)); point2length = floor(random(5,50)); point3width = floor(random(5,50)); point3length = floor(random(5,50)); colortype = floor (random(0,4)); randColor = random(0,100); innerlengthtype = floor(random(0,4)); rerotate = (random(0,5) < 1); } void drawpoint () { if (pointtype == 0) { rect(-1*(.5*pointwidth),-1*(.5*pointlength),pointwidth,pointlength); } else if (pointtype == 1) { ellipse(-1*(.5*pointwidth),-1*(.5*pointlength),pointwidth,pointlength); } else if (pointtype == 2){ triangle(pointwidth, pointlength, point2width, point2length, point3width, point3length); } else if (pointtype == 3) { line (0,0, 400, 300); } } void mousePressed () { noLoop(); fill(0); rect(-400,-300,800,600); initvars(); loop(); } void colorPoint (int i) { if (colortype == 0) { fill (i%100,100,100); noStroke(); } else { if (colortype == 1) { fill (i%100,100, 100); stroke((i+50)%100, 80, 80); } else { if (colortype == 2) { noFill(); stroke(randColor,20,100); } else { fill (randColor, abs(sin(radians(i))*100), 100); noStroke(); } } } }