From 50087b8175908c6f2e007f3a66f95cddcd41f0aa Mon Sep 17 00:00:00 2001
From: Eugen Ciur <eugen@papermerge.com>
Date: Thu, 3 Feb 2022 10:34:54 +0200
Subject: [PATCH] rectangle intersection works!

---
 app/modifiers/ui_select.js   |  2 +-
 app/utils/rectangle.js       | 76 +++++++++---------------------------
 tests/unit/rectangle-test.js | 39 ++++++++----------
 3 files changed, 36 insertions(+), 81 deletions(-)

diff --git a/app/modifiers/ui_select.js b/app/modifiers/ui_select.js
index c055e91..6c78780 100644
--- a/app/modifiers/ui_select.js
+++ b/app/modifiers/ui_select.js
@@ -1,6 +1,6 @@
 import { action } from '@ember/object';
 import Modifier from 'ember-modifier';
-import { Rectangle } from 'papermerge/utils/rectangle';
+import Rectangle from 'papermerge/utils/rectangle';
 
 
 
diff --git a/app/utils/rectangle.js b/app/utils/rectangle.js
index dc789f1..9c60298 100644
--- a/app/utils/rectangle.js
+++ b/app/utils/rectangle.js
@@ -1,6 +1,24 @@
 import Point from 'papermerge/utils/point';
 
 
+function intersect(rectA, rectB) {
+  let rectA_X1 = rectA.p1.x,
+      rectA_Y1 = rectA.p1.y,
+      rectA_X2 = rectA.p3.x,
+      rectA_Y2 = rectA.p3.y,
+      rectB_X1 = rectB.p1.x,
+      rectB_Y1 = rectB.p1.y,
+      rectB_X2 = rectB.p3.x,
+      rectB_Y2 = rectB.p3.y;
+
+    if ((rectA_X1 <= rectB_X2) && (rectA_X2 >= rectB_X1) && (rectA_Y1 <= rectB_Y2) && (rectA_Y2 >= rectB_Y1)) {
+      return true;
+    }
+
+    return false;
+}
+
+
 export default class Rectangle {
 
   constructor(x, y, width, height) {
@@ -16,63 +34,7 @@ export default class Rectangle {
   }
 
   intersect(rect) {
-    /*
-    Returns true if this rectangle intersects with rect
-    (or other way around).
-    Two rectangle intersect if one of them has a point inside other.
-    */
-    if (this.contains_point(rect.p1)) {
-      return true;
-    }
-
-    if (this.contains_point(rect.p2)) {
-      return true;
-    }
-
-    if (this.contains_point(rect.p3)) {
-      return true;
-    }
-
-    if (this.contains_point(rect.p4)) {
-      return true;
-    }
-
-    // or other way around
-    if (rect.contains_point(this.p1)) {
-      return true;
-    }
-
-    if (rect.contains_point(this.p2)) {
-      return true;
-    }
-
-    if (rect.contains_point(this.p3)) {
-      return true;
-    }
-
-    if (rect.contains_point(this.p4)) {
-      return true;
-    }
-
-    return false;
-  }
-
-  contains_point(point) {
-    /*
-      Is point (x, y) inside this rectangle ?
-    */
-    let x_is_within = false, y_is_within = false;
-
-
-    if (this.x <= point.x && point.x <= this.x + this.width) {
-      x_is_within = true;
-    }
-
-    if (this.y <= point.y && point.y <= this.y + this.height) {
-      y_is_within = true;
-    }
-
-    return x_is_within && y_is_within;
+    return intersect(rect, this) || intersect(this, rect);
   }
 
   toString() {
diff --git a/tests/unit/rectangle-test.js b/tests/unit/rectangle-test.js
index 798432f..1e117fa 100644
--- a/tests/unit/rectangle-test.js
+++ b/tests/unit/rectangle-test.js
@@ -10,28 +10,6 @@ module('Unit | Rectangle', function () {
     assert.ok(rect);
   });
 
-  test('contains_point positive', function(assert) {
-    let rect, point;
-
-    rect = new Rectangle(100, 100, 10, 10);
-    point  = new Point(105, 105);
-
-    assert.true(
-      rect.contains_point(point)
-    )
-  });
-
-  test('contains_point negative', function(assert) {
-    let rect, point;
-
-    rect = new Rectangle(100, 100, 10, 10);
-    point  = new Point(50, 50);
-
-    assert.false(
-      rect.contains_point(point)
-    )
-  });
-
   test('p1, p2, p3, p4', function(assert) {
     let rect;
 
@@ -54,7 +32,7 @@ module('Unit | Rectangle', function () {
     );
   });
 
-  test('instersect positive', function(assert) {
+  test('instersect positive 1', function(assert) {
     let rect1, rect2;
 
     rect1 = new Rectangle(100, 100, 20, 20);
@@ -69,6 +47,21 @@ module('Unit | Rectangle', function () {
     );
   });
 
+  test('instersect positive 2', function(assert) {
+    let rect1, rect2;
+
+    rect1 = new Rectangle(100, 100, 20, 20);
+    rect2 = new Rectangle(110, 90, 5, 300);
+
+    assert.true(
+      rect1.intersect(rect2)
+    );
+
+    assert.true(
+      rect2.intersect(rect1)
+    );
+  });
+
   test('instersect negative', function(assert) {
     let rect1, rect2;
 
-- 
GitLab