[ 
https://issues.apache.org/jira/browse/MATH-1135?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Guillaume Marceau updated MATH-1135:
------------------------------------

    Description: 
MonotoneChain.java attempts to handle the case when a point appears that is 
prolonging the line formed by the previous last points and the last point on 
the chain being constructed. It code should replace the last point with the new 
point.



The data points in the test are from a case that showed up before we went to 
production.

Index: 
src/main/java/org/apache/commons/math3/geometry/euclidean/twod/hull/MonotoneChain.java
===================================================================
--- 
src/main/java/org/apache/commons/math3/geometry/euclidean/twod/hull/MonotoneChain.java
      (revision 1609491)
+++ 
src/main/java/org/apache/commons/math3/geometry/euclidean/twod/hull/MonotoneChain.java
      (working copy)
@@ -160,8 +160,8 @@
                 } else {
                     if (distanceToCurrent > distanceToLast) {
                         hull.remove(size - 1);
+                        hull.add(point);
                     }
-                    hull.add(point);
                 }
                 return;
             } else if (offset > 0) {
Index: 
src/test/java/org/apache/commons/math3/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java
===================================================================
--- 
src/test/java/org/apache/commons/math3/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java
  (revision 1609491)
+++ 
src/test/java/org/apache/commons/math3/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java
  (working copy)
@@ -204,6 +204,24 @@
     }
 
     @Test
+    public void testCollinnearPointOnExistingBoundary() {
+        final Collection<Vector2D> points = new ArrayList<Vector2D>();
+        points.add(new Vector2D(7.3152, 34.7472));
+        points.add(new Vector2D(6.400799999999997, 34.747199999999985));
+        points.add(new Vector2D(5.486399999999997, 34.7472));
+        points.add(new Vector2D(4.876799999999999, 34.7472));
+        points.add(new Vector2D(4.876799999999999, 34.1376));
+        points.add(new Vector2D(4.876799999999999, 30.48));
+        points.add(new Vector2D(6.0959999999999965, 30.48));
+        points.add(new Vector2D(6.0959999999999965, 34.1376));
+        points.add(new Vector2D(7.315199999999996, 34.1376));
+        points.add(new Vector2D(7.3152, 30.48));
+
+        final ConvexHull2D hull = generator.generate(points);
+        checkConvexHull(points, hull);
+    }
+
+    @Test
     public void testIssue1123() {
 
         List<Vector2D> points = new ArrayList<Vector2D>();


  was:
MonotoneChain.java attempts to handle the case when a point appears between the 
last and the previous last points on the chain being constructed, but there is 
a bug.



The data points in the test are from a case that showed up before we went to 
production.

Index: 
src/main/java/org/apache/commons/math3/geometry/euclidean/twod/hull/MonotoneChain.java
===================================================================
--- 
src/main/java/org/apache/commons/math3/geometry/euclidean/twod/hull/MonotoneChain.java
      (revision 1609491)
+++ 
src/main/java/org/apache/commons/math3/geometry/euclidean/twod/hull/MonotoneChain.java
      (working copy)
@@ -160,8 +160,8 @@
                 } else {
                     if (distanceToCurrent > distanceToLast) {
                         hull.remove(size - 1);
+                        hull.add(point);
                     }
-                    hull.add(point);
                 }
                 return;
             } else if (offset > 0) {
Index: 
src/test/java/org/apache/commons/math3/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java
===================================================================
--- 
src/test/java/org/apache/commons/math3/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java
  (revision 1609491)
+++ 
src/test/java/org/apache/commons/math3/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java
  (working copy)
@@ -204,6 +204,24 @@
     }
 
     @Test
