You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2014/01/30 22:04:59 UTC
svn commit: r1562959 -
/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/enclosing/WelzlEncloser3DTest.java
Author: luc
Date: Thu Jan 30 21:04:58 2014
New Revision: 1562959
URL: http://svn.apache.org/r1562959
Log:
Most of the 3D errors were due to ... wrong tests.
The dimension was set to 2 instead of 3.
There is still one problem, so investigation continues.
JIRA: MATH-1096
Modified:
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/enclosing/WelzlEncloser3DTest.java
Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/enclosing/WelzlEncloser3DTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/enclosing/WelzlEncloser3DTest.java?rev=1562959&r1=1562958&r2=1562959&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/enclosing/WelzlEncloser3DTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/enclosing/WelzlEncloser3DTest.java Thu Jan 30 21:04:58 2014
@@ -16,6 +16,8 @@
*/
package org.apache.commons.math3.geometry.enclosing;
+import java.io.IOException;
+import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -37,7 +39,7 @@ public class WelzlEncloser3DTest {
public void testNullList() {
SphereGenerator generator = new SphereGenerator();
WelzlEncloser<Euclidean3D, Vector3D> encloser =
- new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 2, generator);
+ new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, generator);
EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(null);
Assert.assertTrue(ball.getRadius() < 0);
}
@@ -46,13 +48,33 @@ public class WelzlEncloser3DTest {
public void testNoPoints() {
SphereGenerator generator = new SphereGenerator();
WelzlEncloser<Euclidean3D, Vector3D> encloser =
- new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 2, generator);
+ new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, generator);
EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(new ArrayList<Vector3D>());
Assert.assertTrue(ball.getRadius() < 0);
}
@Test
- @Ignore // this test currently fails, it generates an infinite loop
+ @Ignore
+ public void testReducingBall() {
+ List<Vector3D> list =
+ Arrays.asList(new Vector3D(-7.140397329568118, -16.571661242582177, 11.714458961735405),
+ new Vector3D(-7.137986707455888, -16.570767323375720, 11.708602108715928),
+ new Vector3D(-7.139185068549035, -16.570891204702250, 11.715554057357394),
+ new Vector3D(-7.142682716997507, -16.571609818234290, 11.710787934580328),
+ new Vector3D(-7.139018392423351, -16.574405614157020, 11.710518716711425),
+ new Vector3D(-7.140870659936730, -16.567993074240455, 11.710914678204503),
+ new Vector3D(-7.136350173659562, -16.570498228820930, 11.713965225900928),
+ new Vector3D(-7.141675762759172, -16.572852471407028, 11.714033471449508),
+ new Vector3D(-7.140453077221105, -16.570212820780647, 11.708624578004980),
+ new Vector3D(-7.140322188726825, -16.574152894557717, 11.710305611121410),
+ new Vector3D(-7.141116131477088, -16.574061164624560, 11.712938509321699));
+ WelzlEncloser<Euclidean3D, Vector3D> encloser =
+ new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, new SphereGenerator());
+ EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(list);
+ Assert.assertTrue(ball.getRadius() > 0);
+ }
+
+ @Test
public void testInfiniteLoop() {
// this test used to generate an infinite loop
List<Vector3D> list =
@@ -76,14 +98,13 @@ public class WelzlEncloser3DTest {
new Vector3D( -0.98034899533935820, -3.34004481162763960, 13.03245014017556800));
WelzlEncloser<Euclidean3D, Vector3D> encloser =
- new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 2, new SphereGenerator());
+ new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, new SphereGenerator());
EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(list);
Assert.assertTrue(ball.getRadius() > 0);
}
@Test
- @Ignore // this test currently fails, it generates an infinite loop
- public void testLargeSamples() {
+ public void testLargeSamples() throws IOException {
RandomGenerator random = new Well1024a(0x35ddecfc78131e1dl);
final UnitSphereRandomVectorGenerator sr = new UnitSphereRandomVectorGenerator(3, random);
for (int k = 0; k < 100; ++k) {
@@ -92,64 +113,38 @@ public class WelzlEncloser3DTest {
double d = 25 * random.nextDouble();
double refRadius = 10 * random.nextDouble();
Vector3D refCenter = new Vector3D(d, new Vector3D(sr.nextVector()));
- List<Vector3D> support = new ArrayList<Vector3D>();
- for (int i = 0; i < 4; ++i) {
- support.add(new Vector3D(1.0, refCenter, refRadius, new Vector3D(sr.nextVector())));
- }
-
// set up a large sample inside the reference sphere
int nbPoints = random.nextInt(10000);
- System.out.println(nbPoints);
List<Vector3D> points = new ArrayList<Vector3D>();
for (int i = 0; i < nbPoints; ++i) {
double r = refRadius * random.nextDouble();
points.add(new Vector3D(1.0, refCenter, r, new Vector3D(sr.nextVector())));
}
- // hide the support point belonging to sphere boundary in the sample
- points.add(random.nextInt(nbPoints), support.get(0));
- points.add(random.nextInt(nbPoints), support.get(1));
- points.add(random.nextInt(nbPoints), support.get(2));
- points.add(random.nextInt(nbPoints), support.get(3));
-
- // test we find our sphere again
- checkSphere(points, support);
+ // test we find a sphere at most as large as the one used for random drawings
+ checkSphere(points, refRadius);
}
}
- private void checkSphere(List<Vector3D> points, List<Vector3D> refSupport) {
+ private void checkSphere(List<Vector3D> points, double refRadius) {
- EnclosingBall<Euclidean3D, Vector3D> Sphere = checkSphere(points);
+ EnclosingBall<Euclidean3D, Vector3D> sphere = checkSphere(points);
- // compare computed Sphere with expected Sphere
- SphereGenerator generator = new SphereGenerator();
- EnclosingBall<Euclidean3D, Vector3D> expected = generator.ballOnSupport(refSupport);
- Assert.assertEquals(refSupport.size(), Sphere.getSupportSize());
- Assert.assertEquals(expected.getRadius(), Sphere.getRadius(), 1.0e-10);
- Assert.assertEquals(expected.getCenter().getX(), Sphere.getCenter().getX(), 1.0e-10);
- Assert.assertEquals(expected.getCenter().getY(), Sphere.getCenter().getY(), 1.0e-10);
-
- for (Vector3D s : Sphere.getSupport()) {
- boolean found = false;
- for (Vector3D rs : refSupport) {
- if (s == rs) {
- found = true;
- }
- }
- Assert.assertTrue(found);
- }
+ // compare computed sphere with bounding sphere
+ Assert.assertTrue(sphere.getRadius() <= refRadius);
// check removing any point of the support Sphere fails to enclose the point
- for (int i = 0; i < Sphere.getSupportSize(); ++i) {
+ for (int i = 0; i < sphere.getSupportSize(); ++i) {
List<Vector3D> reducedSupport = new ArrayList<Vector3D>();
int count = 0;
- for (Vector3D s : Sphere.getSupport()) {
+ for (Vector3D s : sphere.getSupport()) {
if (count++ != i) {
reducedSupport.add(s);
}
}
- EnclosingBall<Euclidean3D, Vector3D> reducedSphere = generator.ballOnSupport(reducedSupport);
+ EnclosingBall<Euclidean3D, Vector3D> reducedSphere =
+ new SphereGenerator().ballOnSupport(reducedSupport);
boolean foundOutside = false;
for (int j = 0; j < points.size() && !foundOutside; ++j) {
if (!reducedSphere.contains(points.get(j), 1.0e-10)) {
@@ -164,7 +159,7 @@ public class WelzlEncloser3DTest {
private EnclosingBall<Euclidean3D, Vector3D> checkSphere(List<Vector3D> points) {
WelzlEncloser<Euclidean3D, Vector3D> encloser =
- new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 2, new SphereGenerator());
+ new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, new SphereGenerator());
EnclosingBall<Euclidean3D, Vector3D> Sphere = encloser.enclose(points);
// all points are enclosed