CoordType SpatialModelMaximalRepulsion3D<CoordType>::getEnergy3(const Vertices<CoordType>& vertices) { CoordType energy; int numPoints = vertices.getNumVertices(); T beta = _hardcoreDistances.mean()/(_nucleusVolume/numPoints); for ( int i = 0; i < numPoints; ++i ) for ( int j = 0; j < numPoints; ++j ) if ( j!= i) energy += exp(-(pow(vertices[i].distance(vertices[j]),2))/(2*pow(beta,2))); return energy; }
CoordType SpatialModelMaximalRepulsion3D<CoordType>::getEnergy1(const Vertices<CoordType>& vertices) { const int numPoints = vertices.getNumVertices(); CoordType s = 0.0; for (int i = 0; i < numPoints; ++i) for (int j = i+1; j < numPoints; ++j) s += vertices[i].distance(vertices[j]); EVAL( s ); EVAL( 1/s ); return 1.0/s; //return numPoints/distBetweenComp; }
bool SpatialModelMaximalRepulsion3D<CoordType>::checkHardcoreDistances( const Vector<CoordType>& vertex, const int v, const Vertices<CoordType>& vertices) const { const Vector<CoordType>& hardcoreDistances = this->getHardcoreDistances(); Vector<CoordType> triMeshVertex; if ( this->getTriMeshQuery().closestPoint(vertex,triMeshVertex) < hardcoreDistances[v] ) return false; for (int i = 0; i < vertices.getNumVertices(); ++i) if ( i != v && vertices[i].distance(vertex) < hardcoreDistances[i] + hardcoreDistances[v] ) return false; return true; }