blob: c9dc7aae20dba57eeb2a8aa227594acd3f6d3eca [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.lucene.spatial3d.geom;
import java.util.ArrayList;
import java.util.List;
import com.carrotsearch.randomizedtesting.annotations.Repeat;
import org.junit.Test;
/**
* Random test for planes.
*/
public class RandomPlaneTest extends RandomGeo3dShapeGenerator {
@Test
@Repeat(iterations = 10)
public void testPlaneAccuracy() {
PlanetModel planetModel = randomPlanetModel();
GeoPoint point1 = randomGeoPoint(planetModel);
for (int i= 0; i < 1000; i++) {
double dist = random().nextDouble() * Vector.MINIMUM_ANGULAR_RESOLUTION + Vector.MINIMUM_ANGULAR_RESOLUTION;
double bearing = random().nextDouble() * 2 * Math.PI;
GeoPoint point2 = planetModel.surfacePointOnBearing(point1, dist, bearing );
GeoPoint check = randomGeoPoint(planetModel);
if (!point1.isNumericallyIdentical(point2)) {
SidedPlane plane = new SidedPlane(check, point1, point2);
String msg = dist + " point 1: " + point1 + ", point 2: " + point2 + " , check: " + check;
assertTrue(msg, plane.isWithin(check));
assertTrue(msg, plane.isWithin(point2));
assertTrue(msg, plane.isWithin(point1));
}
else {
assertFalse("numerically identical", true);
}
}
}
@Test
@Repeat(iterations = 10)
public void testPlaneThreePointsAccuracy() {
PlanetModel planetModel = randomPlanetModel();
for (int i= 0; i < 1000; i++) {
GeoPoint point1 = randomGeoPoint(planetModel);
double dist = random().nextDouble() * Math.PI - Vector.MINIMUM_ANGULAR_RESOLUTION;
double bearing = random().nextDouble() * 2 * Math.PI;
GeoPoint point2 = planetModel.surfacePointOnBearing(point1, dist, bearing );
dist = random().nextDouble() * Vector.MINIMUM_ANGULAR_RESOLUTION + Vector.MINIMUM_ANGULAR_RESOLUTION;
bearing = random().nextDouble() * 2 * Math.PI;
GeoPoint point3 = planetModel.surfacePointOnBearing(point1, dist, bearing );
GeoPoint check = randomGeoPoint(planetModel);
SidedPlane plane = SidedPlane.constructNormalizedThreePointSidedPlane(check, point1, point2, point3);
String msg = planetModel + " point 1: " + point1 + ", point 2: " + point2 + ", point 3: " + point3 + " , check: " + check;
if (plane == null) {
fail(msg);
}
// This is not expected
//assertTrue(plane.evaluate(check) + " " + msg, plane.isWithin(check));
assertTrue(plane.evaluate(point1) + " " +msg, plane.isWithin(point1));
assertTrue(plane.evaluate(point2) + " " +msg, plane.isWithin(point2));
assertTrue(plane.evaluate(point3) + " " +msg, plane.isWithin(point3));
}
}
@Test
@Repeat(iterations = 10)
public void testPolygonAccuracy() {
PlanetModel planetModel = randomPlanetModel();
GeoPoint point1 = randomGeoPoint(planetModel);
for (int i= 0; i < 1000; i++) {
double dist = random().nextDouble() * 1e-6 + Vector.MINIMUM_ANGULAR_RESOLUTION;
GeoPoint point2 = planetModel.surfacePointOnBearing(point1, dist, 0);
GeoPoint point3 = planetModel.surfacePointOnBearing(point1, dist, 0.5 * Math.PI);
List<GeoPoint> points = new ArrayList<>();
points.add(point1);
points.add(point2);
points.add(point3);
GeoPolygonFactory.makeGeoPolygon(planetModel, points);
}
}
}