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