package com.github.davidmoten.rtree.geometry; import static com.github.davidmoten.rtree.geometry.Geometries.point; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; public final class LineTest { private static final double PRECISION = 0.00001; @Test public void testDoesIntersectOtherLine() { Line a = Geometries.line(-1, 0, 1, 0); Line b = Geometries.line(0, -1, 0, 1); assertTrue(Intersects.lineIntersectsLine.call(a, b)); } @Test public void testDoesNotIntersectLine() { Line a = Geometries.line(-1, 0, 1, 0); Line b = Geometries.line(1.1, -1, 1.1, 1); assertFalse(Intersects.lineIntersectsLine.call(a, b)); } @Test public void testDoesIntersectRectangle() { Line a = Geometries.line(-1, 0, 1, 0); Rectangle b = Geometries.rectangle(0.2, -0.5, 0.8, 0.5); assertTrue(Intersects.lineIntersectsRectangle.call(a, b)); } @Test public void testDoesNotIntersectRectangle() { Line a = Geometries.line(-1, 0, 1, 0); Rectangle b = Geometries.rectangle(1.2, -0.5, 1.8, 0.5); assertFalse(Intersects.lineIntersectsRectangle.call(a, b)); } @Test public void testLineIntersectsCircle() { Line a = Geometries.line(-1, 0, 1, 0); Circle c = Geometries.circle(0, 0.5, 1); assertTrue(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineDoesNotIntersectCircle() { Line a = Geometries.line(-1, 0, 1, 0); Circle c = Geometries.circle(0, 0.5, 0.4); assertFalse(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineDoesNotIntersectCircleEast() { Line a = Geometries.line(-1, 0, 1, 0); Circle c = Geometries.circle(1.5, 0, 0.4); assertFalse(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineDoesIntersectCircleEast() { Line a = Geometries.line(-1, 0, 1, 0); Circle c = Geometries.circle(1.5, 0, 0.6); assertTrue(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineDoesNotIntersectCircleWest() { Line a = Geometries.line(-1, 0, 1, 0); Circle c = Geometries.circle(-1.5, 0, 0.4); assertFalse(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineDoesIntersectCircleWest() { Line a = Geometries.line(-1, 0, 1, 0); Circle c = Geometries.circle(-1.5, 0, 0.6); assertTrue(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineDoesNotIntersectCircleNorth() { Line a = Geometries.line(-1, 0, 1, 0); Circle c = Geometries.circle(0, 1.5, 0.4); assertFalse(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineDoesNotIntersectCircleSouth() { Line a = Geometries.line(-1, 0, 1, 0); Circle c = Geometries.circle(0, 1.5, 0.4); assertFalse(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineDoesIntersectCircleSouth() { Line a = Geometries.line(-1, 0, 1, 0); Circle c = Geometries.circle(0, 1.5, 0.6); assertFalse(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineMbr() { Line a = Geometries.line(-2, 3, 1, -1); Rectangle mbr = a.mbr(); assertEquals(-2, mbr.x1(), PRECISION); assertEquals(-1, mbr.y1(), PRECISION); assertEquals(1, mbr.x2(), PRECISION); assertEquals(3, mbr.y2(), PRECISION); } @Test public void testLineSameXWithinCircle() { Line a = Geometries.line(1, 2, 1, 4); Circle c = Geometries.circle(1, 3, 2); assertTrue(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineIsPointWithinCircle() { Line a = Geometries.line(1, 2, 1, 2); Circle c = Geometries.circle(1, 3, 2); assertTrue(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineIsPointOutsideCircle() { Line a = Geometries.line(1, 10, 1, 10); Circle c = Geometries.circle(1, 3, 2); assertFalse(Intersects.lineIntersectsCircle.call(a, c)); } @Test public void testLineDistanceToRectangle() { Line a = Geometries.line(1, 2, 1, 2); Rectangle r = Geometries.rectangle(3, 3, 7, 7); assertEquals(Math.sqrt(5), a.distance(r), PRECISION); } @Test public void testLineDistanceToRectangleIsZeroWhenOneEndIsInside() { Line a = Geometries.line(1, 2, 4, 4); Rectangle r = Geometries.rectangle(3, 3, 7, 7); assertEquals(0, a.distance(r), PRECISION); } @Test public void testLineDistanceToRectangleIsZeroWhenOtherEndIsInside() { Line a = Geometries.line(4, 4, 1, 2); Rectangle r = Geometries.rectangle(3, 3, 7, 7); assertEquals(0, a.distance(r), PRECISION); } @Test public void testLineDistanceToRectangleIsZeroWhenContainsWestEdge() { Line a = Geometries.line(3, 1, 3, 10); Rectangle r = Geometries.rectangle(3, 3, 7, 7); assertEquals(0, a.distance(r), PRECISION); } @Test public void testLineDistanceToRectangleIsZeroWhenContainsNorthEdge() { Line a = Geometries.line(2, 7, 10, 7); Rectangle r = Geometries.rectangle(3, 3, 7, 7); assertEquals(0, a.distance(r), PRECISION); } @Test public void testLineDistanceToRectangleIsZeroWhenContainsSouthEdge() { Line a = Geometries.line(2, 3, 10, 3); Rectangle r = Geometries.rectangle(3, 3, 7, 7); assertEquals(0, a.distance(r), PRECISION); } @Test public void testLineDistanceToRectangleIsZeroWhenContainsEastEdge() { Line a = Geometries.line(7, 1, 7, 10); Rectangle r = Geometries.rectangle(3, 3, 7, 7); assertEquals(0, a.distance(r), PRECISION); } @Test public void testLineDoesNotIntersectsPoint() { assertFalse(Geometries.line(1.5, 1.5, 2.6, 2.5).intersects(point(2, 2))); } @Test public void testLineDoesIntersectPoint() { assertTrue(Geometries.line(1.5, 1.5, 2.5, 2.5).intersects(point(2, 2))); } }