-
Notifications
You must be signed in to change notification settings - Fork 0
/
rectangle.js
54 lines (52 loc) · 1.86 KB
/
rectangle.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class Rectangle {
constructor(bottomLeft, topRight) {
// check if points make valid rectangle
if (!validateRectangle(bottomLeft, topRight)) {
console.error("invalid rectangle")
return false;
}
this.bottomLeft = bottomLeft;
this.topRight = topRight;
}
// we assume contains includes the boundary, i.e the borders overlap
// also seems more intuitive to be relative, hence contains() being a class method
contains(Rectangle) {
return (this.bottomLeft.x <= Rectangle.bottomLeft.x &&
this.bottomLeft.y <= Rectangle.bottomLeft.y) &&
(this.topRight.x >= Rectangle.topRight.x && this.topRight.y >= Rectangle.topRight.y);
}
}
function validateRectangle(bottomLeft, topRight, checkIntersect) {
let checkIntersection = checkIntersect || false;
if (!bottomLeft || !topRight) {
console.error("A point is undefined!");
return false;
}
if (typeof bottomLeft.x !== "number" || typeof bottomLeft.y !== "number") {
console.error("Bottom left point is incomplete!");
return false;
}
if (typeof topRight.x !== "number" || typeof topRight.y !== "number") {
console.error("Top right point is incomplete!");
return false;
}
// checking bottomLeft < topRight for reactangle to be valid
if (bottomLeft.x > topRight.x) {
console.error("Bottom left point is to the right of top right point!");
return false;
}
if (bottomLeft.y > topRight.y) {
console.error("Bottom left point is above the top right point!");
return false;
}
// if the 2 points share coords, it's either a line or point, not a rectangle
if (bottomLeft.y === topRight.y || bottomLeft.x === topRight.x) {
console.error("The rectangles points are a line/point!")
if(checkIntersection) {
return true;
}
return false;
}
return true;
}
module.exports = { Rectangle: Rectangle, validateRectangle: validateRectangle };