/** * Used with serialization. Not to be called manually. * * @param in * ObjectInput * @throws IOException * @throws ClassNotFoundException */ @Override public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { setA((Vector3) in.readObject()); setB((Vector3) in.readObject()); setC((Vector3) in.readObject()); setIndex(in.readInt()); }
@Override public Triangle clone() { return new Triangle(this); }
/** * Sets a point to a new value. * * @param index * the index of the point to set (0-2, corresponding to A-C) * @param point * the new value * @throws IllegalArgumentException * if index is not in [0, 2] */ public void set(final int index, final ReadOnlyVector3 point) { switch (index) { case 0: setA(point); return; case 1: setB(point); return; case 2: setC(point); return; } throw new IllegalArgumentException("index must be 0, 1 or 2 (corresponding to A, B or C.)"); }
@Test public void testGetSet() { final Triangle tri1 = new Triangle(); assertEquals(Vector3.ZERO, tri1.getA()); assertEquals(Vector3.ZERO, tri1.getB()); assertEquals(Vector3.ZERO, tri1.getC()); assertTrue(tri1.getIndex() == 0); tri1.setA(Vector3.NEG_ONE); tri1.setB(Vector3.UNIT_X); tri1.setC(Vector3.UNIT_Z); tri1.setIndex(1); assertEquals(Vector3.NEG_ONE, tri1.getA()); assertEquals(Vector3.UNIT_X, tri1.getB()); assertEquals(Vector3.UNIT_Z, tri1.getC()); assertTrue(tri1.getIndex() == 1); final Triangle tri2 = new Triangle(tri1); assertEquals(Vector3.NEG_ONE, tri2.getA()); assertEquals(Vector3.UNIT_X, tri2.getB()); assertEquals(Vector3.UNIT_Z, tri2.getC()); assertTrue(tri2.getIndex() == 1); final Triangle tri3 = new Triangle(Vector3.ONE, Vector3.UNIT_Y, Vector3.NEG_ONE); assertEquals(Vector3.ONE, tri3.getA()); assertEquals(Vector3.UNIT_Y, tri3.getB()); assertEquals(Vector3.NEG_ONE, tri3.getC()); assertTrue(tri3.getIndex() == 0); final Triangle tri4 = new Triangle(Vector3.ONE, Vector3.UNIT_Y, Vector3.NEG_ONE, 42);
@Test public void testCenter() { final Triangle tri1 = new Triangle(Vector3.ZERO, Vector3.UNIT_Y, Vector3.UNIT_X, 0); assertEquals(new Vector3(1 / 3., 1 / 3., 0), tri1.getCenter()); // dirty assertEquals(new Vector3(1 / 3., 1 / 3., 0), tri1.getCenter()); // clean tri1.setA(Vector3.ONE); assertEquals(new Vector3(2 / 3., 2 / 3., 1 / 3.), tri1.getCenter()); // dirty, but with existing center }
@Test public void testNormal() { final Triangle tri1 = new Triangle(Vector3.ZERO, Vector3.UNIT_Y, Vector3.UNIT_X, 0); assertEquals(new Vector3(0, 0, -1), tri1.getNormal()); // dirty assertEquals(new Vector3(0, 0, -1), tri1.getNormal()); // clean tri1.setB(Vector3.UNIT_Z); assertEquals(new Vector3(0, 1, 0), tri1.getNormal()); // dirty, but with existing normal } }
@Test public void testValid() { final Triangle vec1 = new Triangle(); final Triangle vec2 = new Triangle(new Vector3(0, 0, Double.NaN), Vector3.ZERO, Vector3.ZERO); final Triangle vec3 = new Triangle(Vector3.ZERO, new Vector3(0, 0, Double.NaN), Vector3.ZERO); final Triangle vec4 = new Triangle(Vector3.ZERO, Vector3.ZERO, new Vector3(0, 0, Double.NaN)); assertTrue(Triangle.isValid(vec1)); assertFalse(Triangle.isValid(vec2)); assertFalse(Triangle.isValid(vec3)); assertFalse(Triangle.isValid(vec4)); vec4.setC(Vector3.ZERO); assertTrue(Triangle.isValid(vec4)); assertFalse(Triangle.isValid(null)); }
@Test public void testEquals() { // couple of equals validity tests final Triangle tri1 = new Triangle(); assertEquals(tri1, tri1); assertFalse(tri1.equals(null)); assertFalse(tri1.equals(new Vector2())); // throw in a couple pool accesses for coverage final Triangle tri2 = Triangle.fetchTempInstance(); tri2.set(tri1); assertEquals(tri1, tri2); assertNotSame(tri1, tri2); Triangle.releaseTempInstance(tri2); // cover more of equals assertTrue(tri1.equals(new Triangle(Vector3.ZERO, Vector3.ZERO, Vector3.ZERO))); assertFalse(tri1.equals(new Triangle(Vector3.ZERO, Vector3.ZERO, Vector3.UNIT_X))); assertFalse(tri1.equals(new Triangle(Vector3.ZERO, Vector3.UNIT_X, Vector3.UNIT_X))); assertFalse(tri1.equals(new Triangle(Vector3.ZERO, Vector3.UNIT_X, Vector3.ZERO))); assertFalse(tri1.equals(new Triangle(Vector3.UNIT_X, Vector3.ZERO, Vector3.ZERO))); assertFalse(tri1.equals(new Triangle(Vector3.UNIT_X, Vector3.ZERO, Vector3.UNIT_X))); assertFalse(tri1.equals(new Triangle(Vector3.UNIT_X, Vector3.UNIT_X, Vector3.ZERO))); assertFalse(tri1.equals(new Triangle(Vector3.UNIT_X, Vector3.UNIT_X, Vector3.UNIT_X))); }
@Test public void testSimpleHash() { // Just a simple sanity check. final Triangle tri1 = new Triangle(Vector3.ZERO, Vector3.UNIT_Y, Vector3.NEG_ONE, 1); final Triangle tri2 = new Triangle(Vector3.ZERO, Vector3.UNIT_Y, Vector3.NEG_ONE, 1); final Triangle tri3 = new Triangle(Vector3.ZERO, Vector3.UNIT_Z, Vector3.NEG_ONE, 2); assertTrue(tri1.hashCode() == tri2.hashCode()); assertTrue(tri1.hashCode() != tri3.hashCode()); }
/** * Used with serialization. Not to be called manually. * * @param out * ObjectOutput * @throws IOException */ @Override public void writeExternal(final ObjectOutput out) throws IOException { out.writeObject(_pointA); out.writeObject(_pointB); out.writeObject(_pointC); out.writeInt(getIndex()); }
/** * Sets a point to a new value. * * @param index * the index of the point to set (0-2, corresponding to A-C) * @param point * the new value * @throws IllegalArgumentException * if index is not in [0, 2] */ public void set(final int index, final ReadOnlyVector3 point) { switch (index) { case 0: setA(point); return; case 1: setB(point); return; case 2: setC(point); return; } throw new IllegalArgumentException("index must be 0, 1 or 2 (corresponding to A, B or C.)"); }
/** * Used with serialization. Not to be called manually. * * @param out * ObjectOutput * @throws IOException */ @Override public void writeExternal(final ObjectOutput out) throws IOException { out.writeObject(_pointA); out.writeObject(_pointB); out.writeObject(_pointC); out.writeInt(getIndex()); }