void TwoDScene::insertEdge( const std::pair<int,int>& edge, scalar radius ) { assert( edge.first >= 0 ); assert( edge.first < getNumParticles() ); assert( edge.second >= 0 ); assert( edge.second < getNumParticles() ); assert( radius > 0.0 ); m_edges.push_back(edge); m_edge_radii.push_back(radius); }
void GvParticle::update(float dt) { updateParticles(dt); createParticles(dt*rate); if (getNumParticles() > maxCount) { deleteParticles(getNumParticles() - maxCount); } }
const scalar& TwoDScene::getRadius( int particle ) const { assert( particle >= 0 ); assert( particle < getNumParticles() ); return m_radii[particle]; }
void TwoDScene::setRadius( int particle, scalar radius ) { assert( particle >= 0 ); assert( particle < getNumParticles() ); m_radii[particle] = radius; }
void TwoDScene::setFixed( int particle, bool fixed ) { assert( particle >= 0 ); assert( particle < getNumParticles() ); m_fixed[particle] = fixed; }
bool TwoDScene::isFixed( int particle ) const { assert( particle >= 0 ); assert( particle < getNumParticles() ); return m_fixed[particle]; }
void TwoDScene::setVelocity( int particle, const Vector2s& vel ) { assert( particle >= 0 ); assert( particle < getNumParticles() ); m_v.segment<2>(2*particle) = vel; }
void TwoDScene::setPosition( int particle, const Vector2s& pos ) { assert( particle >= 0 ); assert( particle < getNumParticles() ); m_x.segment<2>(2*particle) = pos; }
void ParticleSystem::getSpatialDimensions( Vector3d &outCenter, double &outRadius ) { idx_t numParticles = getNumParticles(); //------------ Find Center Of Mass ------------- Vector3d center; center.print(); for( idx_t i = 0; i < numParticles; i++ ) { center += mParticlePos[i]; } center = center / numParticles; center.print(); outCenter = center; //------------ Find Radius ------------- double dist = 0; for( idx_t i = 0; i < numParticles; i++ ) { double tmp = ABS( center.dist(mParticlePos[i]) ); if( tmp > dist ) dist = tmp; } outRadius = dist; }
void TwoDScene::setMass( int particle, const scalar& mass ) { assert( particle >= 0 ); assert( particle < getNumParticles() ); m_m(2*particle) = mass; m_m(2*particle+1) = mass; }
void ParticleSystem::move( Vector3d direction ) { idx_t numParticles = getNumParticles(); for( idx_t i = 0; i < numParticles; i++ ) { mParticlePos[i] += direction; } }
void TwoDScene::checkConsistency() { assert( m_x.size() == m_v.size() ); assert( m_x.size() == m_m.size() ); assert( m_x.size() == (int) (2*m_fixed.size()) ); assert( (m_x.array()==m_x.array()).all() ); assert( (m_v.array()==m_v.array()).all() ); assert( (m_m.array()==m_m.array()).all() ); for( std::vector<std::pair<int,int> >::size_type i = 0; i < m_edges.size(); ++i ) { assert( m_edges[i].first >= 0 ); assert( m_edges[i].first < getNumParticles() ); assert( m_edges[i].second >= 0 ); assert( m_edges[i].second < getNumParticles() ); } // TODO: Add more checks }
scalar TwoDScene::computeKineticEnergy() const { scalar T = 0.0; for( int i = 0; i < getNumParticles(); ++i ) T += m_m(2*i)*m_v.segment<2>(2*i).dot(m_v.segment<2>(2*i)); return 0.5*T; }