@SuppressWarnings({"EqualsBetweenInconvertibleTypes", "ObjectEqualsNull"}) @Test public void testEquals() { final Vector3 v1 = new Vector3(1d, 2d, 3d); final Vector3 v2 = new Vector3(1d, 2d, 3d); final Vector3 v3 = new Vector3(4d, 5d, 6d); final Vector3 v4 = new Vector3(1d, 5d, 6d); final Vector3 v5 = new Vector3(1d, 2d, 6d); assertTrue(v1.equals(v2)); assertFalse(v1.equals(v3)); assertFalse(v1.equals(v4)); assertFalse(v1.equals(v5)); assertFalse(v1.equals("WRONG")); assertFalse(v1.equals(null)); }
@Test public void testEqualsWithError() { final Vector3 v1 = new Vector3(1d, 2d, 3d); final Vector3 v2 = new Vector3(1d, 2d, 3d); final Vector3 v3 = new Vector3(4d, 5d, 6d); final Vector3 v4 = new Vector3(1d, 5d, 6d); final Vector3 v5 = new Vector3(1d, 2d, 6d); final Vector3 v6 = new Vector3(1.1d, 2d, 3d); final Vector3 v7 = new Vector3(1.1d, 2.1d, 3d); final Vector3 v8 = new Vector3(1.1d, 2.1d, 3.1d); assertTrue(v1.equals(v2, 0d)); assertFalse(v1.equals(v3, 1d)); assertFalse(v1.equals(v4, 1d)); assertFalse(v1.equals(v5, 1d)); assertTrue(v1.equals(v6, 0.2)); assertTrue(v1.equals(v7, 0.2)); assertTrue(v1.equals(v8, 0.2)); }
/** * Sets the world axis values after checking that they are all orthogonal to each other. The check performed * is to verify that the cross product between {@code right} and {@code up} is equivilant to {@code forward} * withing 1ppm error on each component. * * @param right {@link Vector3} The desired right vector. Must be normalized. * @param up {@link Vector3} The desired up vector. Must be normalized. * @param forward {@link Vector3} The desired forward vector. Must be normalized. */ public static void setWorldAxes(Vector3 right, Vector3 up, Vector3 forward) { TEMP_VECTOR.crossAndSet(right, up); if (!TEMP_VECTOR.equals(forward, 1e-6)) { throw new IllegalArgumentException("World axes must be orthogonal."); } RIGHT_AXIS.setAll(right); NEG_RIGHT_AXIS.setAll(RIGHT_AXIS).inverse(); UP_AXIS.setAll(up); NEG_UP_AXIS.setAll(UP_AXIS).inverse(); FORWARD_AXIS.setAll(forward); NEG_FORWARD_AXIS.setAll(FORWARD_AXIS).inverse(); } }
@Test public void testGetScalingNoArgs() { final double[] from = new double[]{ 1d, 0d, 0d, 0d, 0d, 2d, 0d, 0d, 0d, 0d, 3d, 0d, 0d, 0d, 0d, 1d }; final Vector3 expected = new Vector3(1, 2, 3); final Matrix4 m = new Matrix4(from); final Vector3 out = m.getScaling(); assertNotNull(out); assertTrue(expected.equals(out, 1e-14)); }
@Test public void testGetTranslation() { final double[] from = new double[]{ 1d, 0d, 0d, 0d, // Col 0 0d, 2d, 0d, 0d, // Col 1 0d, 0d, 3d, 0d, // Col 2 1d, 2d, 3d, 1d // Col 3 }; final Vector3 expected = new Vector3(1, 2, 3); final Matrix4 m = new Matrix4(from); final Vector3 out = m.getTranslation(); assertNotNull(out); assertTrue(expected.equals(out, 1e-14)); }
@Test public void testGetScalingInVector3() { final double[] from = new double[]{ 1d, 0d, 0d, 0d, 0d, 2d, 0d, 0d, 0d, 0d, 3d, 0d, 0d, 0d, 0d, 1d }; final Vector3 expected = new Vector3(1, 2, 3); final Vector3 setIn = new Vector3(0, 0, 0); final Matrix4 m = new Matrix4(from); final Vector3 out = m.getScaling(setIn); assertNotNull(out); assertTrue(out == setIn); assertTrue(expected.equals(out, 1e-14)); }
/** * Sets the world axis values after checking that they are all orthogonal to each other. The check performed * is to verify that the cross product between {@code right} and {@code up} is equivilant to {@code forward} * withing 1ppm error on each component. * * @param right {@link Vector3} The desired right vector. Must be normalized. * @param up {@link Vector3} The desired up vector. Must be normalized. * @param forward {@link Vector3} The desired forward vector. Must be normalized. */ public static void setWorldAxes(Vector3 right, Vector3 up, Vector3 forward) { TEMP_VECTOR.crossAndSet(right, up); if (!TEMP_VECTOR.equals(forward, 1e-6)) { throw new IllegalArgumentException("World axes must be orthogonal."); } RIGHT_AXIS.setAll(right); NEG_RIGHT_AXIS.setAll(RIGHT_AXIS).inverse(); UP_AXIS.setAll(up); NEG_UP_AXIS.setAll(UP_AXIS).inverse(); FORWARD_AXIS.setAll(forward); NEG_FORWARD_AXIS.setAll(FORWARD_AXIS).inverse(); } }