package mikera.transformz; import mikera.matrixx.AMatrix; import mikera.matrixx.Matrixx; import mikera.vectorz.AVector; import mikera.vectorz.Vectorz; /** * Represents a translation by a fixed vector * * @author Mike */ public final class Translation extends ATranslation { private final AVector translationVector; private final int dimensions; public Translation(AVector source) { translationVector=source; dimensions=source.length(); } public Translation(ATranslation t) { this(Vectorz.create(t.getTranslation().getTranslationVector())); } @Override public double calculateElement(int i, AVector v) { return v.get(i)+translationVector.get(i); } public Translation(double[] v) { dimensions=v.length; translationVector=Vectorz.create(v); } @Override public AVector getTranslationVector() { return translationVector; } @Override public void transform(AVector source,AVector dest) { dest.set(source); dest.add(translationVector); } @Override public void transformInPlace(AVector v) { v.add(translationVector); } @Override public AMatrix getMatrix() { return Matrixx.createImmutableIdentityMatrix(dimensions); } @Override public ATranslation getTranslation() { return this; } @Override public int inputDimensions() { return dimensions; } @Override public int outputDimensions() { return dimensions; } @Override public int dimensions() { return dimensions; } @Override public void composeWith(ATransform t) { if (t instanceof ATranslation) { composeWith((ATranslation) t); return; } super.composeWith(t); } public void composeWith(ATranslation t) { if (t instanceof Translation) { composeWith((Translation) t); return; } AVector v=t.getTranslationVector(); translationVector.add(v); } public void composeWith(Translation t) { assert(t.dimensions()==this.dimensions()); translationVector.add(t.translationVector); } }