package edu.stanford.rsl.conrad.geometry.motion; import edu.stanford.rsl.conrad.geometry.shapes.simple.Plane3D; import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND; import edu.stanford.rsl.conrad.numerics.SimpleVector; /** * Models a MotionField as two points and a normal vector. The * @author akmaier * */ public class CompressionMotionField extends SimpleMotionField { /** * */ private static final long serialVersionUID = 191865158667227329L; private SimpleVector direction; private PointND min; private PointND max; private double length; public CompressionMotionField (PointND min, PointND max, SimpleVector direction){ length = direction.normL2(); this.direction = direction.dividedBy(length); this.min = min; this.max = max; } @Override public PointND getPosition(PointND initialPosition, double initialTime, double time) { PointND p = initialPosition.clone(); if ( p.get(0) >= min.get(0) && p.get(1) >= min.get(1) && p.get(2) >= min.get(2) && p.get(0) <= max.get(0) && p.get(1) <= max.get(1) && p.get(2) <= max.get(2)){ Plane3D movingBound = new Plane3D(min, direction.clone()); double distance = movingBound.computeDistance(max); if (distance < 0){ movingBound = new Plane3D(max, direction.clone()); distance = movingBound.computeDistance(min); } double movingDistance = movingBound.computeDistance(p); double warpedInit = warp.warpTime(initialTime); double warpedTime = warp.warpTime(time); double difference = warpedTime - warpedInit; p.getAbstractVector().add(direction.multipliedBy(((distance - movingDistance)/distance)*length*(difference))); } return p; } } /* * Copyright (C) 2010-2014 Andreas Maier * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */