/** * Calculates the <i>multiplicative inverse</i> <code>Q<sup>-1</sup></code> of this quaternion <code>Q</code> such * that <code>QQ<sup>-1</sup> = [0,0,0,1]</code> (the identity quaternion). Note that for unit quaternions, a * quaternion's inverse is equal to its (far easier to calculate) conjugate. * * @param store * the <code>Quaternion</code> to store the result in. If <code>null</code>, a new one is created. * @see #conjugate(Quaternion) * @return the multiplicative inverse of this quaternion. */ public Quaternion invert(Quaternion store) { if (store == null) { store = new Quaternion(); } final double magnitudeSQ = magnitudeSquared(); conjugate(store); if (Math.abs(1.0 - magnitudeSQ) <= MathUtils.EPSILON) { return store; } else { return store.multiplyLocal(1.0 / magnitudeSQ); } }
/** * Calculates the <i>multiplicative inverse</i> <code>Q<sup>-1</sup></code> of this quaternion <code>Q</code> such * that <code>QQ<sup>-1</sup> = [0,0,0,1]</code> (the identity quaternion). Note that for unit quaternions, a * quaternion's inverse is equal to its (far easier to calculate) conjugate. * * @param store * the <code>Quaternion</code> to store the result in. If <code>null</code>, a new one is created. * @see #conjugate(Quaternion) * @return the multiplicative inverse of this quaternion. */ public Quaternion invert(Quaternion store) { if (store == null) { store = new Quaternion(); } final double magnitudeSQ = magnitudeSquared(); conjugate(store); if (Math.abs(1.0 - magnitudeSQ) <= MathUtils.EPSILON) { return store; } else { return store.multiplyLocal(1.0 / magnitudeSQ); } }
@Test public void testInvert() { final Quaternion quat1 = new Quaternion(0, 1, 2, 3); final Quaternion quat2 = quat1.invert(null); assertEquals(Quaternion.IDENTITY, quat1.multiply(quat2, null)); assertEquals(quat1, quat2.invert(new Quaternion())); assertEquals(quat1, quat2.invertLocal()); // normalized version quat1.fromAngleAxis(MathUtils.QUARTER_PI, Vector3.UNIT_Y); quat1.invert(quat2); assertEquals(Quaternion.IDENTITY, quat1.multiply(quat2, null)); assertEquals(quat1, quat2.invert(new Quaternion())); assertEquals(quat1, quat2.invertLocal()); // conjugate check assertEquals(new Quaternion(-1, -2, -3, 4), new Quaternion(1, 2, 3, 4).conjugate(null)); }