Updated readability of the code.
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / geometry / Point2D.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.sqrt;
8
9 /**
10  * Used to represent point in a 2D space or vector.
11  */
12 public class Point2D implements Cloneable {
13
14     public double x, y;
15
16     public Point2D() {
17     }
18
19     public Point2D(final double x, final double y) {
20         this.x = x;
21         this.y = y;
22     }
23
24     public Point2D(final Point2D parent) {
25         x = parent.x;
26         y = parent.y;
27     }
28
29
30     /**
31      * Add other point to current point. Value of other point will not be changed.
32      *
33      * @return current point.
34      */
35     public Point2D add(final Point2D otherPoint) {
36         x += otherPoint.x;
37         y += otherPoint.y;
38         return this;
39     }
40
41     /**
42      * @return true if current point coordinates are equal to zero.
43      */
44     public boolean isZero() {
45         return (x == 0) && (y == 0);
46     }
47
48     @Override
49     public Point2D clone() {
50         return new Point2D(this);
51     }
52
53     /**
54      * Copy coordinates from other point to current point. Value of other point will not be changed.
55      */
56     public void clone(final Point2D otherPoint) {
57         x = otherPoint.x;
58         y = otherPoint.y;
59     }
60
61     /**
62      * Set current point to middle of two other points.
63      *
64      * @param p1 first point.
65      * @param p2 second point.
66      * @return current point.
67      */
68     public Point2D setToMiddle(final Point2D p1, final Point2D p2) {
69         x = (p1.x + p2.x) / 2d;
70         y = (p1.y + p2.y) / 2d;
71         return this;
72     }
73
74     public double getAngleXY(final Point2D anotherPoint) {
75         return Math.atan2(x - anotherPoint.x, y - anotherPoint.y);
76     }
77
78     /**
79      * Compute distance to another point.
80      *
81      * @param anotherPoint point to compute distance to.
82      * @return distance from current point to another point.
83      */
84     public double getDistanceTo(final Point2D anotherPoint) {
85         final double xDiff = x - anotherPoint.x;
86         final double yDiff = y - anotherPoint.y;
87
88         return sqrt(((xDiff * xDiff) + (yDiff * yDiff)));
89     }
90
91     /**
92      * Calculate length of vector.
93      * @return length of vector.
94      */
95     public double getVectorLength() {
96         return sqrt(((x * x) + (y * y)));
97     }
98
99     /**
100      * Invert current point.
101      *
102      * @return current point.
103      */
104     public Point2D invert() {
105         x = -x;
106         y = -y;
107         return this;
108     }
109
110     /**
111      * Round current point coordinates to integer.
112      */
113     public void roundToInteger() {
114         x = (int) x;
115         y = (int) y;
116     }
117
118     /**
119      * Subtract other point from current point. Value of other point will not be changed.
120      *
121      * @return current point.
122      */
123     public Point2D subtract(final Point2D otherPoint) {
124         x -= otherPoint.x;
125         y -= otherPoint.y;
126         return this;
127     }
128
129     /**
130      * Convert current point to 3D point.
131      * Value of the z coordinate will be set to zero.
132      *
133      * @return 3D point.
134      */
135     public Point3D to3D() {
136         return new Point3D(x, y, 0);
137     }
138
139     /**
140      * Set current point to zero.
141      *
142      * @return current point.
143      */
144     public Point2D zero() {
145         x = 0;
146         y = 0;
147         return this;
148     }
149
150     @Override
151     public String toString() {
152         return "Point2D{" +
153                 "x=" + x +
154                 ", y=" + y +
155                 '}';
156     }
157 }