This is an automated email from the ASF dual-hosted git repository.

mattjuntunen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-geometry.git

commit ffc419c4f89a479c82f2dd97fcded467a30a7040
Author: Andreas <andreas.goss1...@gmail.com>
AuthorDate: Sat Aug 12 15:11:29 2023 +0200

    GEOMETRY-144
    
    Remove unnecessary check and fix error for not yet well formed
    quadrilaterals. Valid points are not dismissed anymore.
---
 .../geometry/euclidean/twod/hull/ConvexHull2D.java |  6 +--
 .../euclidean/twod/hull/ConvexHullBuilderTest.java | 54 ++++++++++++++++++++++
 2 files changed, 56 insertions(+), 4 deletions(-)

diff --git 
a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/hull/ConvexHull2D.java
 
b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/hull/ConvexHull2D.java
index b67b1550..3b8710ce 100644
--- 
a/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/hull/ConvexHull2D.java
+++ 
b/commons-geometry-euclidean/src/main/java/org/apache/commons/geometry/euclidean/twod/hull/ConvexHull2D.java
@@ -178,14 +178,12 @@ public final class ConvexHull2D implements 
ConvexHull<Vector2D> {
             // Checks if the given point supersedes one of the corners.
             checkCorners(point);
 
-            // Only proceed if the quadrilateral is complete.
-            if (candidates.size() < 4) {
-                return this;
-            }
 
             buildQuadrilateral(minY, maxX, maxY, minX);
             // if the quadrilateral is not well formed, e.g. only 2 points, do 
not attempt to reduce
             if (quadrilateral.size() < 3) {
+               //Point cannot yet be dismissed.
+               candidates.add(point);
                 return this;
             }
 
diff --git 
a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/hull/ConvexHullBuilderTest.java
 
b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/hull/ConvexHullBuilderTest.java
index 735f4767..249ee015 100644
--- 
a/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/hull/ConvexHullBuilderTest.java
+++ 
b/commons-geometry-euclidean/src/test/java/org/apache/commons/geometry/euclidean/twod/hull/ConvexHullBuilderTest.java
@@ -230,6 +230,43 @@ class ConvexHullBuilderTest {
         checkConvexHull(points, hull, true);
     }
 
+    @Test
+    void testCollinearPointsIncludedColinearToFirstSide() {
+       // arrange
+       final Collection<Vector2D> points = new ArrayList<>();
+       points.add(Vector2D.of(1, 1));
+       points.add(Vector2D.of(2, 4));
+       points.add(Vector2D.of(10, 1));
+       points.add(Vector2D.of(1.5, 2.5));
+
+       // act
+       ConvexHull2D.Builder builder = createConvexHullGenerator(true);
+       builder.append(points);
+       final ConvexHull2D hull = builder.build();
+
+       // assert
+       checkConvexHull(points, hull, true);
+    }
+
+    @Test
+    void testCollinearPointsExcludedColinearToFirstSide() {
+       // arrange
+       final Collection<Vector2D> points = new ArrayList<>();
+       points.add(Vector2D.of(1, 1));
+       points.add(Vector2D.of(2, 4));
+       points.add(Vector2D.of(10, 1));
+       points.add(Vector2D.of(1.5, 2.5));
+
+       // act
+       ConvexHull2D.Builder builder = createConvexHullGenerator(false);
+       builder.append(points);
+       final ConvexHull2D hull = builder.build();
+
+       points.remove(Vector2D.of(1.5, 2.5));
+       // assert
+       checkConvexHull(points, hull, false);
+    }
+
     @Test
     void testIdenticalPoints() {
         // arrange
@@ -285,6 +322,23 @@ class ConvexHullBuilderTest {
         checkConvexHull(points, hull);
     }
 
+    @Test
+    void testOrderisIrrelevant() {
+       // arrange
+       final Collection<Vector2D> points = new ArrayList<>();
+       points.add(Vector2D.of(0, 0));
+       points.add(Vector2D.of(6, 6));
+       points.add(Vector2D.of(3, 4));
+       points.add(Vector2D.of(12, 0));
+
+       // act
+       generator.append(points);
+       final ConvexHull2D hull = generator.build();
+
+       // assert
+       checkConvexHull(points, hull);
+    }
+
     @Test
     void testCollinearPointOnExistingBoundary() {
         // --- arrange

Reply via email to