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