package nl.tudelft.simulation.language.d2; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import org.djutils.draw.bounds.Bounds2d; import org.junit.Test; import nl.tudelft.simulation.language.d2.DirectionalLine.Side; /** * D2Test.java.
*
* Copyright (c) 2003-2021 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See * for project information www.simulation.tudelft.nl. The * source code and binary code of this software is proprietary information of Delft University of Technology. * @author Alexander Verbraeck */ public class D2Test { /** * Angle test. */ @Test public final void angleTest() { assertEquals(0.0, Angle.normalize2Pi(0.0), 0.001); assertEquals(0.0, Angle.normalizePi(0.0), 0.001); assertEquals(Math.PI / 2.0, Angle.normalize2Pi(Math.PI / 2.0), 0.001); assertEquals(Math.PI / 2.0, Angle.normalizePi(Math.PI / 2.0), 0.001); assertEquals(Math.PI, Angle.normalize2Pi(Math.PI), 0.001); assertTrue(Math.abs(Math.abs(Angle.normalizePi(Math.PI)) - Math.PI) < 0.001); assertEquals(1.5 * Math.PI, Angle.normalize2Pi(1.5 * Math.PI), 0.001); assertEquals(-0.5 * Math.PI, Angle.normalizePi(1.5 * Math.PI), 0.001); assertEquals(0.0, Angle.normalize2Pi(2.0 * Math.PI), 0.001); assertEquals(0.0 * Math.PI, Angle.normalizePi(2.0 * Math.PI), 0.001); assertEquals(1.5 * Math.PI, Angle.normalize2Pi(-0.5 * Math.PI), 0.001); assertEquals(-0.5 * Math.PI, Angle.normalizePi(-0.5 * Math.PI), 0.001); } /** * Circle test. */ @Test public final void circleTest() { Point2D p00 = new Point2D.Double(0.0, 0.0); Point2D p20 = new Point2D.Double(2.0, 0.0); Point2D[] intersect = Circle.intersection(p00, 1.0, p00, 2.0); assertEquals(0, intersect.length); intersect = Circle.intersection(p00, 1.0, p20, 1.0); assertEquals(1, intersect.length); assertEquals(1.0, intersect[0].getX(), 0.001); assertEquals(0.0, intersect[0].getY(), 0.001); intersect = Circle.intersection(p00, 2.0, p20, 2.0); assertEquals(2, intersect.length); int up = intersect[0].getY() > 0 ? 0 : 1; assertEquals(1.0, intersect[up].getX(), 0.001); assertEquals(Math.sqrt(3.0), intersect[up].getY(), 0.001); assertEquals(1.0, intersect[1 - up].getX(), 0.001); assertEquals(-Math.sqrt(3.0), intersect[1 - up].getY(), 0.001); } /** * DirectionalLine test. */ @Test public final void directionalLineTest() { DirectionalLine l0010 = new DirectionalLine(0.0, 0.0, 1.0, 0.0); assertEquals(0.0, l0010.x1, 0.001); assertEquals(0.0, l0010.y1, 0.001); assertEquals(1.0, l0010.x2, 0.001); assertEquals(0.0, l0010.y2, 0.001); float f0 = 0.0f; float f1 = 1.0f; DirectionalLine l0010a = new DirectionalLine(f0, f0, f1, f0); DirectionalLine l0010b = new DirectionalLine(1.0, 0.0, 0.0, 0.0); assertTrue(l0010.equalsCoordinates(l0010a)); assertFalse(l0010.equalsCoordinates(l0010b)); assertTrue(l0010.equalsCoordinatesIgnoreOrder(l0010b)); l0010b.flip(); assertTrue(l0010.equalsCoordinates(l0010a)); assertTrue(l0010.equalsCoordinates(l0010b)); assertTrue(l0010.equalsCoordinatesIgnoreOrder(l0010b)); assertEquals(0.0, l0010.getNormalx(), 0.001); assertEquals(1.0, l0010.getNormaly(), 0.001); DirectionalLine l0022 = new DirectionalLine(0.0, 0.0, 2.0, 2.0); assertFalse(l0010.equalsCoordinates(l0022)); assertEquals(-2.0, l0022.getNormalx(), 0.001); assertEquals(2.0, l0022.getNormaly(), 0.001); l0022.normalize(); assertEquals(-0.5 * Math.sqrt(2.0), l0022.getNormalx(), 0.001); assertEquals(0.5 * Math.sqrt(2.0), l0022.getNormaly(), 0.001); assertEquals("(0.0,0.0)->(1.0,0.0)", l0010.toString()); assertEquals(1.0, l0022.getLineThickness(), 0.001); l0022.setLineThickness(0.1); assertEquals(0.1, l0022.getLineThickness(), 0.001); DirectionalLine l0111 = new DirectionalLine(0.0, 1.0, 1.0, 1.0); assertEquals(-1.0, l0010.getIntersection(l0111), 0.001); assertEquals(-1.0, l0010.getIntersection(l0010), 0.001); DirectionalLine l2002 = new DirectionalLine(2.0, 0.0, 0.0, 2.0); assertEquals(0.5, l0022.getIntersection(l2002), 0.001); Point2D intersection = l0022.getIntersectionPoint(l2002); assertEquals(1.0, intersection.getX(), 0.001); assertEquals(1.0, intersection.getY(), 0.001); assertEquals(Side.COLLINEAR, l0010.getSideThick(0.5, 0.0)); assertEquals(Side.COLLINEAR, l0010.getSideThin(0.5, 0.0)); assertEquals(Side.COLLINEAR, l0010.getSideThick(0.5, 0.01)); assertEquals(Side.COLLINEAR, l0010.getSideThick(0.5, -0.01)); assertNotEquals(Side.COLLINEAR, l0010.getSideThin(0.5, 0.01)); assertNotEquals(Side.COLLINEAR, l0010.getSideThin(0.5, -0.01)); assertNotEquals(Side.COLLINEAR, l0010.getSideThick(0.5, 5.0)); assertNotEquals(Side.COLLINEAR, l0010.getSideThick(0.5, -5.0)); assertEquals(Side.FRONTSIDE, l0010.getSideThick(0.5, 5.0)); assertEquals(Side.BACKSIDE, l0010.getSideThick(0.5, -5.0)); assertEquals(Side.FRONTSIDE, l0010.getSideThin(0.5, 5.0)); assertEquals(Side.BACKSIDE, l0010.getSideThin(0.5, -5.0)); assertEquals(Side.COLLINEAR, l0010.getSide(l0010)); assertEquals(Side.COLLINEAR, l0010.getSide(l0010b)); assertEquals(Side.FRONTSIDE, l0010.getSide(new DirectionalLine(0.0, 1.0, 1.0, 1.0))); assertEquals(Side.BACKSIDE, l0010.getSide(new DirectionalLine(0.0, -1.0, 1.0, -1.0))); assertEquals(Side.SPANNING, l0010.getSide(new DirectionalLine(0.5, -1.0, 0.5, 1.0))); assertEquals(Side.FRONTSIDE, l0010.getSide(new DirectionalLine(0.5, 1.0, 0.5, 0.0))); assertEquals(Side.BACKSIDE, l0010.getSide(new DirectionalLine(0.5, -1.0, 0.5, 0.0))); assertEquals(Side.FRONTSIDE, l0010.getSide(new DirectionalLine(0.5, 0.0, 0.5, 1.0))); assertEquals(Side.BACKSIDE, l0010.getSide(new DirectionalLine(0.5, 0.0, 0.5, -1.0))); assertNotEquals(0, l0010.getSideThick(0.5, -5.0).getValue()); assertEquals(1, l0010.getSideThick(0.5, 5.0).getValue()); assertEquals(-1, l0010.getSideThick(0.5, -5.0).getValue()); } /** * Shape test (screen coordinates). */ @Test public final void shapeTest() { Rectangle2D r0011 = new Rectangle2D.Double(0.0, 0.0, 1.0, 1.0); Rectangle2D r1122 = new Rectangle2D.Double(1.0, 1.0, 1.0, 1.0); Rectangle2D r0033 = new Rectangle2D.Double(0.0, 0.0, 3.0, 3.0); assertTrue(Shape.contains(r1122, r0033)); assertFalse(Shape.contains(r0033, r1122)); assertTrue(Shape.contains(r0011, r0033)); assertFalse(Shape.contains(r0033, r0011)); assertFalse(Shape.intersects(r1122, r0033)); assertFalse(Shape.intersects(r0033, r1122)); assertTrue(Shape.overlaps(r1122, r0033)); assertTrue(Shape.overlaps(r0033, r1122)); assertTrue(Shape.overlaps(r0011, r1122)); // one point in common... assertTrue(Shape.intersects(r0011, r1122)); // one point in common... Rectangle2D r4455 = new Rectangle2D.Double(4.0, 4.0, 1.0, 1.0); assertFalse(Shape.overlaps(r0011, r4455)); assertFalse(Shape.contains(r0011, r4455)); assertFalse(Shape.intersects(r0011, r4455)); Rectangle2D r2244 = new Rectangle2D.Double(2.0, 2.0, 2.0, 2.0); assertTrue(Shape.overlaps(r2244, r0033)); assertFalse(Shape.contains(r2244, r0033)); assertFalse(Shape.contains(r0033, r2244)); assertTrue(Shape.intersects(r2244, r0033)); } /** * Shape2d test (world coordinates). */ @Test public final void shape2dTest() { Bounds2d r0011 = new Bounds2d(0.0, 1.0, 0.0, 1.0); Bounds2d r1122 = new Bounds2d(1.0, 2.0, 1.0, 2.0); Bounds2d r0033 = new Bounds2d(0.0, 3.0, 0.0, 3.0); assertTrue(Shape2d.contains(r1122, r0033)); assertFalse(Shape2d.contains(r0033, r1122)); assertTrue(Shape2d.contains(r0011, r0033)); assertFalse(Shape2d.contains(r0033, r0011)); assertFalse(Shape2d.intersects(r1122, r0033)); assertFalse(Shape2d.intersects(r0033, r1122)); assertTrue(Shape2d.overlaps(r1122, r0033)); assertTrue(Shape2d.overlaps(r0033, r1122)); assertTrue(Shape2d.overlaps(r0011, r1122)); // one point in common... assertTrue(Shape2d.intersects(r0011, r1122)); // one point in common... Bounds2d r4455 = new Bounds2d(4.0, 5.0, 4.0, 5.0); assertFalse(Shape2d.overlaps(r0011, r4455)); assertFalse(Shape2d.contains(r0011, r4455)); assertFalse(Shape2d.intersects(r0011, r4455)); Bounds2d r2244 = new Bounds2d(2.0, 4.0, 2.0, 4.0); assertTrue(Shape2d.overlaps(r2244, r0033)); assertFalse(Shape2d.contains(r2244, r0033)); assertFalse(Shape2d.contains(r0033, r2244)); assertTrue(Shape2d.intersects(r2244, r0033)); } }