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 2017/12/04 17:48:54 UTC
[10/50] lucene-solr:jira/solr-11458-2: LUCENE-8064: Generate polygon
holes properly in testing. Committed on behalf of Ignacio Vera.
LUCENE-8064: Generate polygon holes properly in testing. Committed on behalf of Ignacio Vera.
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/cc8802e6
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/cc8802e6
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/cc8802e6
Branch: refs/heads/jira/solr-11458-2
Commit: cc8802e60e02aeed78a68884ec862d96f7f0827f
Parents: 2bde0ea
Author: Karl Wright <Da...@gmail.com>
Authored: Fri Nov 24 06:25:55 2017 -0500
Committer: Karl Wright <Da...@gmail.com>
Committed: Fri Nov 24 06:25:55 2017 -0500
----------------------------------------------------------------------
.../geom/RandomGeo3dShapeGenerator.java | 60 +++++++++++++++++---
1 file changed, 51 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cc8802e6/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
index cbefcad..4ff973a 100644
--- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
+++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
@@ -440,6 +440,9 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
iterations++;
int vertexCount = random().nextInt(2) + 2;
List<GeoPoint> geoPoints = points(vertexCount, planetModel, constraints);
+ if (geoPoints.size() < 2){
+ continue;
+ }
try {
GeoPath path = GeoPathFactory.makeGeoPath(planetModel, 0, geoPoints.toArray(new GeoPoint[geoPoints.size()]));
if (!constraints.valid(path)) {
@@ -467,6 +470,9 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
iterations++;
int vertexCount = random().nextInt(2) + 2;
List<GeoPoint> geoPoints = points(vertexCount, planetModel, constraints);
+ if (geoPoints.size() < 2){
+ continue;
+ }
double width =randomCutoffAngle();
try {
GeoPath path = GeoPathFactory.makeGeoPath(planetModel, width, geoPoints.toArray(new GeoPoint[geoPoints.size()]));
@@ -523,6 +529,9 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
while (iterations < MAX_SHAPE_ITERATIONS) {
iterations++;
List<GeoPoint> geoPoints = points(vertexCount,planetModel, constraints);
+ if (geoPoints.size() < 3){
+ continue;
+ }
List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints);
try {
GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(planetModel, orderedGeoPoints);
@@ -551,6 +560,9 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
while (iterations < MAX_SHAPE_ITERATIONS) {
iterations++;
List<GeoPoint> geoPoints = points(vertexCount,planetModel, constraints);
+ if (geoPoints.size() < 3){
+ continue;
+ }
List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints);
try {
GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(planetModel, orderedGeoPoints);
@@ -572,7 +584,7 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
pointsConstraints.put(polygon,GeoArea.WITHIN);
pointsConstraints.putAll(constraints.getContains());
pointsConstraints.putAll(constraints.getDisjoint());
- List<GeoPolygon> holes = concavePolygonHoles(planetModel, holeConstraints, pointsConstraints);
+ List<GeoPolygon> holes = concavePolygonHoles(planetModel, polygon, holeConstraints, pointsConstraints);
//we should have at least one hole
if (holes.size() == 0){
continue;
@@ -594,11 +606,13 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
* use to generate convex holes. Note that constraints for points and holes are different,
*
* @param planetModel The planet model.
+ * @param polygon The polygon where the holes are within.
* @param holeConstraints The given constraints that a hole must comply.
* @param pointConstraints The given constraints that a point must comply.
* @return The random generated GeoPolygon.
*/
private List<GeoPolygon> concavePolygonHoles(PlanetModel planetModel,
+ GeoPolygon polygon,
Constraints holeConstraints,
Constraints pointConstraints) {
int iterations =0;
@@ -608,7 +622,16 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
iterations++;
int vertexCount = random().nextInt(3) + 3;
List<GeoPoint> geoPoints = points(vertexCount, planetModel, pointConstraints);
+ if (geoPoints.size() < 3){
+ continue;
+ }
geoPoints = orderPoints(geoPoints);
+ GeoPolygon inversePolygon = GeoPolygonFactory.makeGeoPolygon(planetModel, geoPoints);
+ //The convex polygon must be within
+ if (inversePolygon == null || polygon.getRelationship(inversePolygon) != GeoArea.WITHIN) {
+ continue;
+ }
+ //make it concave
Collections.reverse(geoPoints);
try {
GeoPolygon hole = GeoPolygonFactory.makeGeoPolygon(planetModel, geoPoints);
@@ -642,6 +665,9 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
while (iterations < MAX_SHAPE_ITERATIONS) {
iterations++;
List<GeoPoint> geoPoints = points(vertexCount,planetModel, constraints);
+ if (geoPoints.size() < 3){
+ continue;
+ }
List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints);
Collections.reverse(orderedGeoPoints);
try {
@@ -681,15 +707,23 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
if (hole == null){
continue;
}
- // Now we get points for polygon. Must we with in the hole
+ // Now we get points for polygon. Must we within the hole
// and we add contain constraints
Constraints pointConstraints = new Constraints();
pointConstraints.put(hole, GeoArea.WITHIN);
pointConstraints.putAll(constraints.getContains());
List<GeoPoint> geoPoints = points(vertexCount,planetModel, pointConstraints);
- List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints);
- Collections.reverse(orderedGeoPoints);
+ if (geoPoints.size() < 3){
+ continue;
+ }
try {
+ List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints);
+ GeoPolygon inversePolygon = GeoPolygonFactory.makeGeoPolygon(planetModel, geoPoints);
+ //The convex polygon must be within the hole
+ if (inversePolygon == null || hole.getRelationship(inversePolygon) != GeoArea.WITHIN) {
+ continue;
+ }
+ Collections.reverse(orderedGeoPoints);
GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(planetModel, orderedGeoPoints, Collections.singletonList(hole));
//final polygon must be convex
if (!constraints.valid(polygon) || isConcave(planetModel,polygon)) {
@@ -720,6 +754,9 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
while(polDescription.size() < polygonsCount){
int vertexCount = random().nextInt(14) + 3;
List<GeoPoint> geoPoints = points(vertexCount,planetModel, constraints);
+ if (geoPoints.size() < 3){
+ continue;
+ }
orderPoints(geoPoints);
polDescription.add(new GeoPolygonFactory.PolygonDescription(geoPoints));
}
@@ -750,6 +787,9 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
while (iterations < MAX_SHAPE_ITERATIONS) {
iterations++;
List<GeoPoint> points = points(3,planetModel,constraints);
+ if (points.size() < 3){
+ continue;
+ }
points = orderPoints(points);
try {
GeoPolygon polygon = GeoPolygonFactory.makeGeoConvexPolygon(planetModel, points);
@@ -778,6 +818,9 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
while (iterations < MAX_SHAPE_ITERATIONS) {
iterations++;
List<GeoPoint> points = points(3, planetModel, constraints);
+ if (points.size() < 3){
+ continue;
+ }
points = orderPoints(points);
Collections.reverse(points);
try {
@@ -794,8 +837,8 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
}
/**
- * Method that returns a random list of generated GeoPoints under given constraints. If it cannot
- * find a point it will add a point that might not comply with the constraints.
+ * Method that returns a random list of generated GeoPoints under given constraints. The
+ * number of points returned might be lower than the requested.
*
* @param count The number of points
* @param planetModel The planet model.
@@ -806,10 +849,9 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
List<GeoPoint> geoPoints = new ArrayList<>(count);
for(int i= 0; i< count; i++) {
GeoPoint point = randomGeoPoint(planetModel, constraints);
- if (point == null){
- point = randomGeoPoint(planetModel, new Constraints());
+ if (point != null){
+ geoPoints.add(point);
}
- geoPoints.add(point);
}
return geoPoints;
}