package mikera.transformz;
import mikera.matrixx.Matrixx;
import mikera.vectorz.AVector;
/**
* Abstract base class for translations of arbitrary dimensionality.
*
* @author Mike
*/
public abstract class ATranslation extends AAffineTransform {
// =========================================
// Abstract interface
/**
* Gets the vector offset that this translation represents. Not guaranteed to be a reference.
* @return
*/
public abstract AVector getTranslationVector();
// =========================================
// Standard implementations
/**
* Returns the number of dimensions of this translation
*/
public int dimensions() {
return getTranslationVector().length();
}
@Override
public double calculateElement(int i, AVector v) {
return v.unsafeGet(i)+getTranslationComponent(i);
}
public double getTranslationComponent(int i) {
return getTranslationVector().unsafeGet(i);
}
@Override
public void transform(AVector source,AVector dest) {
dest.set(source);
dest.add(getTranslationVector());
}
@Override
public void transformNormal(AVector source, AVector dest) {
// translation does not affect normal
dest.set(source);
}
@Override
public void transformInPlace(AVector v) {
v.add(getTranslationVector());
}
@Override
public AAffineTransform toAffineTransform() {
return new AffineMN(Matrixx.createImmutableIdentityMatrix(dimensions()),this);
}
public ATranslation toMutableTranslation() {
return Transformz.createMutableTranslation(this);
}
/**
* Returns true if this transform is an identity transform
*/
@Override
public boolean isIdentity() {
return getTranslationVector().isZero();
}
public boolean equals(ATranslation a) {
return this.getTranslationVector().equals(a.getTranslationVector());
}
@Override
public boolean equals(AAffineTransform a) {
return this.equals(a.getTranslation())&&
a.getMatrix().isIdentity();
}
@Override
public ATranslation inverse() {
AVector v=getTranslationVector().clone();
v.negate();
return Transformz.createTranslation(v);
}
@Override
public boolean isSquare() {
return true;
}
@Override
public boolean isInvertible() {
return true;
}
@Override
public int hashCode() {
return getTranslationVector().hashCode();
}
}