package mikera.transformz;
import mikera.matrixx.AMatrix;
import mikera.vectorz.AVector;
/**
* General purpose MxN affine transformation, composed of a matrix and translation.
*
* @author Mike
*/
public final class AffineMN extends AAffineTransform {
private final AMatrix matrix;
private final ATranslation translation;
private final int inputDimensions;
private final int outputDimensions;
public AffineMN(AMatrix matrix, ATranslation translation) {
this.matrix=matrix;
this.translation=translation;
inputDimensions=matrix.columnCount();
outputDimensions=matrix.rowCount();
if (outputDimensions!=translation.inputDimensions()) {
throw new IllegalArgumentException("matrix and translation have incompatible dimensionality");
}
}
public AffineMN(AAffineTransform at) {
this(at.getMatrix().toMutableMatrix(),at.getTranslation().toMutableTranslation());
}
public AffineMN(AMatrix m, AVector v) {
this(m,Transformz.createTranslation(v));
}
@Override
public void composeWith(ATransform trans) {
if (trans instanceof AffineMN) {
composeWith((AffineMN)trans);
return;
}
super.composeWith(trans);
}
public void composeWith(AffineMN trans) {
super.composeWith(trans);
}
@Override
public AMatrix getMatrix() {
return matrix;
}
@Override
public ATranslation getTranslation() {
return translation;
}
@Override
public void transform(AVector source, AVector dest) {
matrix.transform(source,dest);
translation.transformInPlace(dest);
}
@Override
public int inputDimensions() {
return inputDimensions;
}
@Override
public int outputDimensions() {
return outputDimensions;
}
}