--- /dev/null
+/*
+ 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)));
+ }
+}