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
|
//First approximation to find a point
|
||||||
final GeoPoint centerOfMass = getCenterOfMass(filteredPointList);
|
final GeoPoint centerOfMass = getCenterOfMass(planetModel, filteredPointList);
|
||||||
final Boolean isCenterOfMassInside = isInsidePolygon(centerOfMass, filteredPointList);
|
final Boolean isCenterOfMassInside = isInsidePolygon(centerOfMass, filteredPointList);
|
||||||
if (isCenterOfMassInside != null) {
|
if (isCenterOfMassInside != null) {
|
||||||
return generateGeoPolygon(planetModel, filteredPointList, holes, centerOfMass, isCenterOfMassInside);
|
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);
|
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 x = 0;
|
||||||
double y = 0;
|
double y = 0;
|
||||||
double z = 0;
|
double z = 0;
|
||||||
|
@ -202,7 +202,7 @@ public class GeoPolygonFactory {
|
||||||
y += point.y;
|
y += point.y;
|
||||||
z += point.z;
|
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.
|
/** Use this class to specify a polygon with associated holes.
|
||||||
|
@ -268,6 +268,16 @@ public class GeoPolygonFactory {
|
||||||
if (testPointShape == null) {
|
if (testPointShape == null) {
|
||||||
throw new IllegalArgumentException("couldn't find a non-degenerate polygon for in-set determination");
|
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
|
// Create a random number generator. Effectively this furnishes us with a repeatable sequence
|
||||||
// of points to use for poles.
|
// of points to use for poles.
|
||||||
|
|
Loading…
Reference in New Issue