package mikera.transformz.impl;
import mikera.matrixx.AMatrix;
import mikera.matrixx.Matrixx;
import mikera.randomz.Hash;
import mikera.transformz.ATranslation;
import mikera.vectorz.AVector;
import mikera.vectorz.Vector;
import mikera.vectorz.Vectorz;
/**
* Immutable identity translation
*
* @author Mike
*
*/
public final class IdentityTranslation extends ATranslation {
private static final int INSTANCE_COUNT=6;
private final int dimensions;
private IdentityTranslation(int dims) {
this.dimensions=dims;
}
private static final IdentityTranslation[] INSTANCES=new IdentityTranslation[INSTANCE_COUNT];
static {
for (int i=0; i<INSTANCE_COUNT; i++) {
INSTANCES[i]=new IdentityTranslation(i);
}
}
public static IdentityTranslation create(int i) {
if (i<INSTANCE_COUNT) return INSTANCES[i];
return new IdentityTranslation(i);
}
@Override
public AMatrix getMatrix() {
return Matrixx.createImmutableIdentityMatrix(dimensions);
}
@Override
public ATranslation getTranslation() {
return this;
}
@Override
public void transform(AVector source, AVector dest) {
dest.set(source);
}
@Override
public Vector transform(AVector source) {
return source.toVector();
}
@Override
public void transformInPlace(AVector v) {
// no change!
}
@Override
public double calculateElement(int i, AVector v) {
return v.get(i);
}
@Override
public boolean isIdentity() {
return true;
}
@Override
public int inputDimensions() {
return dimensions;
}
@Override
public int outputDimensions() {
return dimensions;
}
@Override
public AVector getTranslationVector() {
return Vectorz.immutableZeroVector(dimensions);
}
@Override
public int hashCode() {
return Hash.zeroVectorHash(dimensions);
}
}