//***************************************************************************** // Polyloop editor + Js refinement, Jarek Rossignac, Feb 2007 //***************************************************************************** color red, yellow, green, cyan, blue, magenta, dred, dyellow, dgreen, dcyan, dblue, dmagenta, white, black, orange, grey, metal; Polyloop C = new Polyloop(), R = new Polyloop(), U = new Polyloop(), S = new Polyloop(); // control, retrofit, and subdivided polyloops Polyloop [] CC = new Polyloop[10]; pt pmouse = new pt(0,0); // remembers where mouse was pressed for translations pt closest = new pt(0,0); // tracks closest point on control polyloop boolean showHelpText=true, showMenu=false, showVertexIds=false, showVertices=true, showAll=false, showJspline=false, fillCurve=true, openLoop=false, showControl=true, showResampled=false, animating=false; String [] fn= {"C0.pts","C1.pts","C2.pts","C3.pts","C4.pts","C5.pts"}; // names of files with control loops int fni=0; // pointer to the next file to load String lastRead=fn[fni]; float Carea=0, Clength=0, Sarea=0, Slength=0; float nrv=150; // number of vertices on resampled curve U boolean debug=false; boolean ctrl=false; // CONTROL is pressed int animationIndex=0; void setup() { size(600, 600); smooth(); colorMode(HSB,121); strokeJoin(ROUND); strokeCap(ROUND); PFont font = loadFont("Courier-14.vlw"); textFont(font, 12); red = color(0, 120, 120); yellow = color(20, 120, 120); green = color(40, 120, 120); cyan = color(60, 120, 120); blue = color(80, 120, 120); magenta = color(100, 120, 120); dred = color(0, 120, 60); dyellow = color(20, 120, 60); dgreen = color(40, 120, 60); dcyan = color(60, 120, 60); dblue = color(80, 120, 60); dmagenta = color(100, 120, 60); white = color(0, 0, 120); black = color(0, 120,0); grey = color(0, 120,60); orange = color(10, 100, 120); metal = color(70, 60, 100); C.reset(4); // makes control loop of 6 vertices in a circle // C.empty(); C.appendPt(new pt(0,0)); C.appendPt(new pt(width/2,0)); C.appendPt(new pt(width/2,height/2)); C.appendPt(new pt(0,height/2)); } void draw() { background(121); strokeWeight(2); noFill(); if (showHelpText) { showHelp(); } else { if ((mousePressed)&&(mouse().isInWindow())&&(keyPressed)) { if (key=='t') C.translateBy(new vec(mouseX-pmouseX,mouseY-pmouseY )); if ((key=='e')||(keyCode==CONTROL)) {C.barycenter(); C.move(new pt(pmouseX,pmouseY), new vec(mouseX-pmouseX,mouseY-pmouseY));}; if (key=='z') C.scaleBy( C.P[C.p].disTo(mouse()) / C.P[C.p].disTo(pmouse()) ); if (key=='Z') C.scaleByG( C.P[C.p].disTo(mouse()) / C.P[C.p].disTo(pmouse()) ); if (key=='r') C.rotateBy( angle( C.P[C.p].makeVecTo(mouse()) , C.P[C.p].makeVecTo(pmouse()) ) ); if (key=='R') C.rotateByG( angle( C.G.makeVecTo(mouse()) , C.G.makeVecTo(pmouse()) ) ); if (key=='a') C.dragVertex(pmouse().makeVecTo(mouse())); if (key=='q') {C.dragVertex(pmouse().makeVecTo(mouse())); for(int i=0; i<10; i++) {C.computeL2(); C.applyLaround(150);};}; } else { if ((mousePressed)&&(mouse().isInWindow())&&(!keyPressed)) {C.dragVertex(pmouse().makeVecTo(mouse()));} else if ((!mousePressed)&&(mouse().isInWindow())&&(keyPressed)) { if (key=='f') {C.pickClosestVertex(mouse()); C.computeL2(); C.applyLhere(100);}; }; }; if(showControl) { stroke(metal); fill(yellow); C.drawCurve(); noFill(); if( showVertices) C.drawVertices(); pt CM = C.barycenter(); float m = C.moment(CM); float r = sqrt(sqrt(m/PI*2.)); float a=C.area(); fill(black); text("area="+abs(a/sq(height)*4)+", moment="+m/sq(sq(height))*16+" disk area="+PI*r*r/sq(height)*4+" and radius="+r/height*2,40,20); noFill(); stroke(red); CM.showCross(3); CM.show(r); fill(red); C.P[C.p].show(3); noFill(); noStroke(); closest=C.project(mouse()); fill(green); closest.show(2); noFill(); if (showVertexIds) {fill(dblue); C.drawVertexIDs(); noFill();}; if (C.contains(mouse())) fill(orange); else fill(cyan); mouse().show(5); noFill(); }; }; } void mousePressed() { pmouse=mouse(); if (mouse().isInWindow()) { if (!keyPressed) C.pickClosestVertex(mouse()); else { if (key=='q') C.pickClosestVertex(mouse()); if (key=='a') C.grabInsert(mouse()); if (key=='d') { C.pickClosestVertex(mouse()); C.delete();} } } } void keyReleased() {ctrl=false; }; void keyPressed() { if (key=='1') C.setTo(CC[1]); if (key=='2') C.setTo(CC[2]); if (key=='3') C.setTo(CC[3]); if (key=='4') C.setTo(CC[4]); if (key=='5') C.setTo(CC[5]); if (key=='6') C.setTo(CC[6]); if (key=='7') C.setTo(CC[7]); if (key=='8') C.setTo(CC[8]); if (key=='9') C.setTo(CC[9]); if (key=='0') C.setTo(CC[0]); if (key=='!') CC[1].setTo(C); if (key=='@') CC[2].setTo(C); if (key=='#') CC[3].setTo(C); if (key=='$') CC[4].setTo(C); if (key=='%') CC[5].setTo(C); if (key=='^') CC[6].setTo(C); if (key=='&') CC[7].setTo(C); if (key=='*') CC[8].setTo(C); if (key=='*') CC[9].setTo(C); if (key==')') CC[0].setTo(C); if (key==' ') showHelpText=!showHelpText ; if (key=='c') C.coarsen(); if (key=='C') {R.setAsResampled(C,C.vn/2); C.setTo(R); }; if (key=='S') C.refine(0); if (key=='W') {C.savePts(); fni=0; } if (key=='G') {C.loadPts(); println("Loaded file "+fni+" = "+fn[fni]); fni++; println(fni); if(fni>=fn.length) fni=0;} if (key=='X') {String S=" "+"-####.tif"; saveFrame(S);}; ; if (key=='F') C.frame(); if (key=='+') C.align(); if (key=='V') showVertices=!showVertices; };