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
// ===========================================================
}