[ 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 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>(); was: 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>(); > MonotoneChain does not handle the case of a collinear point on the existing > boundary correctly (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 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>(); -- This message was sent by Atlassian JIRA (v6.2#6252)