+ return random(2) < 1 ? new dPixel(v,pos) : new dPixel(v.opp,15-pos);
+ }
+
+ dLattice() {
+ lattice=this;
+ //for (int i=0;i<NumBackTowers;i++) for (int j=0;j<MaxCubeHeight*2;j++) DQ[i][j]=-1;
+
+ int col = 0, row = -2, i=-1;
+ for (Strip strip : glucose.model.strips ) { i++;
+ if (i % 16 == 0) row+=2;
+ if (row >= MaxCubeHeight*2-1) { col++; row = (col%2==1)?1:0; } // only include lattice parts!
+ iTowerStrips++;
+ dStrip s = DS[iTowerStrips-1] = new dStrip(strip, iTowerStrips-1, row, col);
+ s.v0 = new dVertex(s,strip.points.get(0 ));
+ s.v1 = new dVertex(s,strip.points.get(15));
+ s.v0.setOpp(s.v1); s.v1.setOpp(s.v0);
+ //if (col < NumBackTowers) DQ[col][row] = 16*floor((iTowerStrips-1)/16);
+ //else s.row=-1;
+ }
+
+ for (int j=0; j<iTowerStrips; j++) { for (int k=j+1; k<iTowerStrips; k++) {
+ dStrip s1 = DS[j], s2 = DS[k];
+ int c=0;
+ if (sameSame(s1.s,s2.s)) { s1.v0.same = s2.v0; s1.v1.same = s2.v1;
+ s2.v0.same = s1.v0; s2.v1.same = s1.v1; continue; } // parallel
+ if (sameOpp (s1.s,s2.s)) { s1.v0.same = s2.v1; s1.v1.same = s2.v0;
+ s2.v0.same = s1.v1; s2.v1.same = s1.v0; continue; } // parallel
+ if (dist2(s1.s, 0, s2.s, 0) < 5) { c++; addJoint(s1.v1, s2.v0); addJoint(s2.v1, s1.v0); }
+ if (dist2(s1.s, 0, s2.s,15) < 5) { c++; addJoint(s1.v1, s2.v1); addJoint(s2.v0, s1.v0); }
+ if (dist2(s1.s,15, s2.s, 0) < 5) { c++; addJoint(s1.v0, s2.v0); addJoint(s2.v1, s1.v1); }
+ if (dist2(s1.s,15, s2.s,15) < 5) { c++; addJoint(s1.v0, s2.v1); addJoint(s2.v0, s1.v1); }
+ if (c>0) continue;
+
+ // Are they touching at all?
+ int pos1=0, pos2=0; float d = 100;
+
+ while (pos1 < 15 || pos2 < 15) {
+ float oldD = d;
+ if (pos1<15) { float d2 = dist2(s1.s, pos1+1, s2.s, pos2+0); if (d2 < d) { d=d2; pos1++; } }
+ if (pos2<15) { float d2 = dist2(s1.s, pos1+0, s2.s, pos2+1); if (d2 < d) { d=d2; pos2++; } }
+ if (d > 50 || oldD == d) break ;
+ }
+
+ if (d>5) continue;
+ addTurn(s1.v0, pos1, s2.v0, pos2); addTurn(s1.v1, 15-pos1, s2.v0, pos2);
+ addTurn(s2.v0, pos2, s1.v0, pos1); addTurn(s2.v1, 15-pos2, s1.v0, pos1);
+
+ }}