// DLMdisplay.C #include "nsl_include.h" #include "DLMwin.h" #include "DLMdisplay.h" inline int i1Index(int i2, int i1R, int frame,int i1max,int i1Rmax,int i2max) {return i1R + frame + int((i1max-2*frame-i1Rmax)*i2/float(i2max-1)+0.5);}; inline int j1Index(int j2, int j1R, int frame,int j1max,int j1Rmax,int j2max) {return j1R + frame + int((j1max-2*frame-j1Rmax)*j2/float(j2max-1)+0.5);}; DlmDisplay::DlmDisplay(nsl_string str,NslModule* parent) : NslModule(str,parent), winT1("traj1",winWidth,winWidth,580,25), // display window ; winT2("traj2",winWidth,winWidth,580,320), winW("netW",winWidth,winWidth,900,25), winC("netC",winWidth,winWidth,900,320), netWeightExp("netWeightExp",this), // exponent for the net display computation ; gravI2("gravI2",this), // center of gravity for the connections ; gravJ2("gravJ2",this), // center of gravity for the connections ; correl21LI("correl21LI",this), // exponent for the net display computation ; w21("w21",this), Sh1("Sh1",this), Sh2("Sh2",this) { } void DlmDisplay::memAlloc(int _frame,int _i1max,int _j1max,int _i2max,int _j2max,int _i1Rmax,int _j1Rmax) { frame = _frame; i1max = _i1max; j1max = _j1max; i2max = _i2max; j2max = _j2max; i1Rmax = _i1Rmax; j1Rmax = _j1Rmax; gravI2.memAlloc(i2max,j2max); // center of gravity for the connections ; gravJ2.memAlloc(i2max,j2max); // center of gravity for the connections ; correl21LI.memAlloc(i2max,j2max,i1Rmax,j1Rmax); w21.memAlloc(i2max,j2max,i1Rmax,j1Rmax); Sh1.memAlloc(i1max,j1max); Sh2.memAlloc(i2max,j2max); } void DlmDisplay::initRun() { // ---- clear trajectory windows ---------------------------------- ; winT1.Clear(); winT2.Clear(); showNet(correl21LI,frame,winC,i1max,j1max,i2max,j2max,i1Rmax,j1Rmax, netWeightExp,gravI2,gravJ2); showNet(w21,frame,winW,i1max,j1max,i2max,j2max,i1Rmax,j1Rmax,netWeightExp,gravI2,gravJ2); } void DlmDisplay::simRun() { showNet(correl21LI,frame,winC,i1max,j1max,i2max,j2max,i1Rmax,j1Rmax, netWeightExp,gravI2,gravJ2); showNet(w21,frame,winW,i1max,j1max,i2max,j2max,i1Rmax,j1Rmax, netWeightExp,gravI2,gravJ2); showTrajectory(Sh1,frame,winT1); // if (gallerySize.elem()>0) showTrajectory(Sh2,0,winT2); } // ==== compute center of gravity of layer activity =================== ; void DlmDisplay::centerOfGravity(NslFloat2& Sh, float centerI, float centerJ) { int i,j; int imax = Sh.get_imax(); int jmax = Sh.get_jmax(); // ---- compute the center of gravity for Sh ; float sumI, sumJ, sumW, weight; sumI = 0; sumJ = 0; sumW = 0; for (i=0; i0) { weight = pow(M21[i2][j2][i1R][j1R],netWeightExp.elem()); sumI += weight*(i1-frame); sumJ += weight*(j1-frame); sumW += weight; } if (sumW>0) { gravI2[i2][j2] = (sumI/sumW+0.5)/(i1max-2*frame); gravJ2[i2][j2] = (sumJ/sumW+0.5)/(j1max-2*frame); } else { gravI2[i2][j2] = -i1max; gravJ2[i2][j2] = -j1max; } } } // ---- draw the net ; win.Clear(); win.Text(int(gravJ2.elem(0,0)*winWidth), int(gravI2.elem(0,0)*winWidth),"o",0); win.Text(int(gravJ2.elem(0,j2max-1)*winWidth), int(gravI2.elem(0,j2max-1)*winWidth),"x",0); for (i2=0; i20)) win.Line(int(gravJ2.elem(i2,j2)*winWidth), int(gravI2.elem(i2,j2)*winWidth), int(gravJ2.elem(i2+1,j2)*winWidth), int(gravI2.elem(i2+1,j2)*winWidth),0); if ((j20)) win.Line(int(gravJ2.elem(i2,j2)*winWidth), int(gravI2.elem(i2,j2)*winWidth), int(gravJ2.elem(i2,j2+1)*winWidth), int(gravI2.elem(i2,j2+1)*winWidth),0); }; // ---- draw a frame around the net ; win.Line( 0, 0, 0,winWidth-1,0); win.Line( 0,winWidth-1,winWidth-1,winWidth-1,0); win.Line(winWidth-1,winWidth-1,winWidth-1, 0,0); win.Line(winWidth-1, 0, 0, 0,0); win.Flush(); }