/** * Interpolation from q0 to q1 for a given alpha = [0, 1] using SLERP. * Computes: resultToPack = q0 (q0^-1 q1)^alpha. */ public void interpolate(double alpha, Quat4d q0, Quat4d q1, Quat4d qInterpolatedToPack) { interpolate(alpha, q0, q1, qInterpolatedToPack, true); }
/** * Interpolation from q0 to q1 for a given alpha = [0, 1] using SLERP. * Computes: resultToPack = q0 (q0^-1 q1)^alpha. */ public void interpolate(double alpha, QuaternionReadOnly q0, QuaternionReadOnly q1, QuaternionBasics qInterpolatedToPack) { interpolate(alpha, q0, q1, qInterpolatedToPack, true); }
@ContinuousIntegrationTest(estimatedDuration = 0.5) @Test(timeout = 30000) public void testInterpolateAgainstQuat4d() throws Exception { QuaternionCalculus quaternionCalculus = new QuaternionCalculus(); Random random = new Random(6546545L); Quaternion q0 = RandomGeometry.nextQuaternion(random); Quaternion q1 = RandomGeometry.nextQuaternion(random); Quaternion expectedQInterpolated = new Quaternion(); Quaternion actualQInterpolated = new Quaternion(); for (double alpha = 0.0; alpha <= 1.0; alpha += 1.0e-6) { expectedQInterpolated.interpolate(q0, q1, alpha); quaternionCalculus.interpolate(alpha, q0, q1, actualQInterpolated); assertTrue(expectedQInterpolated.epsilonEquals(actualQInterpolated, EPSILON)); } } }
quaternionCalculus.interpolate(alpha, initialQuaternionDriftedToPack, finalQuaternionDriftedToPack, qInterpolated, true); quaternionCalculus.interpolate(alpha, initialDrift, finalDrift, interpolatedDrift, false); qInterpolated.multiply(interpolatedDrift, qInterpolated);
quaternionCalculus.interpolate(alpha, initialQuaternionDriftedToPack, finalQuaternionDriftedToPack, qInterpolated, true); quaternionCalculus.interpolate(alpha, initialDrift, finalDrift, interpolatedDrift, false); qInterpolated.mul(interpolatedDrift, qInterpolated);