public final enum

Direction

extends Enum<E extends Enum<E>>
package org.andengine.util.algorithm.path;

/**
 * (c) 2010 Nicolas Gramlich
 * (c) 2011 Zynga Inc.
 * 
 * @author Nicolas Gramlich
 * @since 15:19:11 - 17.08.2010
 */
public enum Direction {
	// ===========================================================
	// Elements
	// ===========================================================

	UP(0, -1),
	DOWN(0, 1),
	LEFT(-1, 0),
	RIGHT(1, 0),
	UP_LEFT(-1, -1),
	UP_RIGHT(1, -1),
	DOWN_LEFT(-1, 1),
	DOWN_RIGHT(1, 1);

	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================

	private final int mDeltaX;
	private final int mDeltaY;

	// ===========================================================
	// Constructors
	// ===========================================================

	private Direction(final int pDeltaX, final int pDeltaY) {
		this.mDeltaX = pDeltaX;
		this.mDeltaY = pDeltaY;
	}

	public static Direction fromDelta(final int pDeltaX, final int pDeltaY) {
		switch(pDeltaX) {
			case -1:
				switch(pDeltaY) {
					case -1:
						return UP_LEFT;
					case 0:
						return LEFT;
					case 1:
						return DOWN_LEFT;
				}
				break;
			case 0:
				switch(pDeltaY) {
					case -1:
						return UP;
					case 1:
						return DOWN;
				}
				break;
			case 1:
				switch(pDeltaY) {
					case -1:
						return UP_RIGHT;
					case 0:
						return RIGHT;
					case 1:
						return DOWN_RIGHT;
				}
				break;
		}
		throw new IllegalArgumentException();
	}

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	public boolean isHorizontal() {
		return this.mDeltaY == 0;
	}

	public boolean isVertical() {
		return this.mDeltaX == 0;
	}

	public int getDeltaX() {
		return this.mDeltaX;
	}

	public int getDeltaY() {
		return this.mDeltaY;
	}

	public Direction rotateLeft() {
		switch(this) {
			case UP:
				return LEFT;
			case UP_RIGHT:
				return UP_LEFT;
			case RIGHT:
				return UP;
			case DOWN_RIGHT:
				return UP_RIGHT;
			case DOWN:
				return UP;
			case DOWN_LEFT:
				return DOWN_RIGHT;
			case LEFT:
				return DOWN;
			case UP_LEFT:
				return DOWN_LEFT;
		}
		throw new IllegalArgumentException();
	}

	public Direction rotateRight() {
		switch(this) {
			case UP:
				return RIGHT;
			case UP_RIGHT:
				return DOWN_RIGHT;
			case RIGHT:
				return DOWN;
			case DOWN_RIGHT:
				return DOWN_LEFT;
			case DOWN:
				return LEFT;
			case DOWN_LEFT:
				return UP_LEFT;
			case LEFT:
				return UP;
			case UP_LEFT:
				return UP_RIGHT;
		}
		throw new IllegalArgumentException();
	}

	public Direction opposite() {
		switch(this) {
			case UP:
				return DOWN;
			case UP_RIGHT:
				return DOWN_LEFT;
			case RIGHT:
				return LEFT;
			case DOWN_RIGHT:
				return UP_LEFT;
			case DOWN:
				return UP;
			case DOWN_LEFT:
				return UP_RIGHT;
			case LEFT:
				return RIGHT;
			case UP_LEFT:
				return DOWN_RIGHT;
		}
		throw new IllegalArgumentException();
	}

	// ===========================================================
	// Methods from SuperClass/Interfaces
	// ===========================================================

	// ===========================================================
	// Methods
	// ===========================================================

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}