/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/
package edu.stanford.rsl.conrad.geometry.motion;
import java.util.ArrayList;
import edu.stanford.rsl.conrad.geometry.General;
import edu.stanford.rsl.conrad.geometry.motion.timewarp.TimeWarper;
import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
import edu.stanford.rsl.conrad.numerics.SimpleOperators;
import edu.stanford.rsl.conrad.numerics.SimpleVector;
/**
* Class to project a MotionField onto a plane. Any off-plane motion is inhibited.
*
* @author akmaier
*
*/
public class PlanarMotionField extends SimpleMotionField {
/**
*
*/
private static final long serialVersionUID = -7264620135393212142L;
private SimpleVector normal;
private MotionField fullMotion;
public PlanarMotionField (MotionField fullMotion, SimpleVector planeNormal){
this.fullMotion = fullMotion;
normal = planeNormal.normalizedL2();
// normal = planeNormal;
// normal.multiplyBy(1.0 / planeNormal.normL2());
}
@Override
public PointND getPosition(PointND initialPosition, double initialTime,
double time) {
PointND newPosition = fullMotion.getPosition(initialPosition, initialTime, time);
return convertToPlanarMotionPosition(initialPosition, newPosition);
}
private PointND convertToPlanarMotionPosition(PointND initialPosition, PointND newPosition){
SimpleVector shift = SimpleOperators.subtract(newPosition.getAbstractVector(), initialPosition.getAbstractVector());
SimpleVector inPlaneShift = General.crossProduct(normal, General.crossProduct(shift, normal));
PointND newPositionPlanarMotion = initialPosition.clone();
newPositionPlanarMotion.getAbstractVector().add(inPlaneShift);
return newPositionPlanarMotion;
}
@Override
public ArrayList<PointND> getPositions(PointND initialPosition, double initialTime,
double ... times) {
ArrayList<PointND> newPositions = fullMotion.getPositions(initialPosition, initialTime, times);
ArrayList<PointND> planarPositions = new ArrayList<PointND>();
for (int i = 0; i < newPositions.size(); i++){
planarPositions.add(convertToPlanarMotionPosition(initialPosition, newPositions.get(i)));
}
return planarPositions;
}
@Override
public TimeWarper getTimeWarper(){
return fullMotion.getTimeWarper();
}
@Override
public void setTimeWarper(TimeWarper warp){
fullMotion.setTimeWarper(warp);
}
}