content: package aima.core.robotics.impl.datatypes;
  
  import aima.core.robotics.datatypes.IMclRangeReading;
  import aima.core.robotics.datatypes.IMclVector;
  import aima.core.util.Util;
  
  /**
   * This class stores an angle as a {@code double}. It is used to pass on the angle from the {@link IMclRangeReading} to the {@link IPose2D}.<br/>
   * This implementation can be used for angles in radians. The context of this unit is that {@link IPose2D} has to use radian angles.<br/>
   * Please note, that all classes that are interacting with the MCL somehow should use radian angles, too.<br/>
   * Use {@code degreeAngle()}, {@code getDegreeValue()}, {@code Math.toDegrees()} and {@code Math.toRadians()} if you need or have degree angles.
   *  
   * @author Arno von Borries
   * @author Jan Phillip Kretzschmar
   * @author Andreas Walscheid
   *
   */
  public class Angle implements IMclVector, Comparable<Angle> {
  	
  	/**
  	 * The zero angle represents {@code 0.0} radians.
  	 */
  	public static final Angle ZERO_ANGLE = new Angle(0.0d);
  	
  	private final double value;
  	
  	/**
  	 * @param value the radian value of the angle.
  	 */
  	public Angle(double value) {
  		this.value = value;
  	}
  
  	/**
  	 * Creates a new angle based on a degree value.
  	 * @param value the degree value of the angle.
  	 * @return the new angle.
  	 */
  	public static Angle degreeAngle(double value) {
  		return new Angle(Math.toRadians(value));
  	}
  	
  	/**
  	 * @return the radian value of the angle.
  	 */
  	public double getValue() {
  		return value;
  	}
  	
  	/**
  	 * @return the degree value of the angle.
  	 */
  	public double getDegreeValue() {
  		return Math.toDegrees(value);
  	}
  
  	@Override
  	public int compareTo(Angle o) {
  		if (Util.compareDoubles(this.value,o.value)) return 0;
  		if (this.value < o.value) return -1;
  		return 1;
  	}
  }
  