summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/bukkit/util/EulerAngle.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/bukkit/util/EulerAngle.java')
-rw-r--r--src/main/java/org/bukkit/util/EulerAngle.java147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/main/java/org/bukkit/util/EulerAngle.java b/src/main/java/org/bukkit/util/EulerAngle.java
new file mode 100644
index 00000000..7778710c
--- /dev/null
+++ b/src/main/java/org/bukkit/util/EulerAngle.java
@@ -0,0 +1,147 @@
+package org.bukkit.util;
+
+/**
+ * EulerAngle is used to represent 3 angles, one for each
+ * axis (x, y, z). The angles are in radians
+ */
+public class EulerAngle {
+
+ /**
+ * A EulerAngle with every axis set to 0
+ */
+ public static final EulerAngle ZERO = new EulerAngle(0, 0, 0);
+
+ private final double x;
+ private final double y;
+ private final double z;
+
+ /**
+ * Creates a EularAngle with each axis set to the
+ * passed angle in radians
+ *
+ * @param x the angle for the x axis in radians
+ * @param y the angle for the x axis in radians
+ * @param z the angle for the x axis in radians
+ */
+ public EulerAngle(double x, double y, double z) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ }
+
+ /**
+ * Returns the angle on the x axis in radians
+ *
+ * @return the angle in radians
+ */
+ public double getX() {
+ return x;
+ }
+
+ /**
+ * Returns the angle on the y axis in radians
+ *
+ * @return the angle in radians
+ */
+ public double getY() {
+ return y;
+ }
+
+ /**
+ * Returns the angle on the z axis in radians
+ *
+ * @return the angle in radians
+ */
+ public double getZ() {
+ return z;
+ }
+
+ /**
+ * Return a EulerAngle which is the result of changing
+ * the x axis to the passed angle
+ *
+ * @param x the angle in radians
+ * @return the resultant EulerAngle
+ */
+ public EulerAngle setX(double x) {
+ return new EulerAngle(x, y, z);
+ }
+
+ /**
+ * Return a EulerAngle which is the result of changing
+ * the y axis to the passed angle
+ *
+ * @param y the angle in radians
+ * @return the resultant EulerAngle
+ */
+ public EulerAngle setY(double y) {
+ return new EulerAngle(x, y, z);
+ }
+
+ /**
+ * Return a EulerAngle which is the result of changing
+ * the z axis to the passed angle
+ *
+ * @param z the angle in radians
+ * @return the resultant EulerAngle
+ */
+ public EulerAngle setZ(double z) {
+ return new EulerAngle(x, y, z);
+ }
+
+ /**
+ * Creates a new EulerAngle which is the result of adding
+ * the x, y, z components to this EulerAngle
+ *
+ * @param x the angle to add to the x axis in radians
+ * @param y the angle to add to the y axis in radians
+ * @param z the angle to add to the z axis in radians
+ * @return the resultant EulerAngle
+ */
+ public EulerAngle add(double x, double y, double z) {
+ return new EulerAngle(
+ this.x + x,
+ this.y + y,
+ this.z + z
+ );
+ }
+
+ /**
+ * Creates a new EulerAngle which is the result of subtracting
+ * the x, y, z components to this EulerAngle
+ *
+ * @param x the angle to subtract to the x axis in radians
+ * @param y the angle to subtract to the y axis in radians
+ * @param z the angle to subtract to the z axis in radians
+ * @return the resultant EulerAngle
+ */
+ public EulerAngle subtract(double x, double y, double z) {
+ return add(-x, -y, -z);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ EulerAngle that = (EulerAngle) o;
+
+ return Double.compare(that.x, x) == 0
+ && Double.compare(that.y, y) == 0
+ && Double.compare(that.z, z) == 0;
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result;
+ long temp;
+ temp = Double.doubleToLongBits(x);
+ result = (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(y);
+ result = 31 * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(z);
+ result = 31 * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+}