From c926e0176a293c59fefcdc1cdba7f22ab79570af Mon Sep 17 00:00:00 2001 From: Martin Davis Date: Thu, 13 Aug 2026 14:26:55 -0700 Subject: [PATCH 1/2] Javadoc --- .../src/main/java/org/locationtech/jts/geom/Quadrant.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/locationtech/jts/geom/Quadrant.java b/modules/core/src/main/java/org/locationtech/jts/geom/Quadrant.java index 5aef35a088..96b4c27cff 100644 --- a/modules/core/src/main/java/org/locationtech/jts/geom/Quadrant.java +++ b/modules/core/src/main/java/org/locationtech/jts/geom/Quadrant.java @@ -57,8 +57,8 @@ public static int quadrant(double dx, double dy) /** * Returns the quadrant of a directed line segment from p0 to p1. * - * Note: using this method is more robust than using {@link #quadrant(double, double) - * if that requires subtractions to compute vector components. + * This method is more robust than {@link #quadrant(double, double) + * if using that requires subtractions to compute vector components. * * @throws IllegalArgumentException if the points are equal */ From 8d7d724af79daabdfa4716a1adcd995b4ed22de8 Mon Sep 17 00:00:00 2001 From: Martin Davis Date: Thu, 13 Aug 2026 14:38:21 -0700 Subject: [PATCH 2/2] Compute quadrant using coordinates to improve robustness --- .../jts/algorithm/PolygonNodeTopology.java | 15 +++++---------- .../java/org/locationtech/jts/geom/Quadrant.java | 3 +++ .../org/locationtech/jts/geomgraph/EdgeEnd.java | 2 +- .../jts/planargraph/DirectedEdge.java | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/modules/core/src/main/java/org/locationtech/jts/algorithm/PolygonNodeTopology.java b/modules/core/src/main/java/org/locationtech/jts/algorithm/PolygonNodeTopology.java index de47f251e5..934a450eb0 100644 --- a/modules/core/src/main/java/org/locationtech/jts/algorithm/PolygonNodeTopology.java +++ b/modules/core/src/main/java/org/locationtech/jts/algorithm/PolygonNodeTopology.java @@ -142,8 +142,8 @@ private static int compareBetween(Coordinate origin, Coordinate p, Coordinate e0 * @return true if vector P has angle greater than Q */ private static boolean isAngleGreater(Coordinate origin, Coordinate p, Coordinate q) { - int quadrantP = quadrant(origin, p); - int quadrantQ = quadrant(origin, q); + int quadrantP = Quadrant.quadrant(origin, p); + int quadrantQ = Quadrant.quadrant(origin, q); /** * If the vectors are in different quadrants, @@ -170,8 +170,8 @@ private static boolean isAngleGreater(Coordinate origin, Coordinate p, Coordinat * @return a negative integer, zero, or a positive integer as this vector P has angle less than, equal to, or greater than vector Q */ public static int compareAngle(Coordinate origin, Coordinate p, Coordinate q) { - int quadrantP = quadrant(origin, p); - int quadrantQ = quadrant(origin, q); + int quadrantP = Quadrant.quadrant(origin, p); + int quadrantQ = Quadrant.quadrant(origin, q); /** * If the vectors are in different quadrants, @@ -190,11 +190,6 @@ public static int compareAngle(Coordinate origin, Coordinate p, Coordinate q) { default: return 0; } } - - private static int quadrant(Coordinate origin, Coordinate p) { - double dx = p.getX() - origin.getX(); - double dy = p.getY() - origin.getY(); - return Quadrant.quadrant(dx, dy); - } + } diff --git a/modules/core/src/main/java/org/locationtech/jts/geom/Quadrant.java b/modules/core/src/main/java/org/locationtech/jts/geom/Quadrant.java index 96b4c27cff..3ae465e151 100644 --- a/modules/core/src/main/java/org/locationtech/jts/geom/Quadrant.java +++ b/modules/core/src/main/java/org/locationtech/jts/geom/Quadrant.java @@ -34,6 +34,9 @@ public class Quadrant * Returns the quadrant of a directed line segment (specified as x and y * displacements, which cannot both be 0). * + * If the segment coordinates are available it is more robust + * to use {@link #quadrant(Coordinate, Coordinate). + * * @throws IllegalArgumentException if the displacements are both 0 */ public static int quadrant(double dx, double dy) diff --git a/modules/core/src/main/java/org/locationtech/jts/geomgraph/EdgeEnd.java b/modules/core/src/main/java/org/locationtech/jts/geomgraph/EdgeEnd.java index 136849bcfd..a4cb497b24 100644 --- a/modules/core/src/main/java/org/locationtech/jts/geomgraph/EdgeEnd.java +++ b/modules/core/src/main/java/org/locationtech/jts/geomgraph/EdgeEnd.java @@ -57,9 +57,9 @@ protected void init(Coordinate p0, Coordinate p1) { this.p0 = p0; this.p1 = p1; + quadrant = Quadrant.quadrant(p0, p1); dx = p1.x - p0.x; dy = p1.y - p0.y; - quadrant = Quadrant.quadrant(dx, dy); Assert.isTrue(! (dx == 0 && dy == 0), "EdgeEnd with identical endpoints found"); } diff --git a/modules/core/src/main/java/org/locationtech/jts/planargraph/DirectedEdge.java b/modules/core/src/main/java/org/locationtech/jts/planargraph/DirectedEdge.java index 7db4807ede..758cc31b6c 100644 --- a/modules/core/src/main/java/org/locationtech/jts/planargraph/DirectedEdge.java +++ b/modules/core/src/main/java/org/locationtech/jts/planargraph/DirectedEdge.java @@ -75,9 +75,9 @@ public DirectedEdge(Node from, Node to, Coordinate directionPt, boolean edgeDire this.edgeDirection = edgeDirection; p0 = from.getCoordinate(); p1 = directionPt; + quadrant = Quadrant.quadrant(p0, p1); double dx = p1.x - p0.x; double dy = p1.y - p0.y; - quadrant = Quadrant.quadrant(dx, dy); angle = Math.atan2(dy, dx); //Assert.isTrue(! (dx == 0 && dy == 0), "EdgeEnd with identical endpoints found"); }