mirror of https://github.com/apache/lucene.git
LUCENE-8214: Do a better job of selecting the test point for a geocomplexpolygon.
This commit is contained in:
parent
cbd4b671ff
commit
cd39314a00
|
@ -165,7 +165,7 @@ public class GeoPolygonFactory {
|
|||
}
|
||||
|
||||
//First approximation to find a point
|
||||
final GeoPoint centerOfMass = getCenterOfMass(filteredPointList);
|
||||
final GeoPoint centerOfMass = getCenterOfMass(planetModel, filteredPointList);
|
||||
final Boolean isCenterOfMassInside = isInsidePolygon(centerOfMass, filteredPointList);
|
||||
if (isCenterOfMassInside != null) {
|
||||
return generateGeoPolygon(planetModel, filteredPointList, holes, centerOfMass, isCenterOfMassInside);
|
||||
|
@ -192,7 +192,7 @@ public class GeoPolygonFactory {
|
|||
throw new IllegalArgumentException("cannot find a point that is inside the polygon "+filteredPointList);
|
||||
}
|
||||
|
||||
private static GeoPoint getCenterOfMass(List<GeoPoint> points) {
|
||||
private static GeoPoint getCenterOfMass(PlanetModel planetModel, List<GeoPoint> points) {
|
||||
double x = 0;
|
||||
double y = 0;
|
||||
double z = 0;
|
||||
|
@ -202,7 +202,7 @@ public class GeoPolygonFactory {
|
|||
y += point.y;
|
||||
z += point.z;
|
||||
}
|
||||
return new GeoPoint(x / points.size(), y / points.size(), z / points.size());
|
||||
return planetModel.createSurfacePoint(x / points.size(), y / points.size(), z / points.size());
|
||||
}
|
||||
|
||||
/** Use this class to specify a polygon with associated holes.
|
||||
|
@ -269,6 +269,16 @@ public class GeoPolygonFactory {
|
|||
throw new IllegalArgumentException("couldn't find a non-degenerate polygon for in-set determination");
|
||||
}
|
||||
|
||||
final GeoPoint centerOfMass = getCenterOfMass(planetModel, testPointShape.points);
|
||||
final Boolean isCenterOfMassInside = isInsidePolygon(centerOfMass, testPointShape.points);
|
||||
if (isCenterOfMassInside != null) {
|
||||
if (isCenterOfMassInside == testPointShape.poleMustBeInside) {
|
||||
return new GeoComplexPolygon(planetModel, pointsList, centerOfMass, isCenterOfMassInside);
|
||||
} else {
|
||||
return new GeoComplexPolygon(planetModel, pointsList, new GeoPoint(-centerOfMass.x, -centerOfMass.y, -centerOfMass.z), !isCenterOfMassInside);
|
||||
}
|
||||
}
|
||||
|
||||
// Create a random number generator. Effectively this furnishes us with a repeatable sequence
|
||||
// of points to use for poles.
|
||||
final Random generator = new Random(1234);
|
||||
|
|
Loading…
Reference in New Issue