Author: luc
Date: Sat Apr 26 17:36:34 2014
New Revision: 1590254

URL: http://svn.apache.org/r1590254
Log:
Build empty polyhedrons set when given equal min/max boundaries.

Also explained better in the javadoc about some wrong usage of
PolyhedronsSet constructor.

JIRA: MATH-1115

Modified:
    commons/proper/math/trunk/src/changes/changes.xml
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSet.java
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSetTest.java

Modified: commons/proper/math/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/changes/changes.xml?rev=1590254&r1=1590253&r2=1590254&view=diff
==============================================================================
--- commons/proper/math/trunk/src/changes/changes.xml (original)
+++ commons/proper/math/trunk/src/changes/changes.xml Sat Apr 26 17:36:34 2014
@@ -51,6 +51,10 @@ If the output is not quite correct, chec
   </properties>
   <body>
     <release version="3.3" date="TBD" description="TBD">
+      <action dev="luc" type="fix" issue="MATH-1115">
+        Build properly empty polyhedrons set when given equal min/max 
boundaries. Also explained
+        better in the javadoc about some wrong usage of PolyhedronsSet 
constructor.
+      </action>
       <action dev="luc" type="fix" issue="MATH-1117">
         Build properly empty polygons set when given equal min/max boundaries. 
Also explained
         better in the javadoc about some wrong usage of PolygonsSet 
constructor.

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSet.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSet.java?rev=1590254&r1=1590253&r2=1590254&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSet.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSet.java
 Sat Apr 26 17:36:34 2014
@@ -59,6 +59,16 @@ public class PolyhedronsSet extends Abst
      * cells). In order to avoid building too many small objects, it is
      * recommended to use the predefined constants
      * {@code Boolean.TRUE} and {@code Boolean.FALSE}</p>
+     * <p>
+     * This constructor is aimed at expert use, as building the tree may
+     * be a difficult taks. It is not intended for general use and for
+     * performances reasons does not check thoroughly its input, as this would
+     * require walking the full tree each time. Failing to provide a tree with
+     * the proper attributes, <em>will</em> therefore generate problems like
+     * {@link NullPointerException} or {@link ClassCastException} only later 
on.
+     * This limitation is known and explains why this constructor is for expert
+     * use only. The caller does have the responsibility to provided correct 
arguments.
+     * </p>
      * @param tree inside/outside BSP tree representing the region
      * @param tolerance tolerance below which points are considered identical
      * @since 3.3
@@ -190,6 +200,10 @@ public class PolyhedronsSet extends Abst
                                                       final double yMin, final 
double yMax,
                                                       final double zMin, final 
double zMax,
                                                       final double tolerance) {
+        if ((xMin >= xMax - tolerance) || (yMin >= yMax - tolerance) || (zMin 
>= zMax - tolerance)) {
+            // too thin box, build an empty polygons set
+            return new BSPTree<Euclidean3D>(Boolean.FALSE);
+        }
         final Plane pxMin = new Plane(new Vector3D(xMin, 0,    0),   
Vector3D.MINUS_I, tolerance);
         final Plane pxMax = new Plane(new Vector3D(xMax, 0,    0),   
Vector3D.PLUS_I,  tolerance);
         final Plane pyMin = new Plane(new Vector3D(0,    yMin, 0),   
Vector3D.MINUS_J, tolerance);

Modified: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSetTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSetTest.java?rev=1590254&r1=1590253&r2=1590254&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSetTest.java
 (original)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/geometry/euclidean/threed/PolyhedronsSetTest.java
 Sat Apr 26 17:36:34 2014
@@ -285,6 +285,28 @@ public class PolyhedronsSetTest {
         Assert.assertEquals(24.0, polyhedronsSet.getBoundarySize(), 5.0e-6);
     }
 
+    @Test
+    public void testTooThinBox() {
+        Assert.assertEquals(0.0,
+                            new PolyhedronsSet(0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 
1.0e-10).getSize(),
+                            1.0e-10);
+    }
+
+    @Test
+    public void testWrongUsage() {
+        // the following is a wrong usage of the constructor.
+        // as explained in the javadoc, the failure is NOT detected at 
construction
+        // time but occurs later on
+        PolyhedronsSet ps = new PolyhedronsSet(new BSPTree<Euclidean3D>(), 
1.0e-10);
+        Assert.assertNotNull(ps);
+        try {
+            ps.checkPoint(Vector3D.ZERO);
+            Assert.fail("an exception should have been thrown");
+        } catch (NullPointerException npe) {
+            // this is expected
+        }
+    }
+
     private void checkPoints(Region.Location expected, PolyhedronsSet tree, 
Vector3D[] points) {
         for (int i = 0; i < points.length; ++i) {
             Assert.assertEquals(expected, tree.checkPoint(points[i]));


Reply via email to