package org.geogebra.common.kernel.kernelND;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.Matrix.Coords3;
/**
* Surface with parametric equation z=f(x1,x2,...,xn)
*
* @author Mathieu
*/
public interface SurfaceEvaluable {
/**
* numerical value for dx, dy, etc. when computing numerical derivative
* vector
*/
static final public double NUMERICAL_DELTA = Kernel.STANDARD_PRECISION;
/**
* level of detail (speed/quality)
*/
public enum LevelOfDetail {
/** level of detail : speed */
SPEED,
/** level of detail : quality */
QUALITY
}
/**
* @param u
* first parameter
* @param v
* second parameter
* @param point
* point set for parameters u, v
*/
public void evaluatePoint(double u, double v, Coords3 point);
/**
*
* @param p
* point where the normal is computed
* @param u
* first parameter
* @param v
* second parameter
* @param normal
* normal. WARNING: the normal may not have norm=1
* @return true if the normal is defined
*/
public boolean evaluateNormal(Coords3 p, double u, double v,
Coords3 normal);
/**
* @param i
* index of parameter
* @return minimal value for i-th parameter
*/
public double getMinParameter(int i);
/**
* @param i
* index of parameter
* @return maximal value for i-th parameter
*/
public double getMaxParameter(int i);
/**
* set derivatives (if not already done)
*/
public void setDerivatives();
/**
* reset derivatives
*/
public void resetDerivatives();
/**
* @return the level of detail (for drawing)
*/
public LevelOfDetail getLevelOfDetail();
/**
* set the level of detail (for drawing)
*
* @param lod
* level of detail
*/
public void setLevelOfDetail(LevelOfDetail lod);
/**
* @return whether this is defined
*/
public boolean isDefined();
}