
public class Vertex
{
  public double coord[];
  public int dim;
  public double val;

  public Vertex( int d )
  {
    dim = d;
    coord = new double[dim];
  }
  public Vertex( double x[] )
  {
    dim = x.length;
    coord = x;
  }
  public Vertex copy()
  {
    double c[] = new double[dim];
    int i;
    for( i = 0; i < dim; i++ )
      c[i] = coord[i];
    Vertex nv = new Vertex( c );
    nv.val = val;
    return nv;
  }

  public Vertex combine( double ownt, Vertex v )
  {
    if( v.dim != dim )
      return null;

    int i;
    double othert = 1.0 - ownt;

    Vertex nv = new Vertex( dim );
    for( i = 0; i < dim; i++ )
      nv.coord[i] = coord[i] * ownt + v.coord[i] * othert;
    return nv;
  }

  public Vertex sub( Vertex v )
  {
    if( v.dim != dim )
      return null;

    int i;

    Vertex nv = new Vertex( dim );
    for( i = 0; i < dim; i++ )
      nv.coord[i] = coord[i] - v.coord[i];
    return nv;
  }

  public Vertex add( Vertex v )
  {
    if( v.dim != dim )
      return null;

    int i;

    Vertex nv = new Vertex( dim );
    for( i = 0; i < dim; i++ )
      nv.coord[i] = coord[i] + v.coord[i];
    return nv;
  }

  public double distanceTo( Vertex v )
  {
    int i;
    double s, d;

    s = 0.0;
    for( i = 0; i < dim; i++ ) {
      d = coord[i] - v.coord[i];
      s += d * d;
    }
    return Math.sqrt( s );
  }

  public String toString()
  {
    int i;
    String txt = new String( "(" );
    for( i = 0; i < dim; i++ ) {
      if( i > 0 )
        txt += ",";
      txt += " " + coord[i];
    }
    txt += " )";
    return txt;
  }

  public static double getDiameter( Vertex V[] )
  {
    int i, j;
    double d, dmax;

    dmax = 0.0;
    int m = V.length;
    if( m <= 1 )
      return 0.0;
    for( i = 0; i < m; i++ )
      for( j = i + 1; j < m; j ++ ) {
        d = V[i].distanceTo( V[j] );
        if( dmax < d )
          dmax = d;
      }

    return dmax;
  }
}
