Skip to content

Commit b355e11

Browse files
committed
span for Interval
1 parent 3141ec5 commit b355e11

File tree

8 files changed

+193
-42
lines changed

8 files changed

+193
-42
lines changed

src/main/java/net/itarray/automotion/internal/geometry/Interval.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import java.util.Objects;
44

5-
import static java.lang.String.format;
6-
75
public class Interval {
86
private final Scalar begin;
97
private final Scalar end;
@@ -15,7 +13,14 @@ public Interval(Scalar begin, Scalar end) {
1513

1614
@Override
1715
public String toString() {
18-
return format("[%s, %s[", begin, end);
16+
if (isEmpty()) {
17+
return format("-", "-");
18+
}
19+
return format(begin.toString(), end.toString());
20+
}
21+
22+
private String format(String begin, String end) {
23+
return String.format("[%s, %s[", begin, end);
1924
}
2025

2126
@Override
@@ -44,4 +49,16 @@ public Interval intersect(Interval interval) {
4449
begin.max(interval.begin),
4550
end.min(interval.end));
4651
}
52+
53+
public Interval span(Interval interval) {
54+
if (isEmpty()) {
55+
return interval;
56+
}
57+
if (interval.isEmpty()) {
58+
return this;
59+
}
60+
return new Interval(
61+
begin.min(interval.begin),
62+
end.max(interval.end));
63+
}
4764
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package net.itarray.automotion.tests.geometry;
2+
3+
import net.itarray.automotion.internal.geometry.Interval;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import org.junit.Test;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
public class ContainedIntervalsTest extends TwoIntervalsTest{
10+
11+
public Interval left() {
12+
return new Interval(new Scalar(12), new Scalar(15));
13+
}
14+
15+
public Interval right() {
16+
return new Interval(new Scalar(20), new Scalar(20));
17+
}
18+
19+
@Test
20+
public void haveEmptyIntersection() {
21+
assertThat(right().intersect(left()).isEmpty()).isTrue();
22+
}
23+
24+
@Test
25+
public void haveSpanEqualToTheNonEmptyInterval() {
26+
Interval span = left();
27+
assertThat(right().span(left())).isEqualTo(span);
28+
assertThat(left().span(right())).isEqualTo(span);
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package net.itarray.automotion.tests.geometry;
2+
3+
import net.itarray.automotion.internal.geometry.Interval;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import org.junit.Test;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
public class DisjointIntervalsTest extends TwoIntervalsTest{
10+
11+
public Interval left() {
12+
return new Interval(new Scalar(2), new Scalar(8));
13+
}
14+
15+
public Interval right() {
16+
return new Interval(new Scalar(10), new Scalar(17));
17+
}
18+
19+
@Test
20+
public void haveEmptyIntersection() {
21+
assertThat(right().intersect(left()).isEmpty()).isTrue();
22+
}
23+
24+
@Test
25+
public void haveSpanFromSmallestBeginToLargestEnd() {
26+
Interval span = new Interval(new Scalar(2), new Scalar(17));
27+
assertThat(right().span(left())).isEqualTo(span);
28+
assertThat(left().span(right())).isEqualTo(span);
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package net.itarray.automotion.tests.geometry;
2+
3+
import net.itarray.automotion.internal.geometry.Interval;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import org.junit.Test;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
public class EmptyAndNonEmptyIntervalsTest extends TwoIntervalsTest{
10+
11+
public Interval left() {
12+
return new Interval(new Scalar(12), new Scalar(15));
13+
}
14+
15+
public Interval right() {
16+
return new Interval(new Scalar(10), new Scalar(17));
17+
}
18+
19+
@Test
20+
public void haveIntersectionBeginningAtLargerStartAndEndingAtSmallerEnd() {
21+
assertThat(right().intersect(left())).isEqualTo(new Interval(new Scalar(12), new Scalar(15)));
22+
}
23+
24+
@Test
25+
public void haveSpanFromSmallestBeginToLargestEnd() {
26+
Interval span = new Interval(new Scalar(10), new Scalar(17));
27+
assertThat(right().span(left())).isEqualTo(span);
28+
assertThat(left().span(right())).isEqualTo(span);
29+
}
30+
}

src/test/java/net/itarray/automotion/tests/geometry/IntervalTest.java

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -45,43 +45,4 @@ public void isNotEmpty() {
4545
public void isNotEqualToEmptyIntervals() {
4646
assertThat(interval).isNotEqualTo(new Interval(begin, begin));
4747
}
48-
49-
@Test
50-
public void intersectionWithIntervalBeforeIsEmpty() {
51-
Interval intersection = interval.intersect(new Interval(begin.minus(10), begin.minus(5)));
52-
assertThat(intersection.isEmpty()).isTrue();
53-
}
54-
55-
@Test
56-
public void intersectionWithIntervalBeforeButTouchingIsEmpty() {
57-
Interval intersection = interval.intersect(new Interval(begin.minus(10), begin));
58-
assertThat(intersection.isEmpty()).isTrue();
59-
}
60-
61-
@Test
62-
public void intersectionWithIntervalContainingBeginIsNotEmpty() {
63-
Interval intersection = interval.intersect(new Interval(begin.minus(10), begin.plus(1)));
64-
assertThat(intersection.isEmpty()).isFalse();
65-
assertThat(intersection).isEqualTo(new Interval(begin, begin.plus(1)));
66-
}
67-
68-
@Test
69-
public void intersectionWithIntervalContainingAPointJustBeforeEndIsNotEmpty() {
70-
Interval intersection = interval.intersect(new Interval(end.minus(1), end.plus(10)));
71-
assertThat(intersection.isEmpty()).isFalse();
72-
assertThat(intersection).isEqualTo(new Interval(end.minus(1), end));
73-
}
74-
75-
@Test
76-
public void intersectionWithIntervalAfterIsEmpty() {
77-
Interval intersection = interval.intersect(new Interval(end.plus(5), end.plus(10)));
78-
assertThat(intersection.isEmpty()).isTrue();
79-
}
80-
81-
@Test
82-
public void intersectionWithIntervalAfterButTouchingIsEmpty() {
83-
Interval intersection = interval.intersect(new Interval(end, end.plus(10)));
84-
assertThat(intersection.isEmpty()).isTrue();
85-
}
86-
8748
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package net.itarray.automotion.tests.geometry;
2+
3+
import net.itarray.automotion.internal.geometry.Interval;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import org.junit.Test;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
public class OverlappingIntervalsTest extends TwoIntervalsTest{
10+
11+
public Interval left() {
12+
return new Interval(new Scalar(2), new Scalar(12));
13+
}
14+
15+
public Interval right() {
16+
return new Interval(new Scalar(10), new Scalar(17));
17+
}
18+
19+
@Test
20+
public void haveIntersectionBeginningAtLargerStartAndEndingAtSmallerEnd() {
21+
assertThat(right().intersect(left())).isEqualTo(new Interval(new Scalar(10), new Scalar(12)));
22+
}
23+
@Test
24+
public void haveSpanFromSmallestBeginToLargestEnd() {
25+
Interval span = new Interval(new Scalar(2), new Scalar(17));
26+
assertThat(right().span(left())).isEqualTo(span);
27+
assertThat(left().span(right())).isEqualTo(span);
28+
}
29+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package net.itarray.automotion.tests.geometry;
2+
3+
import net.itarray.automotion.internal.geometry.Interval;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import org.junit.Test;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
public class TouchingIntervalsTest extends TwoIntervalsTest{
10+
11+
public Interval left() {
12+
return new Interval(new Scalar(2), new Scalar(10));
13+
}
14+
15+
public Interval right() {
16+
return new Interval(new Scalar(10), new Scalar(17));
17+
}
18+
19+
@Test
20+
public void haveEmptyIntersection() {
21+
assertThat(right().intersect(left()).isEmpty()).isTrue();
22+
}
23+
24+
@Test
25+
public void haveSpanFromSmallestBeginToLargestEnd() {
26+
Interval span = new Interval(new Scalar(2), new Scalar(17));
27+
assertThat(right().span(left())).isEqualTo(span);
28+
assertThat(left().span(right())).isEqualTo(span);
29+
}
30+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.itarray.automotion.tests.geometry;
2+
3+
import net.itarray.automotion.internal.geometry.Interval;
4+
import net.itarray.automotion.internal.geometry.Scalar;
5+
import org.junit.Test;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
public abstract class TwoIntervalsTest {
10+
11+
public abstract Interval left();
12+
13+
public abstract Interval right();
14+
15+
@Test
16+
public void intersectIsSymmetric() {
17+
assertThat(left().intersect(right())).isEqualTo(right().intersect(left()));
18+
}
19+
20+
@Test
21+
public void spanIsSymmetric() {
22+
assertThat(left().span(right())).isEqualTo(right().span(left()));
23+
}
24+
}

0 commit comments

Comments
 (0)