package edu.stanford.rsl.conrad.geometry.motion; import edu.stanford.rsl.conrad.geometry.transforms.AffineTransform; import edu.stanford.rsl.conrad.geometry.transforms.Transform; import edu.stanford.rsl.conrad.numerics.DoubleFunction; import edu.stanford.rsl.conrad.numerics.SimpleMatrix; import edu.stanford.rsl.conrad.numerics.SimpleOperators; import edu.stanford.rsl.conrad.numerics.SimpleVector; /** * MotionField to handle affine rotation and affine modulated translational motion. * The motion paramters, i.e. angle, axis, translation, can be given as lambda expressions or method references * * @author berger * */ public abstract class AnalyticalAffineMotionField extends AbstractAffineMotionField { /** * */ private static final long serialVersionUID = -7314670417660902689L; protected SimpleMatrix preTransform; protected SimpleMatrix postTransform; public void setPostTransform(SimpleMatrix postTransform) { this.postTransform = postTransform; } public SimpleMatrix getPostTransform() { return postTransform; } public void setPreTransform(SimpleMatrix preTransform) { this.preTransform = preTransform; } public SimpleMatrix getPreTransform() { return preTransform; } @Override public Transform getTransform(double initialTime, double time) { SimpleMatrix variableTransform = getAffineMatrix(initialTime, time); if(preTransform!=null) variableTransform=SimpleOperators.multiplyMatrixProd(variableTransform, preTransform); if(postTransform!=null) variableTransform=SimpleOperators.multiplyMatrixProd(postTransform, variableTransform); int rows = variableTransform.getRows(); int cols = variableTransform.getCols(); variableTransform.divideBy(variableTransform.getElement(rows-1, cols-1)); return new AffineTransform(variableTransform.getSubMatrix(rows-1, cols-1),variableTransform.getSubCol(0, cols-1, rows-1)); } public abstract SimpleMatrix getAffineMatrix(double initialTime, double time); protected SimpleVector evaluateFunctionArray(DoubleFunction[] array, double arg){ SimpleVector out = new SimpleVector(array.length); for (int i = 0; i < array.length; i++) { out.setElementValue(i, array[i].f(arg)); } return out; } } /* * Copyright (C) 2010-2014 Martin Berger * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */