package edu.stanford.rsl.conrad.geometry.motion.timewarp; import edu.stanford.rsl.conrad.utils.VisualizationUtil; import edu.stanford.rsl.jpop.utils.UserUtil; /** * Implements a movement with a rest phase. For the x% around t = 0.5, no movement will occur. The remainder is linearly scaled. * The argument of setRestPhase() is a fractional value between 0 and 1. * * @author Chris Schwemmer * */ public class RestPhaseTimeWarper extends TimeWarper { private static final long serialVersionUID = -8951035976077197467L; private double restPhase = 0.2; private double scale = 1.0 / (1.0 - 2.0 * restPhase); @Override public double warpTime(double time) { if (Math.abs(time - 0.5) <= restPhase) return 0.5; else if (time < 0.5 - restPhase) return time * scale; else return time * scale - (scale - 1.0); } public void setRestPhase(double r) { restPhase = r; scale = 1.0 / (1.0 - 2.0 * restPhase); } public double getRestPhase() { return restPhase; } public static void main (String [] args) throws Exception{ RestPhaseTimeWarper warp = new RestPhaseTimeWarper(); double r = UserUtil.queryDouble("Rest Phase in %", 20); warp.setRestPhase(r / 100); double [] values = new double [100]; for (int i =0; i< 100; i++){ values[i] = warp.warpTime(((double)i)/100); } VisualizationUtil.createPlot(values).show(); } } /* * Copyright (C) 2010-2014 Chris Schwemmer * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */