diff --git a/util/geometry/src/main/java/jetbrains/jetpad/geometry/DoubleRectangle.java b/util/geometry/src/main/java/jetbrains/jetpad/geometry/DoubleRectangle.java index 22ea5905..81ab101c 100644 --- a/util/geometry/src/main/java/jetbrains/jetpad/geometry/DoubleRectangle.java +++ b/util/geometry/src/main/java/jetbrains/jetpad/geometry/DoubleRectangle.java @@ -17,9 +17,10 @@ import com.google.common.collect.Range; -import java.util.ArrayList; import java.util.List; +import static java.util.Arrays.asList; + public class DoubleRectangle { public static DoubleRectangle span(DoubleVector leftTop, DoubleVector rightBottom) { return new DoubleRectangle(leftTop, rightBottom.subtract(leftTop)); @@ -136,13 +137,36 @@ public double distance(DoubleVector to) { return result; } - public Iterable getParts() { - List result = new ArrayList<>(); - result.add(new DoubleSegment(origin, origin.add(new DoubleVector(dimension.x, 0)))); - result.add(new DoubleSegment(origin, origin.add(new DoubleVector(0, dimension.y)))); - result.add(new DoubleSegment(origin.add(dimension), origin.add(new DoubleVector(dimension.x, 0)))); - result.add(new DoubleSegment(origin.add(dimension), origin.add(new DoubleVector(0, dimension.y)))); - return result; + public DoubleSegment getLeftEdge() { + return new DoubleSegment( + origin, + new DoubleVector(getLeft(), getBottom()) + ); + } + + public DoubleSegment getTopEdge() { + return new DoubleSegment( + origin, + new DoubleVector(getRight(), getTop()) + ); + } + + public DoubleSegment getRightEdge() { + return new DoubleSegment( + origin.add(dimension), + new DoubleVector(getRight(), getTop()) + ); + } + + public DoubleSegment getBottomEdge() { + return new DoubleSegment( + origin.add(dimension), + new DoubleVector(getLeft(), getBottom()) + ); + } + + public List getParts() { + return asList(getTopEdge(), getLeftEdge(), getRightEdge(), getBottomEdge()); } @Override diff --git a/util/geometry/src/test/java/jetbrains/jetpad/geometry/AllTests.java b/util/geometry/src/test/java/jetbrains/jetpad/geometry/AllTests.java index 18d00316..9c1269f5 100644 --- a/util/geometry/src/test/java/jetbrains/jetpad/geometry/AllTests.java +++ b/util/geometry/src/test/java/jetbrains/jetpad/geometry/AllTests.java @@ -21,7 +21,9 @@ @RunWith(Suite.class) @Suite.SuiteClasses({ DistanceTest.class, + DoubleRectangleEdgesTest.class, DoubleRectangleIntersectionTest.class, + DoubleRectangleTest.class, DoubleSegmentIntersectionTest.class, DoubleVectorOperationsTest.class, RectanglesTest.class, diff --git a/util/geometry/src/test/java/jetbrains/jetpad/geometry/DoubleRectangleEdgesTest.java b/util/geometry/src/test/java/jetbrains/jetpad/geometry/DoubleRectangleEdgesTest.java new file mode 100644 index 00000000..9c3bb4a9 --- /dev/null +++ b/util/geometry/src/test/java/jetbrains/jetpad/geometry/DoubleRectangleEdgesTest.java @@ -0,0 +1,60 @@ +package jetbrains.jetpad.geometry; + +import org.junit.Test; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; + +public class DoubleRectangleEdgesTest { + + private static final double LEFT = 5.; + private static final double RIGHT = 15.; + + private static final double TOP = 40.; + private static final double BOTTOM = 60.; + + private static final DoubleVector LEFT_TOP = new DoubleVector(LEFT, TOP); + private static final DoubleVector LEFT_BOTTOM = new DoubleVector(LEFT, BOTTOM); + private static final DoubleVector RIGHT_TOP = new DoubleVector(RIGHT, TOP); + private static final DoubleVector RIGHT_BOTTOM = new DoubleVector(RIGHT, BOTTOM); + + private static final DoubleSegment LEFT_EDGE = edge(LEFT_TOP, LEFT_BOTTOM); + private static final DoubleSegment BOTTOM_EDGE = edge(RIGHT_BOTTOM, LEFT_BOTTOM); + private static final DoubleSegment RIGHT_EDGE = edge(RIGHT_BOTTOM, RIGHT_TOP); + private static final DoubleSegment TOP_EDGE = edge(LEFT_TOP, RIGHT_TOP); + + private static final DoubleRectangle RECTANGLE = new DoubleRectangle(LEFT_TOP, RIGHT_BOTTOM.subtract(LEFT_TOP)); + + @Test + public void getLeftEdge() { + assertEquals(LEFT_EDGE, RECTANGLE.getLeftEdge()); + } + + @Test + public void getTopEdge() { + assertEquals(TOP_EDGE, RECTANGLE.getTopEdge()); + } + + @Test + public void getRightEdge() { + assertEquals(RIGHT_EDGE, RECTANGLE.getRightEdge()); + } + + @Test + public void getBottomEdge() { + assertEquals(BOTTOM_EDGE, RECTANGLE.getBottomEdge()); + } + + @Test + public void getParts() { + assertEquals( + asList(TOP_EDGE, LEFT_EDGE, RIGHT_EDGE, BOTTOM_EDGE), + RECTANGLE.getParts() + ); + } + + private static DoubleSegment edge(DoubleVector start, DoubleVector end) { + return new DoubleSegment(start, end); + } + +} \ No newline at end of file