/* Store stationary particles. */ mxArray* Snapshot::StoreSnapshot0(Snapshot& snapshot) { ParticleFactory& factory = ParticleFactory::getInstance(); vector<MovingParticle*> vp = snapshot.polygon->getParticles(); const int dims[] = { vp.size(), 3 }; vector<float> F(dims[0] * dims[1]); for (int j = 0; j < dims[0]; ++j) { SetData2(F, j, 0, dims[0], dims[1], vp[j]->getInitParticle()->getX()); SetData2(F, j, 1, dims[0], dims[1], vp[j]->getInitParticle()->getY()); SetData2(F, j, 2, dims[0], dims[1], (float)vp[j]->getInitParticle()->getId()); } return StoreData(F, mxSINGLE_CLASS, 2, dims); }
mxArray* ParticleSimulator::SaveConvexity() { ParticleFactory* factory = ParticleFactory::getInstance(); const int dims[] = { factory->particles.size(), 3 }; vector<float> F(dims[0] * dims[1]); for (int i = 0; i < dims[0]; ++i) { MovingParticle* p = factory->particles[i]; CParticleF pr = p->project(p->created + 0.1); SetData2(F, i, 0, dims[0], dims[1], pr.m_X); SetData2(F, i, 1, dims[0], dims[1], pr.m_Y); SetData2(F, i, 2, dims[0], dims[1], p->reflexive<=0 ? 0.0f: 1.0f); } return StoreData(F, mxSINGLE_CLASS, 2, dims); }
mxArray* ParticleSimulator::SaveDoneEvents() { const int dims[] = { doneEvents.size(), 5 }; vector<float> F(dims[0] * dims[1]); for (int i = 0; i < doneEvents.size(); ++i) { EventStruct ev = doneEvents[i]; SetData2(F, i, 0, dims[0], dims[1], (float)ev.p->id); SetData2(F, i, 1, dims[0], dims[1], (float)ev.q->id); SetData2(F, i, 2, dims[0], dims[1], (float)ev.r->id); SetData2(F, i, 0, dims[0], dims[1], (float)ev.t); SetData2(F, i, 0, dims[0], dims[1], (float)ev.type); } return StoreData(F, mxSINGLE_CLASS, 2, dims); }
mxArray* Snapshot::StoreSnapshot(Snapshot& snapshot) { ParticleFactory& factory = ParticleFactory::getInstance(); vector<CParticleF> shape = snapshot.polygon->project(snapshot.getProjectionTime()); const int dims[] = { shape.size(), 4 }; vector<float> F(dims[0] * dims[1]); for (int j = 0; j < dims[0]; ++j) { SetData2(F, j, 0, dims[0], dims[1], shape[j].m_X); SetData2(F, j, 1, dims[0], dims[1], shape[j].m_Y); SetData2(F, j, 2, dims[0], dims[1], snapshot.projection_time); SetData2(F, j, 3, dims[0], dims[1], snapshot.created_time); } return StoreData(F, mxSINGLE_CLASS, 2, dims); }
void PaintInsideHull(vector<unsigned char>& im, const vector<CParticleF>& vch, const int* dims) { for(int y=0; y<dims[1]; ++y) { for(int x=0; x<dims[0]; ++x) { bool bOut = false; CParticleF q(x, y, 0); for(int n=0; n<vch.size(); ++n) { CParticleF p0 = vch[n]; CParticleF p1 = vch[(n+1) % vch.size()]; if(isLeft(p0, p1, q)<0) { bOut = true; break; } } if(bOut == false) { SetData2(im, x, y, dims[0], dims[1], (unsigned char)1); } } } }
mxArray* ParticleSimulator::SaveParticles() { ParticleFactory* factory = ParticleFactory::getInstance(); const int dims[] = { factory->particles.size(), ParticleDumpSize }; vector<float> F(dims[0] * dims[1]); for (int i = 0; i < dims[0]; ++i) { MovingParticle* p = factory->particles[i]; vector<float> v = p->dump2vector(); for (int j = 0; j < dims[1]; ++j) { SetData2(F, i, j, dims[0], dims[1], v[j]); } } return StoreData(F, mxSINGLE_CLASS, 2, dims); }