/*
* JBox2D - A Java Port of Erin Catto's Box2D
*
* JBox2D homepage: http://jbox2d.sourceforge.net/
* Box2D homepage: http://www.box2d.org
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/
package org.jbox2d.common;
/**
* Primarily for internal use.
*
* Describes the motion of a body/shape for TOI computation.
* Shapes are defined with respect to the body origin, which may
* not coincide with the center of mass. However, to support dynamics
* we must interpolate the center of mass position.
*
*/
public class Sweep {
/** Local center of mass position */
public Vec2 localCenter;
/** Center world positions */
public Vec2 c0, c;
/** World angles */
public float a0, a;
/** Time interval = [t0,1], where t0 is in [0,1] */
public float t0;
public String toString() {
String s = "Sweep:\nlocalCenter: "+localCenter+"\n";
s += "c0: "+c0+", c: "+c+"\n";
s += "a0: "+a0+", a: "+a+"\n";
s += "t0: "+t0+"\n";
return s;
}
public Sweep() {
localCenter = new Vec2();
c0 = new Vec2();
c = new Vec2();
}
/**
* Get the interpolated transform at a specific time.
* @param xf the result is placed here - must not be null
* @param t the normalized time in [0,1].
*/
public void getXForm(XForm xf, float t) {
//assert(xf != null);
//if (xf == null)
// xf = new XForm();
// center = p + R * localCenter
if (1.0f - t0 > Settings.EPSILON) {
float alpha = (t - t0) / (1.0f - t0);
xf.position.x = (1.0f - alpha) * c0.x + alpha * c.x;
xf.position.y = (1.0f - alpha) * c0.y + alpha * c.y;
float angle = (1.0f - alpha) * a0 + alpha * a;
xf.R.set(angle);
} else {
xf.position.set(c);
xf.R.set(a);
}
// Shift to origin
xf.position.subLocal(Mat22.mul(xf.R, localCenter));
}
/**
* Advance the sweep forward, yielding a new initial state.
* @param t the new initial time.
*/
public void advance(float t) {
if (t0 < t && 1.0f - t0 > Settings.EPSILON) {
float alpha = (t - t0) / (1.0f - t0);
c0.x = (1.0f - alpha) * c0.x + alpha * c.x;
c0.y = (1.0f - alpha) * c0.y + alpha * c.y;
a0 = (1.0f - alpha) * a0 + alpha * a;
t0 = t;
}
}
}