Merge branch 'Jalview-JS/develop' into develop
[jalview.git] / unused / javajs / util / V3.java
diff --git a/unused/javajs/util/V3.java b/unused/javajs/util/V3.java
new file mode 100644 (file)
index 0000000..51325d2
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ Copyright (C) 1997,1998,1999
+ Kenji Hiranabe, Eiwa System Management, Inc.
+
+ This program is free software.
+ Implemented by Kenji Hiranabe(hiranabe@esm.co.jp),
+ conforming to the Java(TM) 3D API specification by Sun Microsystems.
+
+ Permission to use, copy, modify, distribute and sell this software
+ and its documentation for any purpose is hereby granted without fee,
+ provided that the above copyright notice appear in all copies and
+ that both that copyright notice and this permission notice appear
+ in supporting documentation. Kenji Hiranabe and Eiwa System Management,Inc.
+ makes no representations about the suitability of this software for any
+ purpose.  It is provided "AS IS" with NO WARRANTY.
+ */
+package javajs.util;
+
+
+/**
+ * A 3-element vector that is represented by single precision floating point
+ * x,y,z coordinates. If this value represents a normal, then it should be
+ * normalized.
+ * 
+ * @version specification 1.1, implementation $Revision: 1.10 $, $Date:
+ *          2006/10/03 19:52:30 $
+ * @author Kenji hiranabe
+ * 
+ * additions by Bob Hanson hansonr@stolaf.edu 9/30/2012
+ * for unique constructor and method names
+ * for the optimization of compiled JavaScript using Java2Script
+ */
+public class V3 extends T3 {
+
+  public V3() {
+  }
+  
+  public static V3 newV(T3 t) {
+    return V3.new3(t.x, t.y, t.z);
+  }
+
+  public static V3 newVsub(T3 t1, T3 t2) {
+    return V3.new3(t1.x - t2.x, t1.y - t2.y,t1.z - t2.z);
+  }
+
+  public static V3 new3(float x, float y, float z) {
+    V3 v = new V3();
+    v.x = x;
+    v.y = y;
+    v.z = z;
+    return v;
+  }
+
+  /**
+   * Returns the angle in radians between this vector and the vector parameter;
+   * the return value is constrained to the range [0,PI].
+   * 
+   * @param v1
+   *        the other vector
+   * @return the angle in radians in the range [0,PI]
+   */
+  public final float angle(V3 v1) {
+    // return (double)Math.acos(dot(v1)/v1.length()/v.length());
+    // Numerically, near 0 and PI are very bad condition for acos.
+    // In 3-space, |atan2(sin,cos)| is much stable.
+
+    double xx = y * v1.z - z * v1.y;
+    double yy = z * v1.x - x * v1.z;
+    double zz = x * v1.y - y * v1.x;
+    double cross = Math.sqrt(xx * xx + yy * yy + zz * zz);
+
+    return (float) Math.abs(Math.atan2(cross, dot(v1)));
+  }
+}