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;
}