You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2020/01/19 02:53:56 UTC

[commons-geometry] 02/03: GEOMETRY-71: updating RegionBSPTree1S to compute barycenter using weighted vector approach for consistency with RegionBSPTree2S

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 <ma...@hotmail.com>
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