//********************************** //*** corners tools // Written by Jarek Rossignac, June 2006 //********************************** void left() {if(l(c)!=-1) {c=l(c);};}; void right() {if(r(c)!=-1) {c=r(c);};}; void back() {if(o(c)!=-1) {c=o(c);};}; int t (int c) {int r=int(c/3); return(r);}; int n (int c) {int r=3*int(c/3)+(c+1)%3; return(r);}; int p (int c) {int r=3*int(c/3)+(c+2)%3; return(r);}; int v (int c) {return(V[c]);}; int o (int c) {return(O[c]);}; int l (int c) {return(o(n(c)));}; int r (int c) {return(o(p(c)));}; int w (int c) {return(W[c]);}; // temporary indices to mid-edge vertices associated with corners during subdivision boolean border (int c) {return((O[c]==-1)||(nb(c)&&(skeleton[t(c)]!=skeleton[t(o(c))])));}; // returns true if corner has no opposite boolean nb(int c) {return(O[c]!=-1);}; pt g (int c) {return(G[V[c]]);}; // shortcut to get the point of the vertex v(c) of corner c void writeCorner (int c) { println("c="+c+", n="+n(c)+", p="+p(c)+", o="+o(c)+", v="+v(c)+", t="+t(c)+", EdgeBreaker symbol="+triangleSymbol[t(c)]+"."); }; pt cg(int c) {pt cPt = midPt(g(c),midPt(g(c),triCenter(t(c)))); return(cPt); }; // computes point at corner void showCorner(int c, int r) {pt cPt = midPt(g(c),midPt(g(c),triCenter(t(c)))); cPt.show(r); }; // renders corner c as small ball void showCornerAndNormal(int c, int r) {pt cPt = midPt(g(c),midPt(g(c),triCenter(t(c)))); noStroke(); cPt.show(r); stroke(magenta); vec N = Nt[t(c)].make(); N.makeUnit(); N.mul(10*r); N.show(cPt);}; // renders corner c as small ball void drawEdge(int c) {line(g(p(c)).x,g(p(c)).y,g(p(c)).z,g(n(c)).x,g(n(c)).y,g(n(c)).z); }; // draws edge of t(c) opposite to corner c void computeOnaive() { // sets the O table from the V table, assumes consistent orientation of triangles for (int i=0; i<3*nt; i++) {O[i]=-1;}; // init O table to -1: has no opposite (i.e. is a border corner) for (int i=0; i<3*nt; i++) { for (int j=i+1; j<3*nt; j++) { // for each corner i, for each other corner j if( (v(n(i))==v(p(j))) && (v(p(i))==v(n(j))) ) {O[i]=j; O[j]=i;};};}; // make i and j opposite if they match }; void computeO() { int nIC [] = new int [maxnv]; // number of incident corners // println("COMPUTE O: nv="+nv +", nt="+nt +", nc="+nc ); int maxValence=0; for (int c=0; cmaxValence) {maxValence=nIC[v]; };}; println(" Max valence = "+maxValence+". "); int IC [][] = new int [maxnv][maxValence]; // incident corners for (int v=0; v hl="+hl); }; }; for (int t=lnt; t