import processing.pdf.*; color nextshapeColor = color(210,210,190); color bkgndColor = color(255,255,240); color bluecolor = color(125,191,215); color yellowcolor = color(242,222,96); color greencolor = color(136,200,112); color ltgreencolor = color(216,228,123); color orangecolor = color(244,181,123); color[] colors; int screenWidth = 800; int screenHeight = 800; int nextshapeN = 7; network S, next; toolbar tools; float beta; float baseScaleDist = 0.012; void setup() { size(screenWidth,screenHeight); smooth(); textFont("Frutiger-Roman-9.vlw"); color[] foo = {darken(bkgndColor), bluecolor, greencolor, ltgreencolor, yellowcolor, orangecolor}; colors = foo; S = new network(baseScaleDist,0.5,colors[0]); next = nextshapeindicator(nextshapeN); // set up gui controls float[] pos = {10,10,screenWidth-20,30}; color gray1 = shift(bkgndColor,-0.1); color gray2 = darken(gray1); color gray3 = darken(gray2); tools = new toolbar(pos, 10); tools.addSlider("charge", "left", gray2, gray3, 0.01, 10); ((slider) tools.lastAdded()).logScale = true; ((slider) tools.lastAdded()).setVal(1.0); ((slider) tools.lastAdded()).backgroundColor = gray1; tools.addSlider("damping", "below", gray2, gray3, 0.01, 10); ((slider) tools.lastAdded()).logScale = true; ((slider) tools.lastAdded()).setVal(1.0); ((slider) tools.lastAdded()).backgroundColor = gray1; tools.addSlider("size", "left", gray2, gray3, 0.5, 2); ((slider) tools.lastAdded()).setVal(1.0); ((slider) tools.lastAdded()).quantize(0.1); ((slider) tools.lastAdded()).backgroundColor = gray1; tools.addSlider("color","below", gray2, gray3, 0, colors.length-1); ((slider) tools.lastAdded()).quantize(1); ((slider) tools.lastAdded()).showVal = false; ((slider) tools.lastAdded()).setPos(0); } void draw() { background(bkgndColor); tools.update(); S.chargeMultiplier = ((slider) tools.find("charge")).getVal(); beta = ((slider) tools.find("damping")).getVal(); S.constructionScaleDistance = baseScaleDist * ((slider) tools.find("size")).getVal(); // apply color slider color col = colors[round(((slider) tools.find("color")).getVal())]; S.basecolor = col; if (next.nfaces>0) {next.faces[0].normalcolor = col;} ((slider) tools.find("color")).backgroundColor = lighten(col); S.update(); S.draw(); if (nextshapeN > 0) { next.update(); next.draw(); } annotate(); } void mousePressed() { boolean captured = tools.offerMousePress(); if ((!captured) && (!S.over())) { if (nextshapeN > 0) { if (keyPressed && ((keyCode==CONTROL) || (keyCode==157))) { S.addPolygonFamily(scr2x(mouseX),scr2y(mouseY), nextshapeN); } else { S.addPolygon(scr2x(mouseX), scr2y(mouseY), nextshapeN, S.assigncolor(nextshapeN)); } } } } void mouseReleased() { S.onmouserelease(); } void keyPressed() { String codes = "234567890-="; int n = codes.indexOf(key); if (n>=0) { nextshapeN = n+2; next = nextshapeindicator(nextshapeN); } else if (key=='1') { nextshapeN = 0; } else if (key=='r') { if (nextshapeN > 0) { droprandomshape(nextshapeN); } } else if (key=='s') { beginRecord(PDF,"springypoly-#####.pdf"); background(bkgndColor); S.draw(); endRecord(); } else if ((keyCode==DELETE) || (keyCode==BACKSPACE)) { S.ondeletekey(); nextshapeN = 0; } else if ((key=='`') || (keyCode=='c')) { S.onescapekey(); } } float x2scr(float x) {return (screenWidth * x);} float y2scr(float y) {return screenWidth * (1-y);} float scr2x(float sx) {return sx/(float)screenWidth;} float scr2y(float sy) {return 1-sy/(float)screenWidth;} network nextshapeindicator(int N) { network nsi = new network(0.15/N,0,S.basecolor); nsi.addPolygon(0.9,0.92,N,S.basecolor); return nsi; } void droprandomshape(int N) { float rmin = 2*S.constructionScaleDistance/sqrt(2*(1-cos(TWO_PI/N))); square R = findbiggesthole(S, new square(0.5,0.5,0.3), rmin); if (R.r>0) { float x = random(R.x-R.r+rmin,R.x+R.r-rmin); float y = random(R.y-R.r+rmin,R.y+R.r-rmin); S.addPolygon(x,y,nextshapeN, S.assigncolor(nextshapeN)); } } void annotate() { if ((round(((slider) tools.find("color")).getVal()) == 0) && (nextshapeN>0)) { fill(0); textAlign(CENTER); text("auto\ncolor",screenWidth*0.9,screenHeight*0.08); } fill(darken(darken(bkgndColor))); textAlign(LEFT); textLeading(11); textSize(9); float[] unocc = tools.unoccupied(); String info = "click to drop a shape onto the canvas. press a number to choose the next one."; info += "\n" + "vertices can be dragged, but be gentle."; info += "\n\n" + "to delete vertices, click them & hit delete; C clears the selection."; info += "\n" + "for fun, hold down R, or open-apple (mac) or alt (pc) while clicking things."; text(info, unocc[0]+20, 30); }