package edu.stanford.rsl.conrad.geometry.transforms;
import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
import edu.stanford.rsl.conrad.numerics.SimpleMatrix;
import edu.stanford.rsl.conrad.numerics.SimpleOperators;
import edu.stanford.rsl.conrad.numerics.SimpleVector;
/**
* This is a decorator class for a scale-rotation matrix. it performs a scale-rotate transformation on point and direction vectors.
* @author Rotimi X Ojo
*
*/
public class ScaleRotate extends Transform{
private static final long serialVersionUID = 4514828466172949672L;
private SimpleMatrix scaleRotate = null;
/**
* Initialize a scale-rotation transform using a rotation matrix
* @param t is a scale-rotation matrix
*/
public ScaleRotate(SimpleMatrix t){
scaleRotate = t;
}
/**
* Applies scale-rotate transformation on a given point
* @param point is point to be scale rotated
* @return point y = Ax, where A is the scale-rotate matrix wrapped by this class and x is the point to be rotated.
*/
@Override
public PointND transform(PointND point) {
return new PointND(SimpleOperators.multiply(scaleRotate, point.getAbstractVector()));
}
/**
* Applies scale-rotate transformation on a given direction
* @param dir is direction to be scale rotated.
* @return vector y = Ax, where A is the scale-rotate matrix wrapped by this class and x is the vector to be rotated.
*/
@Override
public SimpleVector transform(SimpleVector dir) {
return SimpleOperators.multiply(scaleRotate, dir);
}
@Override
public Transform inverse() {
return new ScaleRotate(scaleRotate.inverse(SimpleMatrix.InversionType.INVERT_QR));
}
@Override
public Transform clone() {
return new ScaleRotate(scaleRotate.clone());
}
@Override
public SimpleMatrix getData() {
return scaleRotate;
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier, Rotimi X Ojo
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/