//***************************************************************************** // Polyloop editor + subdivision, Jarek Rossignac, Oct 2005 //***************************************************************************** float back=0; // laplace back move int rec = 5; // recursion level int vn =6; // number of control vertices int svn =vn; // number of new vertices int cap=256; // size of control arrays int scap=cap*2*2*2*2*2; // size of derived array pt[] P = new pt [cap]; // control points pt[] SP = new pt [scap]; // derived points vec[] LP = new vec [cap]; // correcion vectors for the derived points vec[] SLP = new vec [scap]; // correcion vectors for the derived points boolean[] locked = new boolean [cap]; int bi=-1; // index of selected mouse-vertex, -1 if none selected pt Mouse = new pt(0,0); // current mouse position pt Last = new pt(0,0); // last point drawn // COLORS color soft = color(200, 200, 210); color red = color(200, 10, 10); color blue = color(10, 10, 200); color green = color(0, 150, 0); color black = color(10, 10, 10); color magenta = color(250, 150, 200); color brown = color(100, 50, 20); color yellow = color(250, 250, 20); boolean dots = true; // toggles display of mid-edge dots boolean numbers = true; // toggles display of vertex numberss boolean firstTime = false; boolean shade = false; boolean[] showCurve = new boolean [10]; void setup() { size(600, 600); strokeJoin(ROUND); strokeCap(ROUND); PFont font = loadFont("Courier-14.vlw"); textFont(font, 12); for (int i=0; i=0; i--) { if (showCurve[i]) {back=0.25*(i); stroke(0,back*200,200*(1.0-back)); fill(200*back,100,(1.0-back)*200); copyPts(); for (int j=0; j1) {subdivide(0.0);}; if (rec>2) {subdivide(-1.0); }; if (rec>3) {subdivide(-1.0); }; if (rec>4) {subdivide(-1.0); }; stroke(brown); strokeWeight(2); fill(140,190,100); drawNewCurve(); }; if (shade && showCurve[9]) { stroke(yellow); strokeWeight(3); beginShape(LINE_LOOP); for (int i=0; i10) { // if closest vertex is too far bd=600; // reinitilize distance squared for (int i=0; ibi; i--) {P[i+1].setFromPt(P[i]);}; // shift down the rest bi++; P[bi].setFromMouse(); vn++; // insert new vertex at mouse position println("inserted vertex "+bi); } else {bi=-1;}; // nothing selected }; } float d2(int j) {return (Mouse.disTo(P[j]));}; // squared distance from mouse to vertex P[j] float dm(int j) {return (Mouse.disTo(average(P[j],P[in(j)])));}; // squared distance from mouse to mid-edge point void mouseReleased() { // do this when mouse released if ( (bi!=-1) && P[bi].isOut() ) { // if outside of port for (int i=bi; i') {back+=.25; println("back = "+back); }; if (key=='<') {back-=.25; println("back = "+back); }; if (key=='+') {rec++; if (rec>5) {rec=5;}; println("rec = "+rec); }; if (key=='-') {rec--; if (rec<1) {rec=1;}; println("rec = "+rec); }; if (key=='f') {firstTime=!firstTime;}; if (key=='d') {dots=!dots;}; if (key=='n') {numbers=!numbers;}; if (key=='w') {writePts();}; if (key=='W') {writeNewPts();}; if (key=='s') {savePts();}; if (key=='S') {shade=!shade;}; if (key=='l') {loadPts();}; if (key=='i') { saveFrame("pix-####.tif");}; if (key=='a') { // axis aligns the edges for (int i=0; iabs(P[in(i)].y-P[i].y)) {float dy=(P[in(i)].y-P[i].y)/2; P[in(i)].y-=dy; P[i].y+=dy;} else {float dx=(P[in(i)].x-P[i].x)/2; P[in(i)].x-=dx; P[i].x+=dx;} }; }; if (key=='f') { float sx=width; float sy=height; float bx=0.0; float by=0.0; for (int i=0; ibx) {bx=P[i].x;}; if (P[i].xby) {by=P[i].y;}; if (P[i].y