package edu.stanford.rsl.conrad.geometry.splines;
import edu.stanford.rsl.conrad.geometry.AbstractShape;
import edu.stanford.rsl.conrad.geometry.motion.MotionField;
import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
/**
* Implements a time-variant surface. It is composed of a number of Spline surfaces which are generated from the motion field in the constructor.
* In the evaluation of the surface the nearest neighbor of the respective point in time is chosen and a point on its surface is returned.
*
* @author akmaier
*
*/
public class NearestNeighborTimeVariantSurfaceBSpline extends
TimeVariantSurfaceBSpline {
public NearestNeighborTimeVariantSurfaceBSpline(NearestNeighborTimeVariantSurfaceBSpline nnsp){
super(nnsp);
}
public NearestNeighborTimeVariantSurfaceBSpline(
SurfaceBSpline timeInvariant, MotionField motion, int timePoints,
boolean addInitial) {
super(timeInvariant, motion, timePoints, addInitial);
// TODO Auto-generated constructor stub
}
private static final long serialVersionUID = 7390783547660669266L;
public PointND evaluate(double u, double v, double t){
// time is given by the projector or renderer in the range of [0, (#Projections-1)/#Projections]
// to retrieve #Projections time variant shapes we internal = (int) Math.round((t * (tPoints)));
// Because the NearestNeighborTimeVariantSurfaceBSpline is either initialized by
// (1) timePoints = #Projections+1 and addInitial = false
//OR (2) timePoints = #Projections and addInitial = true
// Because of the superclass constructor, both cases yield a tPoints variable of #Projections
int internal = (int) Math.round((t * (tPoints)));
return ((SurfaceBSpline)timeVariantShapes.get(internal)).evaluate(u, v);
}
@Override
public AbstractShape clone() {
return new NearestNeighborTimeVariantSurfaceBSpline(this);
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/