// Corner table representation and operations for triangle meshes // Written by Jarek Rossignac on October 1, 2005, revised on October 5. int nv = 7; // number of vertices int nt = 6; // umber of tirangles int maxnv = 100; // max number of vertices int maxnt = 200; // max number of triangles pt[] G = new pt [maxnv]; // vertices vec[] D = new vec [maxnv]; // vertex corrction vectors int [] valence = new int [maxnv]; // vertices valence boolean [] isBorder = new boolean [maxnv]; corner[] C = new corner [3*maxnt]; // corner table corner border = new corner(-1,0); // border identifier int cc = 0; // corner counter corner c; int bi=-1; // index of selected vertex, -1 if none selected pt Mouse = new pt(0,0); // current mouse position color grey = color(200, 200, 210); color red = color(200, 10, 10); color blue = color(10, 10, 200); color lightblue = color(100, 100, 255); color green = color(10, 200, 20); color black = color(10, 10, 10); color magenta = color(250, 150, 200); color brown = color(150, 100, 50); color banana = color(100, 255, 50); void setup() { size(700, 700); for (int i=0; i30) { bi=-1;} // if closest vertex is too far }; float d2(int j) {return (Mouse.disTo(G[j]));}; // squared distance from mouse to vertex P[i] //float dm(int j) {return (Mouse.vecToMid(G[j],G[in(j)]).norm());}; void mouseReleased() { // do this when mouse released bi= -1; }; //********************************** //*** CONTROL WITH KEYS //********************************** void keyPressed() { if (key=='C') { cc=3*nt; nt++; C[cc]= new corner(cc,c.p.v); cc++; C[cc]= new corner(cc,c.n.v); cc++; G[nv]=G[c.n.v].make(); G[nv].addVec(G[c.v].vecTo(G[c.p.v])); C[cc]=new corner(cc,nv++); C[cc].o=c; c.o=C[cc]; c=C[cc]; cacheCorners(); }; if (key=='L') { cc=3*nt; nt++; C[cc]= new corner(cc,c.p.v); cc++; C[cc]= new corner(cc,c.n.v); c = c.p; while (c.o!=border) {c=c.o.p;}; cc++; C[cc]=new corner(cc,c.n.v); c=C[cc]; cacheCorners(); }; if (key=='R') { cc=3*nt; nt++; C[cc]= new corner(cc,c.p.v); cc++; C[cc]= new corner(cc,c.n.v); c = c.n; while (c.o!=border) {c=c.o.n;}; cc++; C[cc]=new corner(cc,c.p.v); c=C[cc]; cacheCorners(); }; if (key=='g') {loadVertices(); loadTriangles(); cacheCorners();}; if (key=='s') {saveVertices(); saveTriangles();}; if (key=='f') { float sx=600.0; float sy=600.0; float bx=0.0; float by=0.0; for (int i=0; ibx) {bx=G[i].x;}; if (G[i].xby) {by=G[i].y;}; if (G[i].y