diff --git a/DLASystem.cpp b/DLASystem.cpp index 97174e4..0557310 100644 --- a/DLASystem.cpp +++ b/DLASystem.cpp @@ -10,7 +10,7 @@ void DLASystem::Update() { if (lastParticleIsActive == 1) { moveLastParticle(); - } else if (numParticles < endNum) { + } else if (this->particleList.size() < (size_t) endNum) { addParticleOnAddCircle(); setParticleActive(); } else { @@ -20,17 +20,16 @@ void DLASystem::Update() { void DLASystem::clearParticles() { // delete particles and the particle list - for (int i = 0; i < numParticles; i++) { + for (size_t i = 0; i < this->particleList.size(); i++) { delete particleList[i]; } particleList.clear(); - numParticles = 0; } // remove any existing particles and setup initial condition void DLASystem::Reset() { // stop running - running = 0; + running = false; clearParticles(); @@ -50,11 +49,6 @@ void DLASystem::Reset() { // add a single particle at the origin double pos[] = {0.0, 0.0}; addParticle(pos); - - // set the view - int InitialViewSize = 40; - setViewSize(InitialViewSize); - } // set the value of a grid cell for a particular position @@ -87,7 +81,6 @@ void DLASystem::addParticle(double pos[]) { Particle *p = new Particle(pos); // push_back means "add this to the end of the list" particleList.push_back(p); - numParticles++; // pos coordinates should be -gridSize/2 < x < gridSize/2 setGrid(pos, 1); @@ -131,23 +124,9 @@ void DLASystem::setPosNeighbour(double setpos[], double pos[], int val) { } } -// if the view is smaller than the kill circle then increase the view area (zoom out) -void DLASystem::updateViewSize() { - double mult = 1.2; - if (viewSize < 2.0 * killCircle) { - setViewSize(viewSize * mult); - } -} - -// set the view to be the size of the add circle (ie zoom in on the cluster) -void DLASystem::viewAddCircle() { - setViewSize(2.0 * addCircle); // factor of 2 is to go from radius to diameter -} - // when we add a particle to the cluster, we should update the cluster radius // and the sizes of the addCircle and the killCircle void DLASystem::updateClusterRadius(double pos[]) { - double rr = distanceFromOrigin(pos); if (rr > clusterRadius) { clusterRadius = rr; @@ -160,7 +139,6 @@ void DLASystem::updateClusterRadius(double pos[]) { if (addCircle < check) { addCircle = check; killCircle = killRatio * addCircle; - updateViewSize(); } checkStop(); } @@ -171,7 +149,7 @@ void DLASystem::moveLastParticle() { int rr = rgen.randomInt(4); // pick a random number in the range 0-3, which direction do we hop? double newpos[2]; - Particle *lastP = particleList[numParticles - 1]; + Particle *lastP = particleList[this->particleList.size() - 1]; setPosNeighbour(newpos, lastP->pos, rr); @@ -179,25 +157,25 @@ void DLASystem::moveLastParticle() { //cout << "#deleting particle" << endl; setGrid(lastP->pos, 0); particleList.pop_back(); // remove particle from particleList - numParticles--; setParticleInactive(); } // check if destination is empty else if (readGrid(newpos) == 0) { setGrid(lastP->pos, 0); // set the old grid site to empty // update the position - particleList[numParticles - 1]->pos[0] = newpos[0]; - particleList[numParticles - 1]->pos[1] = newpos[1]; + particleList[this->particleList.size() - 1]->pos[0] = newpos[0]; + particleList[this->particleList.size() - 1]->pos[1] = newpos[1]; setGrid(lastP->pos, 1); // set the new grid site to be occupied // check if we stick if (checkStick()) { + cout << lastP->pos[0] << "," << lastP->pos[1] << endl; //cout << "stick" << endl; setParticleInactive(); // make the particle inactive (stuck) updateClusterRadius(lastP->pos); // update the cluster radius, addCircle, etc. - if (numParticles % 100 == 0 && logfile.is_open()) { - logfile << numParticles << " " << clusterRadius << endl; + if (this->particleList.size() % 100 == 0 && logfile.is_open()) { + logfile << this->particleList.size() << " " << clusterRadius << endl; } } } else { @@ -212,7 +190,7 @@ void DLASystem::moveLastParticle() { // check if the last particle should stick (to a neighbour) int DLASystem::checkStick() { - Particle *lastP = particleList[numParticles - 1]; + Particle *lastP = particleList[this->particleList.size() - 1]; int result = 0; // loop over neighbours for (int i = 0; i < 4; i++) { @@ -229,7 +207,6 @@ int DLASystem::checkStick() { // constructor DLASystem::DLASystem() { cout << "creating system, gridSize " << gridSize << endl; - numParticles = 0; endNum = 1000; // allocate memory for the grid, remember to free the memory in destructor @@ -237,7 +214,6 @@ DLASystem::DLASystem() { for (int i = 0; i < gridSize; i++) { grid[i] = new int[gridSize]; } - slowNotFast = 1; // reset initial parameters Reset(); diff --git a/DLASystem.h b/DLASystem.h index 39660e6..9a3d57c 100644 --- a/DLASystem.h +++ b/DLASystem.h @@ -23,7 +23,6 @@ private: // these are private variables and functions that the user will not see // list of particles vector particleList; - int numParticles; // delete particles and clear the particle list void clearParticles(); @@ -38,10 +37,6 @@ private: static const int gridSize = 1600; int **grid; // this will be a 2d array that stores whether each site is occupied - // the window draws only part of the grid, viewSize controls how much... - double viewSize; - double drawScale; - // random number generator, class name is rnd, instance is rgen rnd rgen; @@ -56,7 +51,6 @@ private: double addRatio; // how much bigger the addCircle should be, compared to cluster radius double killRatio; // how much bigger is the killCircle, compared to the addCircle - public: // these are public variables and functions @@ -65,10 +59,7 @@ public: void Update(); // is the simulation running (1) or paused (0) ? - int running; - - // slowNotFast is +1 for slow running, 0 for fast - int slowNotFast; + bool running; // lastParticleIsActive is +1 if there is an active particle in the system, otherwise 0 int lastParticleIsActive; @@ -88,31 +79,9 @@ public: // check whether we should stop (eg the cluster has reached the edge of the grid) int checkStop(); - // stop/start the algorithm - void setRunning() { if (checkStop() == true) running = 1; } + void setRunning() { running = true; } - void pauseRunning() { running = 0; } - - // set whether it runs fast or slow - void setSlow() { slowNotFast = 1; } - - void setFast() { slowNotFast = 0; } - - void setSuperFast() { slowNotFast = -1; } - - // set which part of the grid is visible on the screen - // basically the screen shows co-ordinates -vv < x < vv - // where vv is the input value - void setViewSize(double vv) { - viewSize = vv; - drawScale = 2.0 / viewSize; - } - - // if the killcircle is almost as big as the view then increase the view - void updateViewSize(); - - // set the view to be the approx size of the addCircle - void viewAddCircle(); + void pauseRunning() { running = false; } // if pos is outside the cluster radius then set clusterRadius to be the distance to pos. void updateClusterRadius(double pos[]); diff --git a/mainDLA.cpp b/mainDLA.cpp index d1a3fd7..106b701 100644 --- a/mainDLA.cpp +++ b/mainDLA.cpp @@ -17,7 +17,7 @@ int main(int argc, char **argv) { int seed = 6; cout << "setting seed " << seed << endl; sys->setSeed(seed); - sys->running = true; + sys->setRunning(); /* * NOTE: We run at max speed as rendering is handled by a different engine so we simply want to hjand