1 module polyplex.math.rectangle;
2 import polyplex.math;
3
4 /// Base template for all AABB-types.
5 /// Params:
6 /// type = all values get stored as this type
7 class Rectangle {
8 private int x = 0;
9 private int y = 0;
10 private int width = 0;
11 private int height = 0;
12
13 this() { }
14
15 this(int width, int height) {
16 this.x = 0;
17 this.y = 0;
18 this.width = width;
19 this.height = height;
20 }
21
22 this(int x, int y, int width, int height) {
23 this.x = x;
24 this.y = y;
25 this.width = width;
26 this.height = height;
27 }
28
29 public @property int X() { return this.x; }
30 public @property void X(int x) { this.x = x; }
31
32 public @property int Y() { return this.y; }
33 public @property void Y(int y) { this.y = y; }
34
35 public @property int Width() { return this.width; }
36 public @property void Width(int width) { this.width = width; }
37
38 public @property int Height() { return this.height; }
39 public @property void Height(int height) { this.height = height; }
40
41 public int Left() { return this.x; }
42 public int Right() { return this.x + this.width; }
43 public int Top() { return this.y; }
44 public int Bottom() { return this.y + this.height; }
45 public Vector2 Center() { return Vector2(this.x + (this.width/2), this.y + (this.height/2)); }
46
47 public bool Intersects(Rectangle other) {
48 if (other is null) return false;
49 bool v = (other.Left > this.Right || other.Right < this.Left || other.Top > this.Bottom || other.Bottom < this.Top);
50 return !v;
51 }
52
53 public bool Intersects(Vector2 other) {
54 bool v = (other.X > this.Right || other.X < this.Left || other.Y > this.Bottom || other.Y < this.Top);
55 return !v;
56 }
57
58 public Rectangle Displace(int x, int y) {
59 return new Rectangle(this.X+x, this.Y+y, this.width, this.height);
60 }
61
62 public Rectangle Expand(int x, int y) {
63 return new Rectangle(this.X-x, this.Y-y, this.width+x, this.height+y);
64 }
65 }