N[2].set(40 ,100,100,2 ,15 ,2 ,180);
N[3].set(60 ,100,100,2 ,15 ,1.5,270); pSharp.set(.5); break; // spark
}
-
- DG.UpdateLights();
}
for (int i=0; i<_ND; i++) if (N[i].Active()) {
}
void StartPattern() { zTheta=0; }
+
+ int KeyPressed = -1;
+ boolean noteOn(Note note) {
+ int row = note.getPitch(), col = note.getChannel();
+ if (row == 57) {KeyPressed = col; return true; }
+ return super.noteOn(note);
+ }
+
void StartRun(double deltaMs) {
t = lx.tempo.rampf();
amp = pAmp.Val();
w.move(deltaMs); if (w.bDone) waves.remove(i); else i++;
}
- if ((t<LastBeat && !pKey.b) || DG.KeyPressed>-1) {
+ if ((t<LastBeat && pShape.Cur()!=14) || KeyPressed>-1) {
waves.add(new rWave(
- pKey.b ? map(DG.KeyPressed,0,7,0,1) : random(1), // location
+ KeyPressed>-1 ? map(KeyPressed,0,7,0,1) : random(1), // location
bnc*10, // bounciness
7, // velocity
2*(1-amp))); // dampiness
- DG.KeyPressed=-1;
+ KeyPressed=-1;
if (waves.size() > 5) waves.remove(0);
}
case 12: return lx.hsb(lxh() + noise(Pn.x,Pn.y,Pn.z + (NoiseMove+50000)/1000.)*200,
85,c1c(Pn.y < noise(Pn.x + NoiseMove/2000.,Pn.z)*(1+amp)-amp/2.-.1 ? 1 : 0)); // noise
- case 13: float y=0; for (rWave w : waves) y += .5*w.val(Pn.x);
+ case 13:
+ case 14: float y=0; for (rWave w : waves) y += .5*w.val(Pn.x); // wave
V.set(Pn.x, .7+y, Pn.z);
break;
boolean isDone () { return pos==posStop; }
boolean atDest () { return vCur.s==vDest.s ||
- PointDist(vCur.getPoint(0), vDest.getPoint(0)) < 12 ||
- PointDist(vCur.getPoint(0), vDest.getPoint(15))< 12;}
- void setCur (dVertex _v, int _p) { p2=null; vCur=_v; pos=_p; PickNext(); }
+ pointDist(vCur.getPoint(0), vDest.getPoint(0)) < 12 ||
+ pointDist(vCur.getPoint(0), vDest.getPoint(15))< 12;}
+ void setCur (dVertex _v, int _p) { p2=null; vCur=_v; pos=_p; pickNext(); }
void setCur (dPixel _p) { setCur(_p.v, _p.pos); }
void setNext (dVertex _v, int _p, int _s) { vNext = _v; posNext = _p<<12; posStop = _s<<12; }
void setDest (dVertex _v, float _speed) { vDest = _v; destSpeed = _speed; }
- void onDone () { setCur(vNext, posNext); PickNext(); }
+ void onDone () { setCur(vNext, posNext); pickNext(); }
float minDist;
int nTurns;
boolean bRandEval;
- void Evaluate(dVertex v, int p, int s) {
+ void evaluate(dVertex v, int p, int s) {
if (v == null) return; ++nTurns;
if (bRandEval) {
if (random(nTurns) < 1) setNext(v,p,s); return; }
else {
- float d = PointDist(v.getPoint(15), vDest.getPoint(0));
+ float d = pointDist(v.getPoint(15), vDest.getPoint(0));
if (d < minDist) { minDist=d; setNext(v,p,s); }
if (d == minDist && random(2)<1) { minDist=d; setNext(v,p,s); }
}
}
- void EvalTurn(dTurn t) {
+ void evalTurn(dTurn t) {
if (t == null || t.pos0<<12 <= pos) return;
- Evaluate(t.v , t.pos1, t.pos0);
- Evaluate(t.v.opp, 16-t.pos1, t.pos0);
+ evaluate(t.v , t.pos1, t.pos0);
+ evaluate(t.v.opp, 16-t.pos1, t.pos0);
}
- void PickNext() {
+ void pickNext() {
bRandEval = random(.05+destSpeed) < .05; minDist=500; nTurns=0;
- Evaluate(vCur.c0, 0, 16); Evaluate(vCur.c1, 0, 16);
- EvalTurn(vCur.t0); EvalTurn(vCur.t1);
+ evaluate(vCur.c0, 0, 16); evaluate(vCur.c1, 0, 16);
+ evalTurn(vCur.t0); evalTurn(vCur.t1);
}
Point p1, p2; int i2;
int nTo = min(15,(pos+nMv) >> 12);
dVertex v = vCur;
- if (dDebug) { p1 = v.getPoint(nFrom); float d = (p2 == null ? 0 : PointDist(p1,p2)); if (d>5) { println("too wide! quitting: " + d); exit(); }}
+ if (dDebug) { p1 = v.getPoint(nFrom); float d = (p2 == null ? 0 : pointDist(p1,p2)); if (d>5) { println("too wide! quitting: " + d); exit(); }}
for (int i = nFrom; i <= nTo; i++) { pat.getColors()[v.ci + v.dir*i ] = clr; }
if (v.same != null) for (int i = nFrom; i <= nTo; i++) { pat.getColors()[v.same.ci + v.same.dir*i] = clr; }
if (dDebug) { p2 = v.getPoint(nTo); i2 = nTo; }
pos += nMv; return nAmount - nMv;
- }
+ }
}
//----------------------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------------------
xyz mMax, mCtr, mHalf;
int NumApcRows = 5, NumApcCols = 8;
-DGlobals DG = new DGlobals();
boolean btwn (int a,int b,int c) { return a >= b && a <= c; }
boolean btwn (double a,double b,double c) { return a >= b && a <= c; }
float interp (float a, float b, float c) { return (1-a)*b + a*c; }
float randctr (float a) { return random(a) - a*.5; }
float min (float a, float b, float c, float d) { return min(min(a,b),min(c,d)); }
-
-float distToSeg (float x, float y, float x1, float y1, float x2, float y2) {
+float pointDist(Point p1, Point p2) { return dist(p1.x,p1.y,p1.z,p2.x,p2.y,p2.z); }
+float distToSeg(float x, float y, float x1, float y1, float x2, float y2) {
float A = x - x1, B = y - y1, C = x2 - x1, D = y2 - y1;
float dot = A * C + B * D, len_sq = C * C + D * D;
float xx, yy,param = dot / len_sq;
void interpolate(float i, xyz d) { x = interp(i,x,d.x); y = interp(i,y,d.y); z = interp(i,z,d.z); }
}
//----------------------------------------------------------------------------------------------------------------------------------
-public class DGlobals {
- boolean bInit = false;
+public class DPat extends SCPattern
+{
MidiOutput APCOut = null;
- MidiInput APCIn = null, OxygenIn = null;
- DPat CurPat = null;
- int KeyPressed = -1;
- boolean bSustain = false;
-
-
- float Sliders[] = new float [] {1,0,0,0,0,0,0,0};
- String SliderText[] = new String[] {"Level", "??", "Spark", "Xwave", "Ywave", "??", "??", "??", "??"};
-
- void SetNoteOn (int row, int col, int clr){ if (APCOut != null) APCOut.sendNoteOn (col, row, clr); }
- void SetNoteOff (int row, int col, int clr){ if (APCOut != null) APCOut.sendNoteOff (col, row, clr); }
- void SetKnob (int cc , int c , int v ){ if (APCOut != null) APCOut.sendController (cc , c, v); }
-
- DBool GetBool (int i) { return (DBool)CurPat.bools .get(i); }
- Pick GetPick (int i) { return (Pick) CurPat.picks .get(i); }
- DParam GetParam(int i) { return (DParam) CurPat.params.get(i); }
-
- float _Level () { return Sliders[0]; }
- float _Spark () { return Sliders[2]; }
- float _XWave () { return Sliders[3]; }
- float _YWave () { return Sliders[4]; }
- void Init () {
- if (bInit) return; bInit=true;
- for (MidiOutputDevice o: RWMidi.getOutputDevices()) { if (o.toString().contains("APC")) { APCOut = o.createOutput(); break;}}
- for (MidiInputDevice i: RWMidi.getInputDevices ()) { if (i.toString().contains("APC")) { i.createInput (this); break;}}
- }
-
- boolean isFocused () { return CurPat != null && CurPat == midiEngine.getFocusedDeck().getActivePattern(); }
- void Deactivate (DPat p) { if (p != CurPat) return; uiDebugText.setText(""); CurPat = null; }
- void Activate (DPat p) {
- bSustain = false;
- CurPat = p;
- while (lx.tempo.bpm() > 40) lx.tempo.setBpm(lx.tempo.bpm()/2);
- for (int i=0; i<p.params.size(); i++) GetParam(i).reset();
- for (int i=0; i<p.bools .size(); i++) GetBool (i).reset();
- for (int i=0; i<p.picks .size(); i++) GetPick (i).reset();
+ boolean noteOff(Note note) { if (!isFocused()) return false;
+ int row = note.getPitch(), col = note.getChannel();
+ for (int i=0; i<bools.size(); i++) if (bools.get(i).set(row, col, false)) return true;
UpdateLights();
+ return false;
}
- void SetText() {
- if (!isFocused()) return;
- String Text1="", Text2="";
- for (int i=0; i<CurPat.bools.size(); i++) if (GetBool(i).b) Text1 += " " + GetBool(i).tag + " ";
- for (int i=0; i<CurPat.picks.size(); i++) Text1 += GetPick(i).tag + ": " + GetPick(i).CurDesc() + " ";
- for (int i=0; i<5; i++) Text2 += SliderText[i] + ": " + round(100*Sliders[i]) + " ";
- uiDebugText.setText(Text1, Text2);
+ boolean noteOn(Note note) { if (!isFocused()) return false;
+ int row = note.getPitch(), col = note.getChannel();
+ for (int i=0; i<picks.size(); i++) if (picks.get(i).set(row, col)) return true;
+ for (int i=0; i<bools.size(); i++) if (bools.get(i).set(row, col, true)) return true;
+ if (row == 84 && col==0) { onActive(); StartPattern(); return true; }
+ println("row: " + row + " col: " + col); return false;
}
- void UpdateLights() {
- if (!isFocused() || APCOut == null) return;
- for (int i=53;i< 58; i++) for (int j=0; j<NumApcCols; j++) SetNoteOn(i, j, 0);
- for (int i=48;i< 56; i++) SetKnob(0, i, 0);
- for (int i=16;i< 20; i++) SetKnob(0, i, 0);
+ void SetNoteOn (int row, int col, int clr){ if (APCOut != null) APCOut.sendNoteOn (col, row, clr); }
+ void SetNoteOff (int row, int col, int clr){ if (APCOut != null) APCOut.sendNoteOff (col, row, clr); }
- for (int i=0; i<CurPat.params.size(); i++) SetKnob ( 0, i<8 ? 48+i : 16 + i - 8, round(GetParam(i).Val()*127) );
- for (int i=0; i<CurPat.picks .size(); i++) SetNoteOn (GetPick(i).CurRow, GetPick(i).CurCol, 3);
- for (int i=0; i<CurPat.bools .size(); i++) if (GetBool(i).b) SetNoteOn (GetBool(i).row, GetBool(i).col, 1);
- else SetNoteOff (GetBool(i).row, GetBool(i).col, 0);
+ boolean isFocused() { return midiEngine != null && midiEngine.getFocusedDeck() != null &&
+ this == midiEngine.getFocusedDeck().getActivePattern(); }
+ void onInactive() { uiDebugText.setText(""); }
+ void onActive () {
+ while (lx.tempo.bpm() > 40) lx.tempo.setBpm(lx.tempo.bpm()/2);
+ for (int i=0; i<params.size(); i++) params.get(i).reset();
+ for (int i=0; i<bools .size(); i++) bools.get(i).reset();
+ for (int i=0; i<picks .size(); i++) picks.get(i).reset();
+ UpdateLights();
}
- void controllerChangeReceived(rwmidi.Controller cc) {
- if (cc.getCC() == 7 && btwn(cc.getChannel(),0,7)) { Sliders[cc.getChannel()] = 1.*cc.getValue()/127.; }
+ void UpdateLights() {
+ if (!isFocused() || APCOut == null) return;
+ for (int i=53;i< 58; i++) for (int j=0; j<NumApcCols; j++) SetNoteOn(i, j, 0);
+ for (int i=0; i<picks .size(); i++) SetNoteOn (picks.get(i).CurRow, picks.get(i).CurCol, 3);
+ for (int i=0; i<bools .size(); i++) if (bools.get(i).b) SetNoteOn (bools.get(i).row, bools.get(i).col, 1);
+ else SetNoteOff (bools.get(i).row, bools.get(i).col, 0);
}
- void noteOffReceived(Note note) { if (!isFocused()) return;
- int row = note.getPitch(), col = note.getChannel();
- for (int i=0; i<CurPat.bools.size(); i++) if (GetBool(i).set(row, col, false)) return;
- UpdateLights();
- bSustain=false;
+ void SetText() { if (!isFocused()) return;
+ String Text1="", Text2="";
+ for (int i=0; i<bools.size(); i++) if (bools.get(i).b) Text1 += " " + bools.get(i).tag + " ";
+ for (int i=0; i<picks.size(); i++) Text1 += picks.get(i).tag + ": " + picks.get(i).CurDesc() + " ";
+ uiDebugText.setText(Text1, Text2);
}
- void noteOnReceived (Note note) { if (!isFocused()) return;
- int row = note.getPitch(), col = note.getChannel();
- for (int i=0; i<CurPat.picks.size(); i++) if (GetPick(i).set(row, col)) return;
- for (int i=0; i<CurPat.bools.size(); i++) if (GetBool(i).set(row, col, true)) return;
+ ArrayList<Pick> picks = new ArrayList<Pick> ();
+ ArrayList<DBool> bools = new ArrayList<DBool> ();
+ ArrayList<DParam> params = new ArrayList<DParam>();
- if (row == 84 && col==0) { Activate(CurPat); CurPat.StartPattern(); return; }
- if (row == 85 && col==0) { bSustain=true; return; }
-
- if (row == 52) { KeyPressed = col; return; }
- println("row: " + row + " col: " + col);
- }
-}
-//----------------------------------------------------------------------------------------------------------------------------------
-public class DPat extends SCPattern
-{
- ArrayList picks = new ArrayList(); // should be ArrayList<Pick> picks = new ArrayList<Pick>();
- ArrayList params = new ArrayList();
- ArrayList bools = new ArrayList();
int nMaxRow = 53;
float LastQuant = -1, LastJog = -1;
float[] xWaveNz, yWaveNz;
xyz modmin;
float NoiseMove = random(10000);
- DParam pBlank, pBlank2, pRotX, pRotY, pRotZ, pSpin, pTransX, pTransY;
+ DParam pSpark, pWave, pRotX, pRotY, pRotZ, pSpin, pTransX, pTransY;
- DBool pXsym, pYsym, pRsym, pXdup, pXtrip, pJog, pKey;
+ DBool pXsym, pYsym, pRsym, pXdup, pXtrip, pJog, pGrey;
float lxh () { return lx.getBaseHuef(); }
float Dist (xyz a, xyz b) { return dist(a.x,a.y,a.z,b.x,b.y,b.z); }
int c1c (float a) { return round(100*constrain(a,0,1)); }
void StartPattern() { }
void StartRun(double deltaMs) { }
color CalcPoint(xyz p) { return lx.hsb(0,0,0); }
- boolean IsActive() { return this == DG.CurPat; }
- boolean IsFocused() { return midiEngine != null && midiEngine.getFocusedDeck() != null &&
- this == midiEngine.getFocusedDeck().getActivePattern(); }
- void onInactive() { UpdateState(); }
- void onActive () { UpdateState(); StartPattern(); }
- void UpdateState() { if (IsFocused() != IsActive()) { if (IsFocused()) DG.Activate(this); else DG.Deactivate(this); } }
color blend3(color c1, color c2, color c3){ return blendColor(c1,blendColor(c2,c3,ADD),ADD); }
DParam addParam(String label, double value) {
DPat(GLucose glucose) {
super(glucose);
- pBlank = addParam("", 0);
- pBlank2 = addParam("" , .5);
+ pSpark = addParam("Sprk", 0);
+ pWave = addParam("Wave", 0);
pTransX = addParam("TrnX", .5);
pTransY = addParam("TrnY", .5);
pRotX = addParam("RotX", .5);
pSpin = addParam("Spin", .5);
nPoints = model.points.size();
- pXsym = new DBool("X-SYM", false, 49, 0); bools.add(pXsym );
- pYsym = new DBool("Y-SYM", false, 49, 1); bools.add(pYsym );
- pRsym = new DBool("R-SYM", false, 49, 2); bools.add(pRsym );
- pXdup = new DBool("X-DUP", false, 49, 3); bools.add(pXdup );
- pJog = new DBool("JOG" , false, 49, 4); bools.add(pJog );
- pKey = new DBool("KBD" , false, 49, 5); bools.add(pKey );
+ pXsym = new DBool("X-SYM", false, 48, 0); bools.add(pXsym );
+ pYsym = new DBool("Y-SYM", false, 48, 1); bools.add(pYsym );
+ pRsym = new DBool("R-SYM", false, 48, 2); bools.add(pRsym );
+ pXdup = new DBool("X-DUP", false, 48, 3); bools.add(pXdup );
+ pJog = new DBool("JOG" , false, 48, 4); bools.add(pJog );
+ pGrey = new DBool("GREY" , false, 48, 5); bools.add(pGrey );
modmin = new xyz(model.xMin, model.yMin, model.zMin);
mMax = new xyz(model.xMax, model.yMax, model.zMax); mMax.subtract(modmin);
//println (model.xMin + " " + model.yMin + " " + model.zMin);
//println (model.xMax + " " + model.yMax + " " + model.zMax);
- DG.Init();
+ for (MidiOutputDevice o: RWMidi.getOutputDevices()) { if (o.toString().contains("APC")) { APCOut = o.createOutput(); break;}}
}
void run(double deltaMs)
{
- UpdateState();
+ if (deltaMs > 100) return;
NoiseMove += deltaMs; NoiseMove = NoiseMove % 1e7;
StartRun (deltaMs);
xyz P = new xyz(), tP = new xyz(), pSave = new xyz();
xyz pTrans = new xyz(pTransX.Val()*200-100, pTransY.Val()*100-50,0);
- DG.SetText();
+ SetText();
nPoint = 0;
if (pJog.b) {
}
// precalculate this stuff
- float yWv = DG._YWave(), xWv = DG._XWave(), sprk = DG._Spark();
- if (yWv > 0) for (int i=0; i<ceil(mMax.x)+1; i++)
- yWaveNz[i] = yWv * (noise(i/(mMax.x*.3)-(2e3+NoiseMove)/1500.) - .5) * (mMax.y/2.);
+ float wvAmp = pWave.Val(), sprk = pSpark.Val();
+ if (wvAmp > 0) {
+ for (int i=0; i<ceil(mMax.x)+1; i++)
+ yWaveNz[i] = wvAmp * (noise(i/(mMax.x*.3)-(2e3+NoiseMove)/1500.) - .5) * (mMax.y/2.);
- if (xWv > 0) for (int i=0; i<ceil(mMax.y)+1; i++)
- xWaveNz[i] = xWv * (noise(i/(mMax.y*.3)-(1e3+NoiseMove)/1500.) - .5) * (mMax.x/2.);
+ for (int i=0; i<ceil(mMax.y)+1; i++)
+ xWaveNz[i] = wvAmp * (noise(i/(mMax.y*.3)-(1e3+NoiseMove)/1500.) - .5) * (mMax.x/2.);
+ }
for (Point p : model.points) { nPoint++;
P.set(p);
P.subtract(modmin);
P.subtract(pTrans);
- if (sprk > 0) { P.y += sprk*randctr(50); P.x += sprk*randctr(50); P.z += sprk*randctr(50); }
- if (yWv > 0) P.y += interpWv(p.x-modmin.x, yWaveNz);
- if (xWv > 0) P.x += interpWv(p.y-modmin.y, xWaveNz);
+ if (sprk > 0) {P.y += sprk*randctr(50); P.x += sprk*randctr(50); P.z += sprk*randctr(50); }
+ if (wvAmp > 0) P.y += interpWv(p.x-modmin.x, yWaveNz);
+ if (wvAmp > 0) P.x += interpWv(p.y-modmin.y, xWaveNz);
if (pJog.b) P.add(xyzJog);
if (pYsym.b) { tP.set(P.x,mMax.y-P.y,P.z); cNew = blendColor(cNew, CalcPoint(tP), ADD); }
if (pRsym.b) { tP.set(mMax.x-P.x,mMax.y-P.y,mMax.z-P.z); cNew = blendColor(cNew, CalcPoint(tP), ADD); }
if (pXdup.b) { tP.set((P.x+mMax.x*.5)%mMax.x,P.y,P.z); cNew = blendColor(cNew, CalcPoint(tP), ADD); }
-
- float s = lx.s(cNew);
- float b = lx.b(cNew)/100.;
- if (DG.bSustain == true) b = max(b, (float) (lx.b(cOld)/100.));
-
- colors[p.index] = lx.hsb(lx.h(cNew), s, 100 * b * DG._Level());
+ if (pGrey.b) { cNew = lx.hsb(0, 0, lx.b(cNew)); }
+ colors[p.index] = cNew;
}
}
}
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;
//}
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)); }
- float PD2 (Point p1, float x, float y, float z) { return dist(p1.x,p1.y,p1.z,x,y,z); }
- boolean SameSame (Strip s1, Strip s2) { return max(Dist2(s1, 0, s2, 0), Dist2(s1,15, s2,15)) < 5 ; } // same strut, same direction
- boolean SameOpp (Strip s1, Strip s2) { return max(Dist2(s1, 0, s2,15), Dist2(s1,15, s2,0 )) < 5 ; } // same strut, opp direction
- boolean SameBar (Strip s1, Strip s2) { return SameSame(s1,s2) || SameOpp(s1,s2); } // 2 strips on same strut
- void AddJoint (dVertex v1, dVertex v2) {
+ float dist2 (Strip s1, int pos1, Strip s2, int pos2) { return pointDist(s1.points.get(pos1), s2.points.get(pos2)); }
+ float pd2 (Point p1, float x, float y, float z) { return dist(p1.x,p1.y,p1.z,x,y,z); }
+ boolean sameSame (Strip s1, Strip s2) { return max(dist2(s1, 0, s2, 0), dist2(s1,15, s2,15)) < 5 ; } // same strut, same direction
+ boolean sameOpp (Strip s1, Strip s2) { return max(dist2(s1, 0, s2,15), dist2(s1,15, s2,0 )) < 5 ; } // same strut, opp direction
+ boolean sameBar (Strip s1, Strip s2) { return sameSame(s1,s2) || sameOpp(s1,s2); } // 2 strips on same strut
+ 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 && 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;
}
dVertex v = null; int pos=0; float d = 500;
for (int j=0; j<iTowerStrips; j++) {
dStrip s = DS[j];
- float nd = PD2(s.s.points.get(0),p.x,p.y,p.z); if (nd < d) { v=s.v0; d=nd; pos=0; }
+ float nd = pd2(s.s.points.get(0),p.x,p.y,p.z); if (nd < d) { v=s.v0; d=nd; pos=0; }
if (nd > 30) continue;
for (int k=0; k<=15; k++) {
- nd = PD2(s.s.points.get(k),p.x,p.y,p.z); if (nd < d) { v = s.v0; d=nd; pos=k; }
+ nd = pd2(s.s.points.get(k),p.x,p.y,p.z); if (nd < d) { v = s.v0; d=nd; pos=k; }
}
}
return random(2) < 1 ? new dPixel(v,pos) : new dPixel(v.opp,15-pos);
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;
+ 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;
+ 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 (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?
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 (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 ;
}