This is an automated email from the ASF dual-hosted git repository. erans pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-geometry.git
commit d742ffb2dc71ef53a9eadc156dff480b507ca596 Author: Matt Juntunen <[email protected]> AuthorDate: Sat Jan 18 09:03:50 2020 -0500 GEOMETRY-71: updating RegionBSPTree1S to compute barycenter using weighted vector approach for consistency with RegionBSPTree2S --- .../geometry/spherical/oned/RegionBSPTree1S.java | 17 +++++++++++------ .../geometry/spherical/twod/RegionBSPTree2S.java | 4 ++-- .../geometry/spherical/oned/RegionBSPTree1STest.java | 19 ++++++++++++++++++- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1S.java b/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1S.java index b056043..2baeeb2 100644 --- a/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1S.java +++ b/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1S.java @@ -22,7 +22,6 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; -import org.apache.commons.numbers.angle.PlaneAngleRadians; import org.apache.commons.geometry.core.Transform; import org.apache.commons.geometry.core.partitioning.Hyperplane; import org.apache.commons.geometry.core.partitioning.HyperplaneLocation; @@ -31,6 +30,8 @@ import org.apache.commons.geometry.core.partitioning.SubHyperplane; import org.apache.commons.geometry.core.partitioning.bsp.AbstractBSPTree; import org.apache.commons.geometry.core.partitioning.bsp.AbstractRegionBSPTree; import org.apache.commons.geometry.core.precision.DoublePrecisionContext; +import org.apache.commons.geometry.euclidean.twod.Vector2D; +import org.apache.commons.numbers.angle.PlaneAngleRadians; /** BSP tree representing regions in 1D spherical space. */ @@ -337,10 +338,12 @@ public class RegionBSPTree1S extends AbstractRegionBSPTree<Point1S, RegionBSPTre protected RegionSizeProperties<Point1S> computeRegionSizeProperties() { if (isFull()) { return new RegionSizeProperties<>(PlaneAngleRadians.TWO_PI, null); + } else if (isEmpty()) { + return new RegionSizeProperties<>(0, null); } double size = 0; - double scaledBarycenterSum = 0; + Vector2D scaledBarycenterSum = Vector2D.ZERO; double intervalSize; @@ -348,12 +351,14 @@ public class RegionBSPTree1S extends AbstractRegionBSPTree<Point1S, RegionBSPTre intervalSize = interval.getSize(); size += intervalSize; - scaledBarycenterSum += intervalSize * interval.getBarycenter().getNormalizedAzimuth(); + scaledBarycenterSum = scaledBarycenterSum.add(interval.getBarycenter().getVector().withNorm(intervalSize)); } - final Point1S barycenter = size > 0 ? - Point1S.of(scaledBarycenterSum / size) : - null; + final DoublePrecisionContext precision = ((CutAngle) getRoot().getCutHyperplane()).getPrecision(); + + final Point1S barycenter = scaledBarycenterSum.eq(Vector2D.ZERO, precision) ? + null : + Point1S.from(scaledBarycenterSum); return new RegionSizeProperties<>(size, barycenter); } diff --git a/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/twod/RegionBSPTree2S.java b/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/twod/RegionBSPTree2S.java index c79d894..b304186 100644 --- a/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/twod/RegionBSPTree2S.java +++ b/commons-geometry-spherical/src/main/java/org/apache/commons/geometry/spherical/twod/RegionBSPTree2S.java @@ -161,8 +161,8 @@ public class RegionBSPTree2S extends AbstractRegionBSPTree<Point2S, RegionBSPTre return new RegionSizeProperties<>(0, null); } - List<ConvexArea2S> areas = toConvex(); - DoublePrecisionContext precision = ((GreatArc) getRoot().getCut()).getPrecision(); + final List<ConvexArea2S> areas = toConvex(); + final DoublePrecisionContext precision = ((GreatArc) getRoot().getCut()).getPrecision(); double sizeSum = 0; Vector3D barycenterVector = Vector3D.ZERO; diff --git a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1STest.java b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1STest.java index db37af8..d5fe5e1 100644 --- a/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1STest.java +++ b/commons-geometry-spherical/src/test/java/org/apache/commons/geometry/spherical/oned/RegionBSPTree1STest.java @@ -24,6 +24,7 @@ import org.apache.commons.geometry.core.partitioning.Split; import org.apache.commons.geometry.core.partitioning.SplitLocation; import org.apache.commons.geometry.core.precision.DoublePrecisionContext; import org.apache.commons.geometry.core.precision.EpsilonDoublePrecisionContext; +import org.apache.commons.geometry.euclidean.twod.Vector2D; import org.apache.commons.numbers.angle.PlaneAngleRadians; import org.junit.Assert; import org.junit.Test; @@ -713,7 +714,23 @@ public class RegionBSPTree1STest { // act/assert Assert.assertEquals(0.6, tree.getSize(), TEST_EPS); Assert.assertEquals(0, tree.getBoundarySize(), TEST_EPS); - Assert.assertEquals(2.2 / 6, tree.getBarycenter().getAzimuth(), TEST_EPS); + + Vector2D barycenterVector = Point1S.of(0.1).getVector().withNorm(0.2) + .add(Point1S.of(0.5).getVector().withNorm(0.4)); + Assert.assertEquals(Point1S.from(barycenterVector).getAzimuth(), tree.getBarycenter().getAzimuth(), TEST_EPS); + } + + @Test + public void testRegionProperties_equalAndOppositeIntervals() { + // arrange + RegionBSPTree1S tree = RegionBSPTree1S.empty(); + tree.add(AngularInterval.of(-1, 1, TEST_PRECISION)); + tree.add(AngularInterval.of(Math.PI - 1, Math.PI + 1, TEST_PRECISION)); + + // act/assert + Assert.assertEquals(4, tree.getSize(), TEST_EPS); + Assert.assertEquals(0, tree.getBoundarySize(), TEST_EPS); + Assert.assertNull(tree.getBarycenter()); // no unique barycenter exists } @Test