+    public void testCollinnearPointOnExistingBoundary() {
+        final Collection<Vector2D> points = new ArrayList<Vector2D>();
+        points.add(new Vector2D(7.3152, 34.7472));
+        points.add(new Vector2D(6.400799999999997, 34.747199999999985));
+        points.add(new Vector2D(5.486399999999997, 34.7472));
+        points.add(new Vector2D(4.876799999999999, 34.7472));
+        points.add(new Vector2D(4.876799999999999, 34.1376));
+        points.add(new Vector2D(4.876799999999999, 30.48));
+        points.add(new Vector2D(6.0959999999999965, 30.48));
+        points.add(new Vector2D(6.0959999999999965, 34.1376));
+        points.add(new Vector2D(7.315199999999996, 34.1376));
+        points.add(new Vector2D(7.3152, 30.48));
+
+        final ConvexHull2D hull = generator.generate(points);
+        checkConvexHull(points, hull);
+    }
+
+    @Test
     public void testIssue1123() {
 
         List<Vector2D> points = new ArrayList<Vector2D>();



> Bug in MonotoneChain: a collinear point prolonging the existing boundary 
> should not be dropped (patch)
> ------------------------------------------------------------------------------------------------------
>
>                 Key: MATH-1135
>                 URL: https://issues.apache.org/jira/browse/MATH-1135
>             Project: Commons Math
>          Issue Type: Bug
>    Affects Versions: 3.3
>            Reporter: Guillaume Marceau
>            Priority: Minor
>              Labels: patch
>         Attachments: MonotoneChain_testCollinnearPointOnExistingBoundary.patch
>
>
> MonotoneChain.java attempts to handle the case when a point appears that is 
> prolonging the line formed by the previous last points and the last point on 
> the chain being constructed. It code should replace the last point with the 
> new point.
> The data points in the test are from a case that showed up before we went to 
> production.
> Index: 
> src/main/java/org/apache/commons/math3/geometry/euclidean/twod/hull/MonotoneChain.java
> ===================================================================
> --- 
> src/main/java/org/apache/commons/math3/geometry/euclidean/twod/hull/MonotoneChain.java
>     (revision 1609491)
> +++ 
> src/main/java/org/apache/commons/math3/geometry/euclidean/twod/hull/MonotoneChain.java
>     (working copy)
> @@ -160,8 +160,8 @@
>                  } else {
>                      if (distanceToCurrent > distanceToLast) {
>                          hull.remove(size - 1);
> +                        hull.add(point);
>                      }
> -                    hull.add(point);
>                  }
>                  return;
>              } else if (offset > 0) {
> Index: 
> src/test/java/org/apache/commons/math3/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java
> ===================================================================
> --- 
> src/test/java/org/apache/commons/math3/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java
>         (revision 1609491)
> +++ 
> src/test/java/org/apache/commons/math3/geometry/euclidean/twod/hull/ConvexHullGenerator2DAbstractTest.java
>         (working copy)
> @@ -204,6 +204,24 @@
>      }
>  
>      @Test
> +    public void testCollinnearPointOnExistingBoundary() {
> +        final Collection<Vector2D> points = new ArrayList<Vector2D>();
> +        points.add(new Vector2D(7.3152, 34.7472));
> +        points.add(new Vector2D(6.400799999999997, 34.747199999999985));
> +        points.add(new Vector2D(5.486399999999997, 34.7472));
> +        points.add(new Vector2D(4.876799999999999, 34.7472));
> +        points.add(new Vector2D(4.876799999999999, 34.1376));
> +        points.add(new Vector2D(4.876799999999999, 30.48));
> +        points.add(new Vector2D(6.0959999999999965, 30.48));
> +        points.add(new Vector2D(6.0959999999999965, 34.1376));
> +        points.add(new Vector2D(7.315199999999996, 34.1376));
> +        points.add(new Vector2D(7.3152, 30.48));
> +
> +        final ConvexHull2D hull = generator.generate(points);
> +        checkConvexHull(points, hull);
> +    }
> +
> +    @Test
>      public void testIssue1123() {
>  
>          List<Vector2D> points = new ArrayList<Vector2D>();



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to