You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2018/04/16 17:20:51 UTC
[11/46] lucene-solr:jira/solr-11833: LUCENE-8245: Use strict bounds
checking for edge planes when assessing envelope crossings. It's the only way
to insure we don't overdetect or underdetect such intersections.
LUCENE-8245: Use strict bounds checking for edge planes when assessing envelope crossings. It's the only way to insure we don't overdetect or underdetect such intersections.
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/832e8974
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/832e8974
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/832e8974
Branch: refs/heads/jira/solr-11833
Commit: 832e89748ea97e262437d420f54aac2a1b87b505
Parents: 017f59b
Author: Karl Wright <Da...@gmail.com>
Authored: Thu Apr 12 07:08:51 2018 -0400
Committer: Karl Wright <Da...@gmail.com>
Committed: Thu Apr 12 07:08:51 2018 -0400
----------------------------------------------------------------------
.../spatial3d/geom/GeoComplexPolygon.java | 58 +++++++++++---------
.../lucene/spatial3d/geom/SidedPlane.java | 12 ++++
.../lucene/spatial3d/geom/GeoPolygonTest.java | 2 -
.../spatial3d/geom/RandomGeoPolygonTest.java | 4 +-
4 files changed, 48 insertions(+), 28 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/832e8974/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/GeoComplexPolygon.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/GeoComplexPolygon.java b/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/GeoComplexPolygon.java
index 487a771..c4e2c93 100644
--- a/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/GeoComplexPolygon.java
+++ b/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/GeoComplexPolygon.java
@@ -971,12 +971,14 @@ class GeoComplexPolygon extends GeoBasePolygon {
*/
private int countCrossings(final Edge edge,
final Plane envelopePlane, final Membership envelopeBound) {
- final GeoPoint[] intersections = edge.plane.findIntersections(planetModel, envelopePlane, edge.startPlane, edge.endPlane, envelopeBound);
+ final GeoPoint[] intersections = edge.plane.findIntersections(planetModel, envelopePlane, envelopeBound);
int crossings = 0;
if (intersections != null) {
for (final GeoPoint intersection : intersections) {
- // It's unique, so assess it
- crossings += edgeCrossesEnvelope(edge.plane, intersection)?1:0;
+ if (edge.startPlane.strictlyWithin(intersection) && edge.endPlane.strictlyWithin(intersection)) {
+ // It's unique, so assess it
+ crossings += edgeCrossesEnvelope(edge.plane, intersection)?1:0;
+ }
}
}
return crossings;
@@ -1062,12 +1064,14 @@ class GeoComplexPolygon extends GeoBasePolygon {
*/
private int countCrossings(final Edge edge,
final Plane envelopePlane, final Membership envelopeBound1, final Membership envelopeBound2) {
- final GeoPoint[] intersections = edge.plane.findIntersections(planetModel, envelopePlane, edge.startPlane, edge.endPlane, envelopeBound1, envelopeBound2);
+ final GeoPoint[] intersections = edge.plane.findIntersections(planetModel, envelopePlane, envelopeBound1, envelopeBound2);
int crossings = 0;
if (intersections != null) {
for (final GeoPoint intersection : intersections) {
- // It's unique, so assess it
- crossings += edgeCrossesEnvelope(edge.plane, intersection)?1:0;
+ if (edge.startPlane.strictlyWithin(intersection) && edge.endPlane.strictlyWithin(intersection)) {
+ // It's unique, so assess it
+ crossings += edgeCrossesEnvelope(edge.plane, intersection)?1:0;
+ }
}
}
return crossings;
@@ -1381,35 +1385,39 @@ class GeoComplexPolygon extends GeoBasePolygon {
private int countCrossings(final Edge edge,
final Plane travelEnvelopePlane, final Membership travelEnvelopeBound1, final Membership travelEnvelopeBound2,
final Plane testPointEnvelopePlane, final Membership testPointEnvelopeBound1, final Membership testPointEnvelopeBound2) {
- final GeoPoint[] travelIntersections = edge.plane.findIntersections(planetModel, travelEnvelopePlane, edge.startPlane, edge.endPlane, travelEnvelopeBound1, travelEnvelopeBound2);
- final GeoPoint[] testPointIntersections = edge.plane.findIntersections(planetModel, testPointEnvelopePlane, edge.startPlane, edge.endPlane, testPointEnvelopeBound1, testPointEnvelopeBound2);
+ final GeoPoint[] travelIntersections = edge.plane.findIntersections(planetModel, travelEnvelopePlane, travelEnvelopeBound1, travelEnvelopeBound2);
+ final GeoPoint[] testPointIntersections = edge.plane.findIntersections(planetModel, testPointEnvelopePlane, testPointEnvelopeBound1, testPointEnvelopeBound2);
int crossings = 0;
if (travelIntersections != null) {
for (final GeoPoint intersection : travelIntersections) {
- // Make sure it's not a dup
- boolean notDup = true;
- if (testPointIntersections != null) {
- for (final GeoPoint otherIntersection : testPointIntersections) {
- if (intersection.isNumericallyIdentical(otherIntersection)) {
- //System.out.println(" Points "+intersection+" and "+otherIntersection+" are duplicates");
- notDup = false;
- break;
+ if (edge.startPlane.strictlyWithin(intersection) && edge.endPlane.strictlyWithin(intersection)) {
+ // Make sure it's not a dup
+ boolean notDup = true;
+ if (testPointIntersections != null) {
+ for (final GeoPoint otherIntersection : testPointIntersections) {
+ if (edge.startPlane.strictlyWithin(otherIntersection) && edge.endPlane.strictlyWithin(otherIntersection) && intersection.isNumericallyIdentical(otherIntersection)) {
+ //System.out.println(" Points "+intersection+" and "+otherIntersection+" are duplicates");
+ notDup = false;
+ break;
+ }
}
}
+ if (!notDup) {
+ continue;
+ }
+ // It's unique, so assess it
+ //System.out.println(" Assessing travel envelope intersection point "+intersection+"...");
+ crossings += edgeCrossesEnvelope(edge.plane, intersection)?1:0;
}
- if (!notDup) {
- continue;
- }
- // It's unique, so assess it
- //System.out.println(" Assessing travel envelope intersection point "+intersection+"...");
- crossings += edgeCrossesEnvelope(edge.plane, intersection)?1:0;
}
}
if (testPointIntersections != null) {
for (final GeoPoint intersection : testPointIntersections) {
- // It's unique, so assess it
- //System.out.println(" Assessing testpoint envelope intersection point "+intersection+"...");
- crossings += edgeCrossesEnvelope(edge.plane, intersection)?1:0;
+ if (edge.startPlane.strictlyWithin(intersection) && edge.endPlane.strictlyWithin(intersection)) {
+ // It's unique, so assess it
+ //System.out.println(" Assessing testpoint envelope intersection point "+intersection+"...");
+ crossings += edgeCrossesEnvelope(edge.plane, intersection)?1:0;
+ }
}
}
return crossings;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/832e8974/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/SidedPlane.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/SidedPlane.java b/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/SidedPlane.java
index 66e9376..238933c 100755
--- a/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/SidedPlane.java
+++ b/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/SidedPlane.java
@@ -234,6 +234,18 @@ public class SidedPlane extends Plane implements Membership {
return sigNum == this.sigNum;
}
+ public boolean strictlyWithin(final Vector v) {
+ double evalResult = evaluate(v.x, v.y, v.z);
+ double sigNum = Math.signum(evalResult);
+ return sigNum == 0.0 || sigNum == this.sigNum;
+ }
+
+ public boolean strictlyWithin(double x, double y, double z) {
+ double evalResult = evaluate(x, y, z);
+ double sigNum = Math.signum(evalResult);
+ return sigNum == 0.0 || sigNum == this.sigNum;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/832e8974/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
index cd65018..adff16c 100755
--- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
+++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
@@ -1428,7 +1428,6 @@ shape:
}
@Test
- //@AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
public void testComplexPolygonPlaneOutsideWorld() {
List<GeoPoint> points = new ArrayList<>();
points.add(new GeoPoint(PlanetModel.SPHERE, -0.5, -0.5));
@@ -1503,7 +1502,6 @@ shape:
}
@Test
- @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
public void testLUCENE8245() {
//POLYGON((-70.19447784626787 -83.117346007187,0.0 2.8E-322,-139.99870438810106 7.994601469571884,-143.14292702670522 -18.500141088122664,-158.7373186858464 -35.42942085357812,-70.19447784626787 -83.117346007187))
final List<GeoPoint> points = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/832e8974/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
index 93d675a..44d682c 100644
--- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
+++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
@@ -24,6 +24,8 @@ import com.carrotsearch.randomizedtesting.annotations.Repeat;
import com.carrotsearch.randomizedtesting.generators.BiasedNumbers;
import org.junit.Test;
+import static com.carrotsearch.randomizedtesting.RandomizedTest.randomDouble;
+
/**
* Random test for polygons.
*/
@@ -92,7 +94,7 @@ public class RandomGeoPolygonTest extends RandomGeo3dShapeGenerator {
* biased doubles.
*/
@Test
- @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
+ //@AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
@Repeat(iterations = 10)
public void testComparePolygons() {
final PlanetModel planetModel = randomPlanetModel();