content: package aima.core.robotics;
  
  import aima.core.robotics.datatypes.IMclMove;
  import aima.core.robotics.datatypes.IMclPose;
  import aima.core.robotics.datatypes.IMclRangeReading;
  import aima.core.robotics.datatypes.IMclVector;
  
  /**
   * This interface defines functionality for a map of an environment for a robot (agent) to perform Monte-Carlo-Localization in.
   * 
   * @author Arno von Borries
   * @author Jan Phillip Kretzschmar
   * @author Andreas Walscheid
   *
   * @param <P> a pose implementing {@link IMclPose}.
   * @param <V> an n-1-dimensional vector implementing {@link IMclVector}, where n is the dimensionality of the environment.
   * @param <M> a movement (or sequence of movements) of the robot, implementing {@link IMclMove}.
   * @param <R> a range measurement, implementing {@link IMclRangeReading}.
   */
  public interface IMclMap<P extends IMclPose<P,V,M>, V extends IMclVector, M extends IMclMove<M>, R extends IMclRangeReading<R,V>> {
  	/**
  	 * Generates a random valid pose on the map.
  	 * @return a random valid pose on the map.
  	 */
  	P randomPose();
  	/**
  	 * Calculates the length of a ray in a direction defined by a pose.
  	 * @param pose the pose from which the ray is to be cast.
  	 * @return the length of the ray as a range reading.
  	 */
  	R rayCast(P pose);
  	/**
  	 * Verifies whether a pose is valid, that is inside the map boundaries and not within an obstacle.
  	 * @param pose the pose which is to be evaluated.
  	 * @return true if the pose is valid.
  	 */
  	boolean isPoseValid(P pose);
  }
  