Identified a new failure mode for polygons.

Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-math/commit/c29e3d68
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/c29e3d68
Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/c29e3d68

Branch: refs/heads/master
Commit: c29e3d681f2a46cc3288dc4f38925efbcf30c233
Parents: e11c000
Author: Luc Maisonobe <l...@apache.org>
Authored: Sun Nov 30 11:40:27 2014 +0100
Committer: Luc Maisonobe <l...@apache.org>
Committed: Tue Dec 2 15:24:31 2014 +0100

----------------------------------------------------------------------
 .../euclidean/twod/PolygonsSetTest.java         | 37 ++++++++++++++++++++
 1 file changed, 37 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-math/blob/c29e3d68/src/test/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSetTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSetTest.java
 
b/src/test/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSetTest.java
index 348ace8..c6c68a0 100644
--- 
a/src/test/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSetTest.java
+++ 
b/src/test/java/org/apache/commons/math3/geometry/euclidean/twod/PolygonsSetTest.java
@@ -24,6 +24,7 @@ import 
org.apache.commons.math3.geometry.euclidean.oned.IntervalsSet;
 import org.apache.commons.math3.geometry.euclidean.oned.Vector1D;
 import org.apache.commons.math3.geometry.partitioning.BSPTree;
 import org.apache.commons.math3.geometry.partitioning.BoundaryProjection;
+import org.apache.commons.math3.geometry.partitioning.Hyperplane;
 import org.apache.commons.math3.geometry.partitioning.Region;
 import org.apache.commons.math3.geometry.partitioning.Region.Location;
 import org.apache.commons.math3.geometry.partitioning.RegionFactory;
@@ -1107,6 +1108,42 @@ public class PolygonsSetTest {
 
     }
 
+    @Test
+    public void testThinRectangle() {
+
+        RegionFactory<Euclidean2D> factory = new RegionFactory<Euclidean2D>();
+        Vector2D pA = new Vector2D(0.0,        1.0);
+        Vector2D pB = new Vector2D(0.0,        0.0);
+        Vector2D pC = new Vector2D(1.0 / 64.0, 0.0);
+        Vector2D pD = new Vector2D(1.0 / 64.0, 1.0);
+
+        // if tolerance is smaller than rectangle width, the rectangle is 
computed accurately
+        Hyperplane<Euclidean2D>[] h1 = new Line[] {
+            new Line(pA, pB, 1.0 / 256),
+            new Line(pB, pC, 1.0 / 256),
+            new Line(pC, pD, 1.0 / 256),
+            new Line(pD, pA, 1.0 / 256)
+        };
+        Region<Euclidean2D> accuratePolygon = factory.buildConvex(h1);
+        Assert.assertEquals(1.0 / 64.0, accuratePolygon.getSize(), 1.0e-10);
+        Assert.assertTrue(Double.isInfinite(new 
RegionFactory<Euclidean2D>().getComplement(accuratePolygon).getSize()));
+        Assert.assertEquals(2 * (1.0 + 1.0 / 64.0), 
accuratePolygon.getBoundarySize(), 1.0e-10);
+
+        // if tolerance is larger than rectangle width, the rectangle 
degenerates
+        // as of 3.3, its two long edges cannot be distinguished anymore and 
this part of the test fails
+        Hyperplane<Euclidean2D>[] h2 = new Line[] {
+            new Line(pA, pB, 1.0 / 16),
+            new Line(pB, pC, 1.0 / 16),
+            new Line(pC, pD, 1.0 / 16),
+            new Line(pD, pA, 1.0 / 16)
+        };
+        Region<Euclidean2D> degeneratedPolygon = factory.buildConvex(h2);
+        Assert.assertEquals(1.0 / 64.0, degeneratedPolygon.getSize(), 1.0e-10);
+        Assert.assertTrue(Double.isInfinite(new 
RegionFactory<Euclidean2D>().getComplement(degeneratedPolygon).getSize()));
+        Assert.assertEquals(2 * (1.0 + 1.0 / 64.0), 
degeneratedPolygon.getBoundarySize(), 1.0e-10);
+
+    }
+
     private PolygonsSet buildSet(Vector2D[][] vertices) {
         ArrayList<SubHyperplane<Euclidean2D>> edges = new 
ArrayList<SubHyperplane<Euclidean2D>>();
         for (int i = 0; i < vertices.length; ++i) {

Reply via email to