You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2016/03/25 13:20:11 UTC
lucene-solr:master: LUCENE-7140: add spatial3d PlanetModel.bisection
method
Repository: lucene-solr
Updated Branches:
refs/heads/master b8feb9227 -> 626bed8bc
LUCENE-7140: add spatial3d PlanetModel.bisection method
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/626bed8b
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/626bed8b
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/626bed8b
Branch: refs/heads/master
Commit: 626bed8bc6e225bdba2f95b5a99f2e8b87d3d382
Parents: b8feb92
Author: Mike McCandless <mi...@apache.org>
Authored: Fri Mar 25 08:21:44 2016 -0400
Committer: Mike McCandless <mi...@apache.org>
Committed: Fri Mar 25 08:21:44 2016 -0400
----------------------------------------------------------------------
lucene/CHANGES.txt | 3 +++
.../lucene/spatial3d/geom/PlanetModel.java | 24 ++++++++++++++++++++
.../lucene/spatial3d/geom/GeoPointTest.java | 19 ++++++++++++++++
3 files changed, 46 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/626bed8b/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 1e34413..25b014d 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -13,6 +13,9 @@ New Features
* LUCENE-7099: Add LatLonPoint.newDistanceSort to the sandbox's
LatLonPoint. (Robert Muir)
+* LUCENE-7140: Add PlanetModel.bisection to spatial3d (Karl Wright via
+ Mike McCandless)
+
Optimizations
* LUCENE-7071: Reduce bytes copying in OfflineSorter, giving ~10%
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/626bed8b/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/PlanetModel.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/PlanetModel.java b/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/PlanetModel.java
index b905b56..9f53851 100644
--- a/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/PlanetModel.java
+++ b/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/PlanetModel.java
@@ -188,6 +188,30 @@ public class PlanetModel {
return (x * x + y * y) * inverseAb * inverseAb + z * z * inverseC * inverseC - 1.0 > Vector.MINIMUM_RESOLUTION;
}
+ /** Compute a GeoPoint that's a bisection between two other GeoPoints.
+ * @param pt1 is the first point.
+ * @param pt2 is the second point.
+ * @return the bisection point, or null if a unique one cannot be found.
+ */
+ public GeoPoint bisection(final GeoPoint pt1, final GeoPoint pt2) {
+ final double A0 = (pt1.x + pt2.x) * 0.5;
+ final double B0 = (pt1.y + pt2.y) * 0.5;
+ final double C0 = (pt1.z + pt2.z) * 0.5;
+
+ final double denom = inverseAbSquared * A0 * A0 +
+ inverseAbSquared * B0 * B0 +
+ inverseCSquared * C0 * C0;
+
+ if(denom < Vector.MINIMUM_RESOLUTION) {
+ // Bisection is undefined
+ return null;
+ }
+
+ final double t = Math.sqrt(1.0 / denom);
+
+ return new GeoPoint(t * A0, t * B0, t * C0);
+ }
+
/** Compute surface distance between two points.
* @param pt1 is the first point.
* @param pt2 is the second point.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/626bed8b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPointTest.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPointTest.java b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPointTest.java
index 6df35c5..d738110 100644
--- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPointTest.java
+++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPointTest.java
@@ -83,6 +83,25 @@ public class GeoPointTest extends LuceneTestCase {
}
}
+ @Test
+ public void testBisection() {
+ final int times = atLeast(100);
+ for (int i = 0; i < times; i++) {
+ final double p1Lat = (randomFloat() * 180.0 - 90.0) * DEGREES_TO_RADIANS;
+ final double p1Lon = (randomFloat() * 360.0 - 180.0) * DEGREES_TO_RADIANS;
+ final double p2Lat = (randomFloat() * 180.0 - 90.0) * DEGREES_TO_RADIANS;
+ final double p2Lon = (randomFloat() * 360.0 - 180.0) * DEGREES_TO_RADIANS;
+ final GeoPoint p1 = new GeoPoint(PlanetModel.WGS84, p1Lat, p1Lon);
+ final GeoPoint p2 = new GeoPoint(PlanetModel.WGS84, p2Lat, p2Lon);
+ final GeoPoint pMid = PlanetModel.WGS84.bisection(p1, p2);
+ if (pMid != null) {
+ final double arcDistance = p1.arcDistance(p2);
+ final double sum = pMid.arcDistance(p1) + pMid.arcDistance(p2);
+ assertEquals(arcDistance, sum, 1e-6);
+ }
+ }
+ }
+
@Test(expected = IllegalArgumentException.class)
public void testBadLatLon() {
new GeoPoint(PlanetModel.SPHERE, 50.0, 32.2);