content: package aima.core.robotics.impl.map;
  
  import aima.core.robotics.datatypes.IMclMove;
  import aima.core.robotics.impl.datatypes.IPose2D;
  import aima.core.util.math.geom.shapes.Point2D;
  
  /**
   * This interface defines a factory for the class implementing {@link IPose2D} in the context of the {@link MclCartesianPlot2D}.
   *  
   * @author Arno von Borries
   * @author Jan Phillip Kretzschmar
   * @author Andreas Walscheid
   *
   * @param <P> a pose implementing {@link IPose2D}.
   * @param <M> a movement (or a sequence of movements) implementing {@link IMclMove}.
   */
  public interface IPoseFactory<P extends IPose2D<P,M>,M extends IMclMove<M>> {
  	/**
  	 * Creates a new instance of {@code <P>} for the given parameters.
  	 * @param point the 2D coordinates of the new pose.
  	 * @return the new pose.
  	 */
  	P getPose(Point2D point);
  
  	/**
  	 * Creates a new instance of {@code <P>} for the given parameters.<br/>
  	 * This function is used to create the result of {@link MclCartesianPlot2D}{@code .getAverage()}.
  	 * @param point the 2D coordinates of the new pose.
  	 * @param heading the heading of the pose. This heading may be invalid. Based on the given environment this can be corrected or ignored.
  	 * @return the new pose.
  	 */
  	P getPose(Point2D point, double heading);
  	
  	/**
  	 * Checks whether the heading of a pose is valid.
  	 * @param pose the pose to be checked.
  	 * @return true if the heading is valid.
  	 */
  	boolean isHeadingValid(P pose);
  }
  