public class

Spiral

extends Object
package org.andengine.util.algorithm;

import org.andengine.util.algorithm.path.Direction;

/**
 * (c) Zynga 2011
 *
 * @author Nicolas Gramlich <ngramlich@zynga.com>
 * @since 22:40:53 - 10.11.2011
 */
public class Spiral {
	// ===========================================================
	// Constants
	// ===========================================================

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

	private final int mCenterX;
	private final int mCenterY;
	private final int mStepSize;

	private int mX;
	private int mY;
	private Direction mDirection;
	private int mDirectionSegmentLength;
	private int mDirectionSegmentIndex;

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

	public Spiral(final int pCenterX, final int pCenterY) {
		this(pCenterX, pCenterY, 1);
	}

	public Spiral(final int pCenterX, final int pCenterY, final int pStepSize) {
		this.mCenterX = pCenterX;
		this.mCenterY = pCenterY;
		this.mStepSize = pStepSize;

		this.mX = pCenterX;
		this.mY = pCenterY;

		/* First step goes to the right. */
		this.mDirection = Direction.RIGHT;

		/* Length of current segment into direction. */
		this.mDirectionSegmentLength = 1;
		this.mDirectionSegmentIndex = 0;
	}

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

	public int getCenterX() {
		return this.mCenterX;
	}

	public int getCenterY() {
		return this.mCenterY;
	}

	public int getX() {
		return this.mX;
	}

	public int getY() {
		return this.mY;
	}

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

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

	public void step() {
		/* Take a step. */
		this.mX += this.mDirection.getDeltaX() * this.mStepSize;
		this.mY += this.mDirection.getDeltaY() * this.mStepSize;

		this.mDirectionSegmentIndex++;

		if (this.mDirectionSegmentIndex == this.mDirectionSegmentLength) {
			/* Finished current segment. */
			this.mDirectionSegmentIndex = 0;

			/* Rotate 90° to the right. */
			this.mDirection = this.mDirection.rotateRight();

			/* When the direction changed to be horizontal, the next segment is going to be one step longer. */
			if (this.mDirection.isHorizontal()) {
				this.mDirectionSegmentLength++;
			}
		}
	}

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