Updated readability of the code.
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / geometry / Box.java
1 /*
2  * Sixth 3D engine. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.sixth.e3d.geometry;
6
7 import static java.lang.Math.abs;
8
9 /**
10  * Same as: 3D rectangle, rectangular box, rectangular parallelopiped, cuboid,
11  * rhumboid, hexahedron, rectangular prism.
12  */
13 public class Box implements Cloneable {
14
15     /**
16      * The first point of the box.
17      */
18     public final Point3D p1;
19     /**
20      * The second point of the box.
21      */
22     public final Point3D p2;
23
24     /**
25      * Creates a new box with two points at the origin.
26      */
27     public Box() {
28         p1 = new Point3D();
29         p2 = new Point3D();
30     }
31
32     /**
33      * Creates a new box with two points at the specified coordinates.
34      */
35     public Box(final Point3D p1, final Point3D p2) {
36         this.p1 = p1;
37         this.p2 = p2;
38     }
39
40
41     /**
42      * Enlarges the box by the specified border in all directions.
43      *
44      * @param border The border to enlarge the box by.
45      *               If the border is negative, the box will be shrunk.
46      * @return The current box.
47      */
48     public Box enlarge(final double border) {
49
50         if (p1.x < p2.x) {
51             p1.translateX(-border);
52             p2.translateX(border);
53         } else {
54             p1.translateX(border);
55             p2.translateX(-border);
56         }
57
58         if (p1.y < p2.y) {
59             p1.translateY(-border);
60             p2.translateY(border);
61         } else {
62             p1.translateY(border);
63             p2.translateY(-border);
64         }
65
66         if (p1.z < p2.z) {
67             p1.translateZ(-border);
68             p2.translateZ(border);
69         } else {
70             p1.translateZ(border);
71             p2.translateZ(-border);
72         }
73
74         return this;
75     }
76
77     @Override
78     public Box clone() {
79         return new Box(p1.clone(), p2.clone());
80     }
81
82     /**
83      * @return The depth of the box. The depth is the distance between the two points on the z-axis.
84      */
85     public double getDepth() {
86         return abs(p1.z - p2.z);
87     }
88
89     /**
90      * @return The height of the box. The height is the distance between the two points on the y-axis.
91      */
92     public double getHeight() {
93         return abs(p1.y - p2.y);
94     }
95
96     /**
97      * @return The width of the box. The width is the distance between the two points on the x-axis.
98      */
99     public double getWidth() {
100         return abs(p1.x - p2.x);
101     }
102
103
104     /**
105      * Sets the size of the box. The box will be centered at the origin.
106      * Previous size and position of the box will be lost.
107      *
108      * @param size {@link Point3D} specifies box size in x, y and z axis.
109      */
110     public void setBoxSize(final Point3D size) {
111         p2.clone(size).scaleDown(2);
112         p1.clone(p2).invert();
113     }
114
115 }