You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by iv...@apache.org on 2021/03/30 05:49:24 UTC

[lucene-solr] branch branch_8_8 updated: LUCENE-9870: Fix Circle2D intersectsLine t-value (distance) range clamp (#41)

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

ivera pushed a commit to branch branch_8_8
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/branch_8_8 by this push:
     new be8fb34  LUCENE-9870: Fix Circle2D intersectsLine t-value (distance) range clamp (#41)
be8fb34 is described below

commit be8fb34d3d34b2fa3ac4a320b4b2af796d112d34
Author: Jørgen Nystad <jn...@avinet.no>
AuthorDate: Mon Mar 29 10:41:54 2021 +0200

    LUCENE-9870: Fix Circle2D intersectsLine t-value (distance) range clamp (#41)
---
 lucene/CHANGES.txt                                 |  3 ++-
 .../src/java/org/apache/lucene/geo/Circle2D.java   |  2 +-
 .../test/org/apache/lucene/geo/TestCircle2D.java   | 24 ++++++++++++++++++++++
 3 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index d6c576e..c85e58d 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -7,7 +7,8 @@ http://s.apache.org/luceneversions
 
 Bug Fixes
 ---------------------
-(No changes)
+
+* LUCENE-9870: Fix Circle2D intersectsLine t-value (distance) range clamp (Jørgen Nystad)
 
 ======================= Lucene 8.8.1 =======================
 
diff --git a/lucene/core/src/java/org/apache/lucene/geo/Circle2D.java b/lucene/core/src/java/org/apache/lucene/geo/Circle2D.java
index 4cc64ed..0d0cb4d 100644
--- a/lucene/core/src/java/org/apache/lucene/geo/Circle2D.java
+++ b/lucene/core/src/java/org/apache/lucene/geo/Circle2D.java
@@ -171,7 +171,7 @@ class Circle2D implements Component2D {
 
     final double distance = dotProduct / magnitudeAB;
 
-    if (distance < 0 || distance > dotProduct) {
+    if (distance < 0 || distance > 1) {
       return false;
     }
 
diff --git a/lucene/core/src/test/org/apache/lucene/geo/TestCircle2D.java b/lucene/core/src/test/org/apache/lucene/geo/TestCircle2D.java
index 6726a75..50fdd2b 100644
--- a/lucene/core/src/test/org/apache/lucene/geo/TestCircle2D.java
+++ b/lucene/core/src/test/org/apache/lucene/geo/TestCircle2D.java
@@ -165,4 +165,28 @@ public class TestCircle2D extends LuceneTestCase {
       }
     }
   }
+
+  public void testLineIntersects() {
+    Component2D circle2D;
+    if (random().nextBoolean()) {
+      Circle circle = new Circle(0, 0, 35000);
+      circle2D = LatLonGeometry.create(circle);
+    } else {
+      XYCircle xyCircle = new XYCircle(0, 0, 0.3f);
+      circle2D = XYGeometry.create(xyCircle);
+    }
+
+    double ax = -0.25;
+    double ay = 0.25;
+    double bx = 0.25;
+    double by = 0.25;
+    double cx = 0.2;
+    double cy = 0.25;
+    // Test A->B, circle touches center of line, line is less than 1 unit long
+    assertTrue(circle2D.intersectsLine(ax, ay, bx, by));
+    // Test B->C, circle doesn't touch line itself, but touches extended line at t > 1
+    assertFalse(circle2D.intersectsLine(bx, by, cx, cy));
+    // Test C->B, circle doesn't touch line itself, but touches extended line at t < 0
+    assertFalse(circle2D.intersectsLine(cx, cy, bx, by));
+  }
 }