- void UpdateLights() {
- for (int i=0; i<nNumRows ; i++) for (int j=0; j<nNumCols; j++) SetLight(i, j, 0);
- for (int i=0; i<picklist.size() ; i++) {
- Pick P = (Pick)picklist.get(i); SetLight(P.CurRow, P.CurCol, 3);
- }
- SetLight(82, 0, _XSym ? 3 : 0);
- SetLight(83, 0, _YSym ? 3 : 0);
- SetLight(84, 0, _ZSym ? 3 : 0);
- SetLight(85, 0, _RadSym ? 3 : 0);
-// SetLight(86, 0, _Horiz ? 3 : 0);
-// SetLight(87, 0, _Vert ? 3 : 0);
+class dVertex {
+ dVertex c0, c1, opp, same;
+ dTurn t0, t1;
+ dStrip s;
+ int dir, ci;
+
+ dVertex(dStrip _s, Point _p) { s = _s; ci = _p.index; }
+ Point getPoint(int i) { return s.s.points.get(dir>0 ? i : 15-i); }
+ void setOpp(dVertex _opp) { opp = _opp; dir = (ci < opp.ci ? 1 : -1); }
+}
+
+class dStrip {
+ dVertex v0, v1;
+ int row, col;
+ Strip s;
+ String desc() { return "r:" + row + " c:" + col + "i:" + floor(v0.ci/16); }
+ dStrip(Strip _s, int _i, int _row, int _col) { s = _s; row = _row; col = _col; }
+}
+//----------------------------------------------------------------------------------------------------------------------------------
+float PointDist(Point p1, Point p2) { return dist(p1.x,p1.y,p1.z,p2.x,p2.y,p2.z); }
+
+class dPixel { dVertex v; int pos; dPixel(dVertex _v, int _pos) { v=_v; pos=_pos; }}
+class dLattice {
+ private int iTowerStrips=0;
+
+ dStrip[] DS = new dStrip[glucose.model.strips.size()];
+ int[][] DQ = new int[NumBackTowers][MaxCubeHeight*2];
+ dStrip GetStrip (int row, int col, int off) {
+ return (!btwn(off,0,15) || !btwn(row,0,MaxCubeHeight*2-1) || !btwn(col,0,NumBackTowers-1) || DQ[col][row]<0) ? null :
+ DS[DQ[col][row]+off];
+ }
+
+ void addTurn(dVertex v0, int pos0, dVertex v1, int pos1) { dTurn t = new dTurn(pos0, v1, pos1); if (v0.t0 == null) v0.t0=t; else v0.t1=t; }
+ float Dist2 (Strip s1, int pos1, Strip s2, int pos2) { return PointDist(s1.points.get(pos1), s2.points.get(pos2)); }
+ boolean SameSame (Strip s1, Strip s2) { return max(Dist2(s1, 0, s2, 0), Dist2(s1,15, s2,15)) < 5 ; }
+ boolean SameOpp (Strip s1, Strip s2) { return max(Dist2(s1, 0, s2,15), Dist2(s1,15, s2,0 )) < 5 ; }
+ boolean SameBar (Strip s1, Strip s2) { return SameSame(s1,s2) || SameOpp(s1,s2); }
+ float PD2 (Point p1, float x, float y, float z) { return dist(p1.x,p1.y,p1.z,x,y,z); }
+ void AddJoint (dVertex v1, dVertex v2) {
+ // should probably replace parallel but further with the new one
+ if (v1.c0 != null && SameBar(v2.s.s, v1.c0.s.s)) return;
+ if (v1.c1 != null && SameBar(v2.s.s, v1.c1.s.s)) return;
+ if (v1.c0 == null) v1.c0 = v2;
+ else if (v1.c1 == null) v1.c1 = v2;