MATH-1449: fixing PolygonsSet.getBarycenter() to return Cartesian2D.NaN for empty regions

This commit is contained in:
darkma773r 2018-02-04 14:18:36 -05:00
parent a37dcb93be
commit 0e9f604e87
2 changed files with 39 additions and 14 deletions

View File

@ -553,7 +553,7 @@ public class PolygonsSet extends AbstractRegion<Euclidean2D, Euclidean1D> {
setBarycenter((Point<Euclidean2D>) Cartesian2D.NaN);
} else {
setSize(0);
setBarycenter((Point<Euclidean2D>) new Cartesian2D(0, 0));
setBarycenter((Point<Euclidean2D>) Cartesian2D.NaN);
}
} else if (v[0][0] == null) {
// there is at least one open-loop: the polygon is infinite

View File

@ -221,15 +221,28 @@ public class PolygonsSetTest {
@Test
public void testEmpty() {
PolygonsSet empty = (PolygonsSet) new RegionFactory<Euclidean2D>().getComplement(new PolygonsSet(1.0e-10));
Assert.assertTrue(empty.isEmpty());
Assert.assertEquals(0, empty.getVertices().length);
Assert.assertEquals(0.0, empty.getBoundarySize(), 1.0e-10);
Assert.assertEquals(0.0, empty.getSize(), 1.0e-10);
// act
PolygonsSet poly = (PolygonsSet) new RegionFactory<Euclidean2D>().getComplement(new PolygonsSet(1e-10));
// assert
Assert.assertEquals(1e-10, poly.getTolerance(), Precision.EPSILON);
Assert.assertEquals(0.0, poly.getSize(), 1e-10);
Assert.assertEquals(0.0, poly.getBoundarySize(), 1e-10);
Assert.assertEquals(0, poly.getVertices().length);
Assert.assertEquals(true, poly.isEmpty());
Assert.assertEquals(false, poly.isFull());
GeometryTestUtils.assertVectorEquals(Cartesian2D.NaN, (Cartesian2D) poly.getBarycenter(), 1e-10);
checkPoints(Region.Location.OUTSIDE, poly, new Cartesian2D[] {
new Cartesian2D(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY),
Cartesian2D.ZERO,
new Cartesian2D(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY)});
for (double y = -1; y < 1; y += 0.1) {
for (double x = -1; x < 1; x += 0.1) {
Assert.assertEquals(Double.POSITIVE_INFINITY,
empty.projectToBoundary(new Cartesian2D(x, y)).getOffset(),
poly.projectToBoundary(new Cartesian2D(x, y)).getOffset(),
1.0e-10);
}
}
@ -237,16 +250,28 @@ public class PolygonsSetTest {
@Test
public void testFull() {
PolygonsSet empty = new PolygonsSet(1.0e-10);
Assert.assertFalse(empty.isEmpty());
Assert.assertEquals(0, empty.getVertices().length);
Assert.assertEquals(0.0, empty.getBoundarySize(), 1.0e-10);
Assert.assertEquals(Double.POSITIVE_INFINITY, empty.getSize(), 1.0e-10);
// act
PolygonsSet poly = new PolygonsSet(1e-10);
// assert
Assert.assertEquals(1e-10, poly.getTolerance(), Precision.EPSILON);
Assert.assertEquals(Double.POSITIVE_INFINITY, poly.getSize(), 1e-10);
Assert.assertEquals(0.0, poly.getBoundarySize(), 1e-10);
Assert.assertEquals(0, poly.getVertices().length);
Assert.assertEquals(false, poly.isEmpty());
Assert.assertEquals(true, poly.isFull());
GeometryTestUtils.assertVectorEquals(Cartesian2D.NaN, (Cartesian2D) poly.getBarycenter(), 1e-10);
checkPoints(Region.Location.INSIDE, poly, new Cartesian2D[] {
new Cartesian2D(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY),
Cartesian2D.ZERO,
new Cartesian2D(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY)});
for (double y = -1; y < 1; y += 0.1) {
for (double x = -1; x < 1; x += 0.1) {
Assert.assertEquals(Double.NEGATIVE_INFINITY,
empty.projectToBoundary(new Cartesian2D(x, y)).getOffset(),
1.0e-10);
poly.projectToBoundary(new Cartesian2D(x, y)).getOffset(),
1e-10);
}
}
}