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("Unexpected deltaX: '" + pDeltaX + "' deltaY: '" + pDeltaY + "'."); } // =========================================================== // 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 // =========================================================== }