USer should not provide space dimension, it should be automatic.

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1563204 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Luc Maisonobe 2014-01-31 18:33:22 +00:00
parent 310008f48c
commit 423371e790
3 changed files with 14 additions and 20 deletions

View File

@ -46,21 +46,15 @@ public class WelzlEncloser<S extends Space, P extends Point<S>> implements Enclo
/** Tolerance below which points are consider to be identical. */ /** Tolerance below which points are consider to be identical. */
private final double tolerance; private final double tolerance;
/** Maximum number of points to define a ball. */
private final int max;
/** Generator for balls on support. */ /** Generator for balls on support. */
private final SupportBallGenerator<S, P> generator; private final SupportBallGenerator<S, P> generator;
/** Simple constructor. /** Simple constructor.
* @param tolerance below which points are consider to be identical * @param tolerance below which points are consider to be identical
* @param dimension dimension of the space
* @param generator generator for balls on support * @param generator generator for balls on support
*/ */
protected WelzlEncloser(final double tolerance, final int dimension, public WelzlEncloser(final double tolerance, final SupportBallGenerator<S, P> generator) {
final SupportBallGenerator<S, P> generator) {
this.tolerance = tolerance; this.tolerance = tolerance;
this.max = dimension + 1;
this.generator = generator; this.generator = generator;
} }
@ -83,11 +77,12 @@ public class WelzlEncloser<S extends Space, P extends Point<S>> implements Enclo
*/ */
private EnclosingBall<S, P> pivotingBall(final Iterable<P> points) { private EnclosingBall<S, P> pivotingBall(final Iterable<P> points) {
List<P> extreme = new ArrayList<P>(max); final P first = points.iterator().next();
List<P> support = new ArrayList<P>(max); final List<P> extreme = new ArrayList<P>(first.getSpace().getDimension() + 1);
final List<P> support = new ArrayList<P>(first.getSpace().getDimension() + 1);
// start with only first point selected as a candidate support // start with only first point selected as a candidate support
extreme.add(points.iterator().next()); extreme.add(first);
EnclosingBall<S, P> ball = moveToFrontBall(extreme, extreme.size(), support); EnclosingBall<S, P> ball = moveToFrontBall(extreme, extreme.size(), support);
while (true) { while (true) {
@ -132,7 +127,7 @@ public class WelzlEncloser<S extends Space, P extends Point<S>> implements Enclo
// create a new ball on the prescribed support // create a new ball on the prescribed support
EnclosingBall<S, P> ball = generator.ballOnSupport(support); EnclosingBall<S, P> ball = generator.ballOnSupport(support);
if (ball.getSupportSize() < max) { if (ball.getSupportSize() <= ball.getCenter().getSpace().getDimension()) {
for (int i = 0; i < nbExtreme; ++i) { for (int i = 0; i < nbExtreme; ++i) {
final P pi = extreme.get(i); final P pi = extreme.get(i);

View File

@ -35,7 +35,7 @@ public class WelzlEncloser2DTest {
public void testNullList() { public void testNullList() {
DiskGenerator generator = new DiskGenerator(); DiskGenerator generator = new DiskGenerator();
WelzlEncloser<Euclidean2D, Vector2D> encloser = WelzlEncloser<Euclidean2D, Vector2D> encloser =
new WelzlEncloser<Euclidean2D, Vector2D>(1.0e-10, 2, generator); new WelzlEncloser<Euclidean2D, Vector2D>(1.0e-10, generator);
EnclosingBall<Euclidean2D, Vector2D> ball = encloser.enclose(null); EnclosingBall<Euclidean2D, Vector2D> ball = encloser.enclose(null);
Assert.assertTrue(ball.getRadius() < 0); Assert.assertTrue(ball.getRadius() < 0);
} }
@ -44,7 +44,7 @@ public class WelzlEncloser2DTest {
public void testNoPoints() { public void testNoPoints() {
DiskGenerator generator = new DiskGenerator(); DiskGenerator generator = new DiskGenerator();
WelzlEncloser<Euclidean2D, Vector2D> encloser = WelzlEncloser<Euclidean2D, Vector2D> encloser =
new WelzlEncloser<Euclidean2D, Vector2D>(1.0e-10, 2, generator); new WelzlEncloser<Euclidean2D, Vector2D>(1.0e-10, generator);
EnclosingBall<Euclidean2D, Vector2D> ball = encloser.enclose(new ArrayList<Vector2D>()); EnclosingBall<Euclidean2D, Vector2D> ball = encloser.enclose(new ArrayList<Vector2D>());
Assert.assertTrue(ball.getRadius() < 0); Assert.assertTrue(ball.getRadius() < 0);
} }
@ -149,7 +149,7 @@ public class WelzlEncloser2DTest {
private EnclosingBall<Euclidean2D, Vector2D> checkDisk(List<Vector2D> points) { private EnclosingBall<Euclidean2D, Vector2D> checkDisk(List<Vector2D> points) {
WelzlEncloser<Euclidean2D, Vector2D> encloser = WelzlEncloser<Euclidean2D, Vector2D> encloser =
new WelzlEncloser<Euclidean2D, Vector2D>(1.0e-10, 2, new DiskGenerator()); new WelzlEncloser<Euclidean2D, Vector2D>(1.0e-10, new DiskGenerator());
EnclosingBall<Euclidean2D, Vector2D> disk = encloser.enclose(points); EnclosingBall<Euclidean2D, Vector2D> disk = encloser.enclose(points);
// all points are enclosed // all points are enclosed

View File

@ -17,7 +17,6 @@
package org.apache.commons.math3.geometry.enclosing; package org.apache.commons.math3.geometry.enclosing;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -39,7 +38,7 @@ public class WelzlEncloser3DTest {
public void testNullList() { public void testNullList() {
SphereGenerator generator = new SphereGenerator(); SphereGenerator generator = new SphereGenerator();
WelzlEncloser<Euclidean3D, Vector3D> encloser = WelzlEncloser<Euclidean3D, Vector3D> encloser =
new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, generator); new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, generator);
EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(null); EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(null);
Assert.assertTrue(ball.getRadius() < 0); Assert.assertTrue(ball.getRadius() < 0);
} }
@ -48,7 +47,7 @@ public class WelzlEncloser3DTest {
public void testNoPoints() { public void testNoPoints() {
SphereGenerator generator = new SphereGenerator(); SphereGenerator generator = new SphereGenerator();
WelzlEncloser<Euclidean3D, Vector3D> encloser = WelzlEncloser<Euclidean3D, Vector3D> encloser =
new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, generator); new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, generator);
EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(new ArrayList<Vector3D>()); EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(new ArrayList<Vector3D>());
Assert.assertTrue(ball.getRadius() < 0); Assert.assertTrue(ball.getRadius() < 0);
} }
@ -69,7 +68,7 @@ public class WelzlEncloser3DTest {
new Vector3D(-7.140322188726825, -16.574152894557717, 11.710305611121410), new Vector3D(-7.140322188726825, -16.574152894557717, 11.710305611121410),
new Vector3D(-7.141116131477088, -16.574061164624560, 11.712938509321699)); new Vector3D(-7.141116131477088, -16.574061164624560, 11.712938509321699));
WelzlEncloser<Euclidean3D, Vector3D> encloser = WelzlEncloser<Euclidean3D, Vector3D> encloser =
new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, new SphereGenerator()); new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, new SphereGenerator());
EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(list); EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(list);
Assert.assertTrue(ball.getRadius() > 0); Assert.assertTrue(ball.getRadius() > 0);
} }
@ -98,7 +97,7 @@ public class WelzlEncloser3DTest {
new Vector3D( -0.98034899533935820, -3.34004481162763960, 13.03245014017556800)); new Vector3D( -0.98034899533935820, -3.34004481162763960, 13.03245014017556800));
WelzlEncloser<Euclidean3D, Vector3D> encloser = WelzlEncloser<Euclidean3D, Vector3D> encloser =
new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, new SphereGenerator()); new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, new SphereGenerator());
EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(list); EnclosingBall<Euclidean3D, Vector3D> ball = encloser.enclose(list);
Assert.assertTrue(ball.getRadius() > 0); Assert.assertTrue(ball.getRadius() > 0);
} }
@ -159,7 +158,7 @@ public class WelzlEncloser3DTest {
private EnclosingBall<Euclidean3D, Vector3D> checkSphere(List<Vector3D> points) { private EnclosingBall<Euclidean3D, Vector3D> checkSphere(List<Vector3D> points) {
WelzlEncloser<Euclidean3D, Vector3D> encloser = WelzlEncloser<Euclidean3D, Vector3D> encloser =
new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, 3, new SphereGenerator()); new WelzlEncloser<Euclidean3D, Vector3D>(1.0e-10, new SphereGenerator());
EnclosingBall<Euclidean3D, Vector3D> Sphere = encloser.enclose(points); EnclosingBall<Euclidean3D, Vector3D> Sphere = encloser.enclose(points);
// all points are enclosed // all points are enclosed