content: package edu.stanford.rsl.conrad.geometry;
  
  import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
  
  
  /**
   * Abstract class to model n dimensional surfaces.
   * Note that the internal dimension (cf. description by Piegl), i.e. its parametrization is always two dimensional.
   * Hence, a surface can only be evaluated using a two dimensions. 
   * That is the reason, why the abstract surface overides the evaluate PointND method.
   * In it only the first two dimensions of the ND point are used for evaluation of the surface.
   * The abstract method evaluate(double, double) must be implemented by any derived class that is not abstract to describe how to do the actual evaluation. 
   * 
   * @author akmaier
   *
   *@see AbstractShape
   *@see #evaluate(double, double)
   *
   */
  public abstract class AbstractSurface extends AbstractShape {
  	
  	public AbstractSurface(){
  		super();
  	}
  
  	public AbstractSurface(AbstractShape shape) {
  		super(shape);
  	}
  
  	/**
  	 * 
  	 */
  	private static final long serialVersionUID = 8336440075236081077L;
  
  
  	@Override
  	public PointND evaluate(PointND u) {
  		return evaluate(u.get(0), u.get(1));
  	}
  	
  	/**
  	 * Returns a point on the surface at position (u, v). u, v in [0, 1];
  	 * 
  	 * @param u the internal position in u dimension
  	 * @param v the internal position in v dimension
  	 * @return the surface point
  	 */
  	public abstract PointND evaluate (double u, double v);
  
  	
  	@Override
  	public int getInternalDimension() {
  		// surfaces do always have the internal dimension two.
  		return 2;
  	}
  	
  	/**
  	 * Creates a list of connected triangles that can be used to approximate the object. The maximal point to mesh error is given as accuracy.
  	 * @param accuracy the maximal deviation in [mm]
  	 * @return the compound shape of triangles.
  	 */
  	public abstract AbstractShape tessellate(double accuracy);
  	
  }
  /*
   * Copyright (C) 2010-2014 Andreas Maier
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */