JAL-1807 includes ?j2sdebug flag and DebugJS._(msg)
[jalviewjs.git] / bin / javajs / util / Quat.js
index 0db2469..bfc5444 100644 (file)
-Clazz.declarePackage ("javajs.util");\r
-Clazz.load (["javajs.util.P4"], "javajs.util.Quat", ["java.lang.Float", "javajs.util.A4", "$.M3", "$.V3"], function () {\r
-c$ = Clazz.decorateAsClass (function () {\r
-this.q0 = 0;\r
-this.q1 = 0;\r
-this.q2 = 0;\r
-this.q3 = 0;\r
-this.mat = null;\r
-Clazz.instantialize (this, arguments);\r
-}, javajs.util, "Quat");\r
-Clazz.makeConstructor (c$, \r
-function () {\r
-this.q0 = 1;\r
-});\r
-c$.newQ = Clazz.defineMethod (c$, "newQ", \r
-function (q) {\r
-var q1 =  new javajs.util.Quat ();\r
-q1.set (q);\r
-return q1;\r
-}, "javajs.util.Quat");\r
-c$.newVA = Clazz.defineMethod (c$, "newVA", \r
-function (v, theta) {\r
-var q =  new javajs.util.Quat ();\r
-q.setTA (v, theta);\r
-return q;\r
-}, "javajs.util.T3,~N");\r
-c$.newM = Clazz.defineMethod (c$, "newM", \r
-function (mat) {\r
-var q =  new javajs.util.Quat ();\r
-q.setM (javajs.util.M3.newM3 (mat));\r
-return q;\r
-}, "javajs.util.M3");\r
-c$.newAA = Clazz.defineMethod (c$, "newAA", \r
-function (a) {\r
-var q =  new javajs.util.Quat ();\r
-q.setAA (a);\r
-return q;\r
-}, "javajs.util.A4");\r
-c$.newP4 = Clazz.defineMethod (c$, "newP4", \r
-function (pt) {\r
-var q =  new javajs.util.Quat ();\r
-q.setP4 (pt);\r
-return q;\r
-}, "javajs.util.P4");\r
-c$.new4 = Clazz.defineMethod (c$, "new4", \r
-function (q1, q2, q3, q0) {\r
-var q =  new javajs.util.Quat ();\r
-if (q0 < -1) {\r
-q.q0 = -1;\r
-return q;\r
-}if (q0 > 1) {\r
-q.q0 = 1;\r
-return q;\r
-}q.q0 = q0;\r
-q.q1 = q1;\r
-q.q2 = q2;\r
-q.q3 = q3;\r
-return q;\r
-}, "~N,~N,~N,~N");\r
-Clazz.defineMethod (c$, "set", \r
-function (q) {\r
-this.q0 = q.q0;\r
-this.q1 = q.q1;\r
-this.q2 = q.q2;\r
-this.q3 = q.q3;\r
-}, "javajs.util.Quat");\r
-Clazz.defineMethod (c$, "setP4", \r
-($fz = function (pt) {\r
-var factor = (pt == null ? 0 : pt.distance4 (javajs.util.Quat.qZero));\r
-if (factor == 0) {\r
-this.q0 = 1;\r
-return;\r
-}this.q0 = pt.w / factor;\r
-this.q1 = pt.x / factor;\r
-this.q2 = pt.y / factor;\r
-this.q3 = pt.z / factor;\r
-}, $fz.isPrivate = true, $fz), "javajs.util.P4");\r
-Clazz.defineMethod (c$, "setTA", \r
-function (pt, theta) {\r
-if (pt.x == 0 && pt.y == 0 && pt.z == 0) {\r
-this.q0 = 1;\r
-return;\r
-}var fact = (Math.sin (theta / 2 * 0.017453292519943295) / Math.sqrt (pt.x * pt.x + pt.y * pt.y + pt.z * pt.z));\r
-this.q0 = (Math.cos (theta / 2 * 0.017453292519943295));\r
-this.q1 = (pt.x * fact);\r
-this.q2 = (pt.y * fact);\r
-this.q3 = (pt.z * fact);\r
-}, "javajs.util.T3,~N");\r
-Clazz.defineMethod (c$, "setAA", \r
-function (a) {\r
-var aa = javajs.util.A4.newAA (a);\r
-if (aa.angle == 0) aa.y = 1;\r
-this.setM ( new javajs.util.M3 ().setAA (aa));\r
-}, "javajs.util.A4");\r
-Clazz.defineMethod (c$, "setM", \r
-($fz = function (mat) {\r
-this.mat = mat;\r
-var trace = mat.m00 + mat.m11 + mat.m22;\r
-var temp;\r
-var w;\r
-var x;\r
-var y;\r
-var z;\r
-if (trace >= 0.5) {\r
-w = Math.sqrt (1.0 + trace);\r
-x = (mat.m21 - mat.m12) / w;\r
-y = (mat.m02 - mat.m20) / w;\r
-z = (mat.m10 - mat.m01) / w;\r
-} else if ((temp = mat.m00 + mat.m00 - trace) >= 0.5) {\r
-x = Math.sqrt (1.0 + temp);\r
-w = (mat.m21 - mat.m12) / x;\r
-y = (mat.m10 + mat.m01) / x;\r
-z = (mat.m20 + mat.m02) / x;\r
-} else if ((temp = mat.m11 + mat.m11 - trace) >= 0.5 || mat.m11 > mat.m22) {\r
-y = Math.sqrt (1.0 + temp);\r
-w = (mat.m02 - mat.m20) / y;\r
-x = (mat.m10 + mat.m01) / y;\r
-z = (mat.m21 + mat.m12) / y;\r
-} else {\r
-z = Math.sqrt (1.0 + mat.m22 + mat.m22 - trace);\r
-w = (mat.m10 - mat.m01) / z;\r
-x = (mat.m20 + mat.m02) / z;\r
-y = (mat.m21 + mat.m12) / z;\r
-}this.q0 = (w * 0.5);\r
-this.q1 = (x * 0.5);\r
-this.q2 = (y * 0.5);\r
-this.q3 = (z * 0.5);\r
-}, $fz.isPrivate = true, $fz), "javajs.util.M3");\r
-Clazz.defineMethod (c$, "setRef", \r
-function (qref) {\r
-if (qref == null) {\r
-this.mul (this.getFixFactor ());\r
-return;\r
-}if (this.dot (qref) >= 0) return;\r
-this.q0 *= -1;\r
-this.q1 *= -1;\r
-this.q2 *= -1;\r
-this.q3 *= -1;\r
-}, "javajs.util.Quat");\r
-c$.getQuaternionFrame = Clazz.defineMethod (c$, "getQuaternionFrame", \r
-function (center, x, xy) {\r
-var vA = javajs.util.V3.newV (x);\r
-var vB = javajs.util.V3.newV (xy);\r
-if (center != null) {\r
-vA.sub (center);\r
-vB.sub (center);\r
-}return javajs.util.Quat.getQuaternionFrameV (vA, vB, null, false);\r
-}, "javajs.util.P3,javajs.util.T3,javajs.util.T3");\r
-c$.getQuaternionFrameV = Clazz.defineMethod (c$, "getQuaternionFrameV", \r
-function (vA, vB, vC, yBased) {\r
-if (vC == null) {\r
-vC =  new javajs.util.V3 ();\r
-vC.cross (vA, vB);\r
-if (yBased) vA.cross (vB, vC);\r
-}var vBprime =  new javajs.util.V3 ();\r
-vBprime.cross (vC, vA);\r
-vA.normalize ();\r
-vBprime.normalize ();\r
-vC.normalize ();\r
-var mat =  new javajs.util.M3 ();\r
-mat.setColumnV (0, vA);\r
-mat.setColumnV (1, vBprime);\r
-mat.setColumnV (2, vC);\r
-var q = javajs.util.Quat.newM (mat);\r
-return q;\r
-}, "javajs.util.V3,javajs.util.V3,javajs.util.V3,~B");\r
-Clazz.defineMethod (c$, "getMatrix", \r
-function () {\r
-if (this.mat == null) this.setMatrix ();\r
-return this.mat;\r
-});\r
-Clazz.defineMethod (c$, "setMatrix", \r
-($fz = function () {\r
-this.mat =  new javajs.util.M3 ();\r
-this.mat.m00 = this.q0 * this.q0 + this.q1 * this.q1 - this.q2 * this.q2 - this.q3 * this.q3;\r
-this.mat.m01 = 2 * this.q1 * this.q2 - 2 * this.q0 * this.q3;\r
-this.mat.m02 = 2 * this.q1 * this.q3 + 2 * this.q0 * this.q2;\r
-this.mat.m10 = 2 * this.q1 * this.q2 + 2 * this.q0 * this.q3;\r
-this.mat.m11 = this.q0 * this.q0 - this.q1 * this.q1 + this.q2 * this.q2 - this.q3 * this.q3;\r
-this.mat.m12 = 2 * this.q2 * this.q3 - 2 * this.q0 * this.q1;\r
-this.mat.m20 = 2 * this.q1 * this.q3 - 2 * this.q0 * this.q2;\r
-this.mat.m21 = 2 * this.q2 * this.q3 + 2 * this.q0 * this.q1;\r
-this.mat.m22 = this.q0 * this.q0 - this.q1 * this.q1 - this.q2 * this.q2 + this.q3 * this.q3;\r
-}, $fz.isPrivate = true, $fz));\r
-Clazz.defineMethod (c$, "add", \r
-function (x) {\r
-return javajs.util.Quat.newVA (this.getNormal (), this.getTheta () + x);\r
-}, "~N");\r
-Clazz.defineMethod (c$, "mul", \r
-function (x) {\r
-return (x == 1 ? javajs.util.Quat.new4 (this.q1, this.q2, this.q3, this.q0) : javajs.util.Quat.newVA (this.getNormal (), this.getTheta () * x));\r
-}, "~N");\r
-Clazz.defineMethod (c$, "mulQ", \r
-function (p) {\r
-return javajs.util.Quat.new4 (this.q0 * p.q1 + this.q1 * p.q0 + this.q2 * p.q3 - this.q3 * p.q2, this.q0 * p.q2 + this.q2 * p.q0 + this.q3 * p.q1 - this.q1 * p.q3, this.q0 * p.q3 + this.q3 * p.q0 + this.q1 * p.q2 - this.q2 * p.q1, this.q0 * p.q0 - this.q1 * p.q1 - this.q2 * p.q2 - this.q3 * p.q3);\r
-}, "javajs.util.Quat");\r
-Clazz.defineMethod (c$, "div", \r
-function (p) {\r
-return this.mulQ (p.inv ());\r
-}, "javajs.util.Quat");\r
-Clazz.defineMethod (c$, "divLeft", \r
-function (p) {\r
-return this.inv ().mulQ (p);\r
-}, "javajs.util.Quat");\r
-Clazz.defineMethod (c$, "dot", \r
-function (q) {\r
-return this.q0 * q.q0 + this.q1 * q.q1 + this.q2 * q.q2 + this.q3 * q.q3;\r
-}, "javajs.util.Quat");\r
-Clazz.defineMethod (c$, "inv", \r
-function () {\r
-return javajs.util.Quat.new4 (-this.q1, -this.q2, -this.q3, this.q0);\r
-});\r
-Clazz.defineMethod (c$, "negate", \r
-function () {\r
-return javajs.util.Quat.new4 (-this.q1, -this.q2, -this.q3, -this.q0);\r
-});\r
-Clazz.defineMethod (c$, "getFixFactor", \r
-($fz = function () {\r
-return (this.q0 < 0 || this.q0 == 0 && (this.q1 < 0 || this.q1 == 0 && (this.q2 < 0 || this.q2 == 0 && this.q3 < 0)) ? -1 : 1);\r
-}, $fz.isPrivate = true, $fz));\r
-Clazz.defineMethod (c$, "getVector", \r
-function (i) {\r
-return this.getVectorScaled (i, 1);\r
-}, "~N");\r
-Clazz.defineMethod (c$, "getVectorScaled", \r
-function (i, scale) {\r
-if (i == -1) {\r
-scale *= this.getFixFactor ();\r
-return javajs.util.V3.new3 (this.q1 * scale, this.q2 * scale, this.q3 * scale);\r
-}if (this.mat == null) this.setMatrix ();\r
-var v =  new javajs.util.V3 ();\r
-this.mat.getColumnV (i, v);\r
-if (scale != 1) v.scale (scale);\r
-return v;\r
-}, "~N,~N");\r
-Clazz.defineMethod (c$, "getNormal", \r
-function () {\r
-var v = javajs.util.Quat.getRawNormal (this);\r
-v.scale (this.getFixFactor ());\r
-return v;\r
-});\r
-c$.getRawNormal = Clazz.defineMethod (c$, "getRawNormal", \r
-($fz = function (q) {\r
-var v = javajs.util.V3.new3 (q.q1, q.q2, q.q3);\r
-if (v.length () == 0) return javajs.util.V3.new3 (0, 0, 1);\r
-v.normalize ();\r
-return v;\r
-}, $fz.isPrivate = true, $fz), "javajs.util.Quat");\r
-Clazz.defineMethod (c$, "getTheta", \r
-function () {\r
-return (Math.acos (Math.abs (this.q0)) * 2 * 180 / 3.141592653589793);\r
-});\r
-Clazz.defineMethod (c$, "getThetaRadians", \r
-function () {\r
-return (Math.acos (Math.abs (this.q0)) * 2);\r
-});\r
-Clazz.defineMethod (c$, "getNormalDirected", \r
-function (v0) {\r
-var v = this.getNormal ();\r
-if (v.x * v0.x + v.y * v0.y + v.z * v0.z < 0) {\r
-v.scale (-1);\r
-}return v;\r
-}, "javajs.util.V3");\r
-Clazz.defineMethod (c$, "get3dProjection", \r
-function (v3d) {\r
-v3d.set (this.q1, this.q2, this.q3);\r
-return v3d;\r
-}, "javajs.util.V3");\r
-Clazz.defineMethod (c$, "getThetaDirected", \r
-function (axisAngle) {\r
-var theta = this.getTheta ();\r
-var v = this.getNormal ();\r
-if (axisAngle.x * this.q1 + axisAngle.y * this.q2 + axisAngle.z * this.q3 < 0) {\r
-v.scale (-1);\r
-theta = -theta;\r
-}axisAngle.set4 (v.x, v.y, v.z, theta);\r
-return axisAngle;\r
-}, "javajs.util.P4");\r
-Clazz.defineMethod (c$, "getThetaDirectedV", \r
-function (vector) {\r
-var theta = this.getTheta ();\r
-var v = this.getNormal ();\r
-if (vector.x * this.q1 + vector.y * this.q2 + vector.z * this.q3 < 0) {\r
-v.scale (-1);\r
-theta = -theta;\r
-}return theta;\r
-}, "javajs.util.V3");\r
-Clazz.defineMethod (c$, "toPoint4f", \r
-function () {\r
-return javajs.util.P4.new4 (this.q1, this.q2, this.q3, this.q0);\r
-});\r
-Clazz.defineMethod (c$, "toAxisAngle4f", \r
-function () {\r
-var theta = 2 * Math.acos (Math.abs (this.q0));\r
-var sinTheta2 = Math.sin (theta / 2);\r
-var v = this.getNormal ();\r
-if (sinTheta2 < 0) {\r
-v.scale (-1);\r
-theta = 3.141592653589793 - theta;\r
-}return javajs.util.A4.newVA (v, theta);\r
-});\r
-Clazz.defineMethod (c$, "transform2", \r
-function (pt, ptNew) {\r
-if (this.mat == null) this.setMatrix ();\r
-this.mat.rotate2 (pt, ptNew);\r
-return ptNew;\r
-}, "javajs.util.T3,javajs.util.T3");\r
-Clazz.defineMethod (c$, "leftDifference", \r
-function (q2) {\r
-var q2adjusted = (this.dot (q2) < 0 ? q2.negate () : q2);\r
-return this.inv ().mulQ (q2adjusted);\r
-}, "javajs.util.Quat");\r
-Clazz.defineMethod (c$, "rightDifference", \r
-function (q2) {\r
-var q2adjusted = (this.dot (q2) < 0 ? q2.negate () : q2);\r
-return this.mulQ (q2adjusted.inv ());\r
-}, "javajs.util.Quat");\r
-Clazz.overrideMethod (c$, "toString", \r
-function () {\r
-return "{" + this.q1 + " " + this.q2 + " " + this.q3 + " " + this.q0 + "}";\r
-});\r
-c$.div = Clazz.defineMethod (c$, "div", \r
-function (data1, data2, nMax, isRelative) {\r
-var n;\r
-if (data1 == null || data2 == null || (n = Math.min (data1.length, data2.length)) == 0) return null;\r
-if (nMax > 0 && n > nMax) n = nMax;\r
-var dqs =  new Array (n);\r
-for (var i = 0; i < n; i++) {\r
-if (data1[i] == null || data2[i] == null) return null;\r
-dqs[i] = (isRelative ? data1[i].divLeft (data2[i]) : data1[i].div (data2[i]));\r
-}\r
-return dqs;\r
-}, "~A,~A,~N,~B");\r
-c$.sphereMean = Clazz.defineMethod (c$, "sphereMean", \r
-function (data, retStddev, criterion) {\r
-if (data == null || data.length == 0) return  new javajs.util.Quat ();\r
-if (retStddev == null) retStddev =  Clazz.newFloatArray (1, 0);\r
-if (data.length == 1) {\r
-retStddev[0] = 0;\r
-return javajs.util.Quat.newQ (data[0]);\r
-}var diff = 3.4028235E38;\r
-var lastStddev = 3.4028235E38;\r
-var qMean = javajs.util.Quat.simpleAverage (data);\r
-var maxIter = 100;\r
-var iter = 0;\r
-while (diff > criterion && lastStddev != 0 && iter < maxIter) {\r
-qMean = javajs.util.Quat.newMean (data, qMean);\r
-retStddev[0] = javajs.util.Quat.stdDev (data, qMean);\r
-diff = Math.abs (retStddev[0] - lastStddev);\r
-lastStddev = retStddev[0];\r
-}\r
-return qMean;\r
-}, "~A,~A,~N");\r
-c$.simpleAverage = Clazz.defineMethod (c$, "simpleAverage", \r
-($fz = function (ndata) {\r
-var mean = javajs.util.V3.new3 (0, 0, 1);\r
-var v = ndata[0].getNormal ();\r
-mean.add (v);\r
-for (var i = ndata.length; --i >= 0; ) mean.add (ndata[i].getNormalDirected (mean));\r
-\r
-mean.sub (v);\r
-mean.normalize ();\r
-var f = 0;\r
-for (var i = ndata.length; --i >= 0; ) f += Math.abs (ndata[i].get3dProjection (v).dot (mean));\r
-\r
-if (f != 0) mean.scale (f / ndata.length);\r
-f = Math.sqrt (1 - mean.lengthSquared ());\r
-if (Float.isNaN (f)) f = 0;\r
-return javajs.util.Quat.newP4 (javajs.util.P4.new4 (mean.x, mean.y, mean.z, f));\r
-}, $fz.isPrivate = true, $fz), "~A");\r
-c$.newMean = Clazz.defineMethod (c$, "newMean", \r
-($fz = function (data, mean) {\r
-var sum =  new javajs.util.V3 ();\r
-var v;\r
-var q;\r
-var dq;\r
-for (var i = data.length; --i >= 0; ) {\r
-q = data[i];\r
-dq = q.div (mean);\r
-v = dq.getNormal ();\r
-v.scale (dq.getTheta ());\r
-sum.add (v);\r
-}\r
-sum.scale (1 / data.length);\r
-var dqMean = javajs.util.Quat.newVA (sum, sum.length ());\r
-return dqMean.mulQ (mean);\r
-}, $fz.isPrivate = true, $fz), "~A,javajs.util.Quat");\r
-c$.stdDev = Clazz.defineMethod (c$, "stdDev", \r
-($fz = function (data, mean) {\r
-var sum2 = 0;\r
-var n = data.length;\r
-for (var i = n; --i >= 0; ) {\r
-var theta = data[i].div (mean).getTheta ();\r
-sum2 += theta * theta;\r
-}\r
-return Math.sqrt (sum2 / n);\r
-}, $fz.isPrivate = true, $fz), "~A,javajs.util.Quat");\r
-Clazz.defineMethod (c$, "getEulerZYZ", \r
-function () {\r
-var rA;\r
-var rB;\r
-var rG;\r
-if (this.q1 == 0 && this.q2 == 0) {\r
-var theta = this.getTheta ();\r
-return  Clazz.newFloatArray (-1, [this.q3 < 0 ? -theta : theta, 0, 0]);\r
-}rA = Math.atan2 (2 * (this.q2 * this.q3 + this.q0 * this.q1), 2 * (-this.q1 * this.q3 + this.q0 * this.q2));\r
-rB = Math.acos (this.q3 * this.q3 - this.q2 * this.q2 - this.q1 * this.q1 + this.q0 * this.q0);\r
-rG = Math.atan2 (2 * (this.q2 * this.q3 - this.q0 * this.q1), 2 * (this.q0 * this.q2 + this.q1 * this.q3));\r
-return  Clazz.newFloatArray (-1, [(rA / 0.017453292519943295), (rB / 0.017453292519943295), (rG / 0.017453292519943295)]);\r
-});\r
-Clazz.defineMethod (c$, "getEulerZXZ", \r
-function () {\r
-var rA;\r
-var rB;\r
-var rG;\r
-if (this.q1 == 0 && this.q2 == 0) {\r
-var theta = this.getTheta ();\r
-return  Clazz.newFloatArray (-1, [this.q3 < 0 ? -theta : theta, 0, 0]);\r
-}rA = Math.atan2 (2 * (this.q1 * this.q3 - this.q0 * this.q2), 2 * (this.q0 * this.q1 + this.q2 * this.q3));\r
-rB = Math.acos (this.q3 * this.q3 - this.q2 * this.q2 - this.q1 * this.q1 + this.q0 * this.q0);\r
-rG = Math.atan2 (2 * (this.q1 * this.q3 + this.q0 * this.q2), 2 * (-this.q2 * this.q3 + this.q0 * this.q1));\r
-return  Clazz.newFloatArray (-1, [(rA / 0.017453292519943295), (rB / 0.017453292519943295), (rG / 0.017453292519943295)]);\r
-});\r
-c$.qZero = c$.prototype.qZero =  new javajs.util.P4 ();\r
-Clazz.defineStatics (c$,\r
-"RAD_PER_DEG", 0.017453292519943295);\r
-});\r
+Clazz.declarePackage ("javajs.util");
+Clazz.load (["javajs.util.P4"], "javajs.util.Quat", ["java.lang.Float", "javajs.util.A4", "$.M3", "$.V3"], function () {
+c$ = Clazz.decorateAsClass (function () {
+this.q0 = 0;
+this.q1 = 0;
+this.q2 = 0;
+this.q3 = 0;
+this.mat = null;
+Clazz.instantialize (this, arguments);
+}, javajs.util, "Quat");
+Clazz.makeConstructor (c$, 
+function () {
+this.q0 = 1;
+});
+c$.newQ = Clazz.defineMethod (c$, "newQ", 
+function (q) {
+var q1 =  new javajs.util.Quat ();
+q1.set (q);
+return q1;
+}, "javajs.util.Quat");
+c$.newVA = Clazz.defineMethod (c$, "newVA", 
+function (v, theta) {
+var q =  new javajs.util.Quat ();
+q.setTA (v, theta);
+return q;
+}, "javajs.util.T3,~N");
+c$.newM = Clazz.defineMethod (c$, "newM", 
+function (mat) {
+var q =  new javajs.util.Quat ();
+q.setM (javajs.util.M3.newM3 (mat));
+return q;
+}, "javajs.util.M3");
+c$.newAA = Clazz.defineMethod (c$, "newAA", 
+function (a) {
+var q =  new javajs.util.Quat ();
+q.setAA (a);
+return q;
+}, "javajs.util.A4");
+c$.newP4 = Clazz.defineMethod (c$, "newP4", 
+function (pt) {
+var q =  new javajs.util.Quat ();
+q.setP4 (pt);
+return q;
+}, "javajs.util.P4");
+c$.new4 = Clazz.defineMethod (c$, "new4", 
+function (q1, q2, q3, q0) {
+var q =  new javajs.util.Quat ();
+if (q0 < -1) {
+q.q0 = -1;
+return q;
+}if (q0 > 1) {
+q.q0 = 1;
+return q;
+}q.q0 = q0;
+q.q1 = q1;
+q.q2 = q2;
+q.q3 = q3;
+return q;
+}, "~N,~N,~N,~N");
+Clazz.defineMethod (c$, "set", 
+function (q) {
+this.q0 = q.q0;
+this.q1 = q.q1;
+this.q2 = q.q2;
+this.q3 = q.q3;
+}, "javajs.util.Quat");
+Clazz.defineMethod (c$, "setP4", 
+($fz = function (pt) {
+var factor = (pt == null ? 0 : pt.distance4 (javajs.util.Quat.qZero));
+if (factor == 0) {
+this.q0 = 1;
+return;
+}this.q0 = pt.w / factor;
+this.q1 = pt.x / factor;
+this.q2 = pt.y / factor;
+this.q3 = pt.z / factor;
+}, $fz.isPrivate = true, $fz), "javajs.util.P4");
+Clazz.defineMethod (c$, "setTA", 
+function (pt, theta) {
+if (pt.x == 0 && pt.y == 0 && pt.z == 0) {
+this.q0 = 1;
+return;
+}var fact = (Math.sin (theta / 2 * 0.017453292519943295) / Math.sqrt (pt.x * pt.x + pt.y * pt.y + pt.z * pt.z));
+this.q0 = (Math.cos (theta / 2 * 0.017453292519943295));
+this.q1 = (pt.x * fact);
+this.q2 = (pt.y * fact);
+this.q3 = (pt.z * fact);
+}, "javajs.util.T3,~N");
+Clazz.defineMethod (c$, "setAA", 
+function (a) {
+var aa = javajs.util.A4.newAA (a);
+if (aa.angle == 0) aa.y = 1;
+this.setM ( new javajs.util.M3 ().setAA (aa));
+}, "javajs.util.A4");
+Clazz.defineMethod (c$, "setM", 
+($fz = function (mat) {
+this.mat = mat;
+var trace = mat.m00 + mat.m11 + mat.m22;
+var temp;
+var w;
+var x;
+var y;
+var z;
+if (trace >= 0.5) {
+w = Math.sqrt (1.0 + trace);
+x = (mat.m21 - mat.m12) / w;
+y = (mat.m02 - mat.m20) / w;
+z = (mat.m10 - mat.m01) / w;
+} else if ((temp = mat.m00 + mat.m00 - trace) >= 0.5) {
+x = Math.sqrt (1.0 + temp);
+w = (mat.m21 - mat.m12) / x;
+y = (mat.m10 + mat.m01) / x;
+z = (mat.m20 + mat.m02) / x;
+} else if ((temp = mat.m11 + mat.m11 - trace) >= 0.5 || mat.m11 > mat.m22) {
+y = Math.sqrt (1.0 + temp);
+w = (mat.m02 - mat.m20) / y;
+x = (mat.m10 + mat.m01) / y;
+z = (mat.m21 + mat.m12) / y;
+} else {
+z = Math.sqrt (1.0 + mat.m22 + mat.m22 - trace);
+w = (mat.m10 - mat.m01) / z;
+x = (mat.m20 + mat.m02) / z;
+y = (mat.m21 + mat.m12) / z;
+}this.q0 = (w * 0.5);
+this.q1 = (x * 0.5);
+this.q2 = (y * 0.5);
+this.q3 = (z * 0.5);
+}, $fz.isPrivate = true, $fz), "javajs.util.M3");
+Clazz.defineMethod (c$, "setRef", 
+function (qref) {
+if (qref == null) {
+this.mul (this.getFixFactor ());
+return;
+}if (this.dot (qref) >= 0) return;
+this.q0 *= -1;
+this.q1 *= -1;
+this.q2 *= -1;
+this.q3 *= -1;
+}, "javajs.util.Quat");
+c$.getQuaternionFrame = Clazz.defineMethod (c$, "getQuaternionFrame", 
+function (center, x, xy) {
+var vA = javajs.util.V3.newV (x);
+var vB = javajs.util.V3.newV (xy);
+if (center != null) {
+vA.sub (center);
+vB.sub (center);
+}return javajs.util.Quat.getQuaternionFrameV (vA, vB, null, false);
+}, "javajs.util.P3,javajs.util.T3,javajs.util.T3");
+c$.getQuaternionFrameV = Clazz.defineMethod (c$, "getQuaternionFrameV", 
+function (vA, vB, vC, yBased) {
+if (vC == null) {
+vC =  new javajs.util.V3 ();
+vC.cross (vA, vB);
+if (yBased) vA.cross (vB, vC);
+}var vBprime =  new javajs.util.V3 ();
+vBprime.cross (vC, vA);
+vA.normalize ();
+vBprime.normalize ();
+vC.normalize ();
+var mat =  new javajs.util.M3 ();
+mat.setColumnV (0, vA);
+mat.setColumnV (1, vBprime);
+mat.setColumnV (2, vC);
+var q = javajs.util.Quat.newM (mat);
+return q;
+}, "javajs.util.V3,javajs.util.V3,javajs.util.V3,~B");
+Clazz.defineMethod (c$, "getMatrix", 
+function () {
+if (this.mat == null) this.setMatrix ();
+return this.mat;
+});
+Clazz.defineMethod (c$, "setMatrix", 
+($fz = function () {
+this.mat =  new javajs.util.M3 ();
+this.mat.m00 = this.q0 * this.q0 + this.q1 * this.q1 - this.q2 * this.q2 - this.q3 * this.q3;
+this.mat.m01 = 2 * this.q1 * this.q2 - 2 * this.q0 * this.q3;
+this.mat.m02 = 2 * this.q1 * this.q3 + 2 * this.q0 * this.q2;
+this.mat.m10 = 2 * this.q1 * this.q2 + 2 * this.q0 * this.q3;
+this.mat.m11 = this.q0 * this.q0 - this.q1 * this.q1 + this.q2 * this.q2 - this.q3 * this.q3;
+this.mat.m12 = 2 * this.q2 * this.q3 - 2 * this.q0 * this.q1;
+this.mat.m20 = 2 * this.q1 * this.q3 - 2 * this.q0 * this.q2;
+this.mat.m21 = 2 * this.q2 * this.q3 + 2 * this.q0 * this.q1;
+this.mat.m22 = this.q0 * this.q0 - this.q1 * this.q1 - this.q2 * this.q2 + this.q3 * this.q3;
+}, $fz.isPrivate = true, $fz));
+Clazz.defineMethod (c$, "add", 
+function (x) {
+return javajs.util.Quat.newVA (this.getNormal (), this.getTheta () + x);
+}, "~N");
+Clazz.defineMethod (c$, "mul", 
+function (x) {
+return (x == 1 ? javajs.util.Quat.new4 (this.q1, this.q2, this.q3, this.q0) : javajs.util.Quat.newVA (this.getNormal (), this.getTheta () * x));
+}, "~N");
+Clazz.defineMethod (c$, "mulQ", 
+function (p) {
+return javajs.util.Quat.new4 (this.q0 * p.q1 + this.q1 * p.q0 + this.q2 * p.q3 - this.q3 * p.q2, this.q0 * p.q2 + this.q2 * p.q0 + this.q3 * p.q1 - this.q1 * p.q3, this.q0 * p.q3 + this.q3 * p.q0 + this.q1 * p.q2 - this.q2 * p.q1, this.q0 * p.q0 - this.q1 * p.q1 - this.q2 * p.q2 - this.q3 * p.q3);
+}, "javajs.util.Quat");
+Clazz.defineMethod (c$, "div", 
+function (p) {
+return this.mulQ (p.inv ());
+}, "javajs.util.Quat");
+Clazz.defineMethod (c$, "divLeft", 
+function (p) {
+return this.inv ().mulQ (p);
+}, "javajs.util.Quat");
+Clazz.defineMethod (c$, "dot", 
+function (q) {
+return this.q0 * q.q0 + this.q1 * q.q1 + this.q2 * q.q2 + this.q3 * q.q3;
+}, "javajs.util.Quat");
+Clazz.defineMethod (c$, "inv", 
+function () {
+return javajs.util.Quat.new4 (-this.q1, -this.q2, -this.q3, this.q0);
+});
+Clazz.defineMethod (c$, "negate", 
+function () {
+return javajs.util.Quat.new4 (-this.q1, -this.q2, -this.q3, -this.q0);
+});
+Clazz.defineMethod (c$, "getFixFactor", 
+($fz = function () {
+return (this.q0 < 0 || this.q0 == 0 && (this.q1 < 0 || this.q1 == 0 && (this.q2 < 0 || this.q2 == 0 && this.q3 < 0)) ? -1 : 1);
+}, $fz.isPrivate = true, $fz));
+Clazz.defineMethod (c$, "getVector", 
+function (i) {
+return this.getVectorScaled (i, 1);
+}, "~N");
+Clazz.defineMethod (c$, "getVectorScaled", 
+function (i, scale) {
+if (i == -1) {
+scale *= this.getFixFactor ();
+return javajs.util.V3.new3 (this.q1 * scale, this.q2 * scale, this.q3 * scale);
+}if (this.mat == null) this.setMatrix ();
+var v =  new javajs.util.V3 ();
+this.mat.getColumnV (i, v);
+if (scale != 1) v.scale (scale);
+return v;
+}, "~N,~N");
+Clazz.defineMethod (c$, "getNormal", 
+function () {
+var v = javajs.util.Quat.getRawNormal (this);
+v.scale (this.getFixFactor ());
+return v;
+});
+c$.getRawNormal = Clazz.defineMethod (c$, "getRawNormal", 
+($fz = function (q) {
+var v = javajs.util.V3.new3 (q.q1, q.q2, q.q3);
+if (v.length () == 0) return javajs.util.V3.new3 (0, 0, 1);
+v.normalize ();
+return v;
+}, $fz.isPrivate = true, $fz), "javajs.util.Quat");
+Clazz.defineMethod (c$, "getTheta", 
+function () {
+return (Math.acos (Math.abs (this.q0)) * 2 * 180 / 3.141592653589793);
+});
+Clazz.defineMethod (c$, "getThetaRadians", 
+function () {
+return (Math.acos (Math.abs (this.q0)) * 2);
+});
+Clazz.defineMethod (c$, "getNormalDirected", 
+function (v0) {
+var v = this.getNormal ();
+if (v.x * v0.x + v.y * v0.y + v.z * v0.z < 0) {
+v.scale (-1);
+}return v;
+}, "javajs.util.V3");
+Clazz.defineMethod (c$, "get3dProjection", 
+function (v3d) {
+v3d.set (this.q1, this.q2, this.q3);
+return v3d;
+}, "javajs.util.V3");
+Clazz.defineMethod (c$, "getThetaDirected", 
+function (axisAngle) {
+var theta = this.getTheta ();
+var v = this.getNormal ();
+if (axisAngle.x * this.q1 + axisAngle.y * this.q2 + axisAngle.z * this.q3 < 0) {
+v.scale (-1);
+theta = -theta;
+}axisAngle.set4 (v.x, v.y, v.z, theta);
+return axisAngle;
+}, "javajs.util.P4");
+Clazz.defineMethod (c$, "getThetaDirectedV", 
+function (vector) {
+var theta = this.getTheta ();
+var v = this.getNormal ();
+if (vector.x * this.q1 + vector.y * this.q2 + vector.z * this.q3 < 0) {
+v.scale (-1);
+theta = -theta;
+}return theta;
+}, "javajs.util.V3");
+Clazz.defineMethod (c$, "toPoint4f", 
+function () {
+return javajs.util.P4.new4 (this.q1, this.q2, this.q3, this.q0);
+});
+Clazz.defineMethod (c$, "toAxisAngle4f", 
+function () {
+var theta = 2 * Math.acos (Math.abs (this.q0));
+var sinTheta2 = Math.sin (theta / 2);
+var v = this.getNormal ();
+if (sinTheta2 < 0) {
+v.scale (-1);
+theta = 3.141592653589793 - theta;
+}return javajs.util.A4.newVA (v, theta);
+});
+Clazz.defineMethod (c$, "transform2", 
+function (pt, ptNew) {
+if (this.mat == null) this.setMatrix ();
+this.mat.rotate2 (pt, ptNew);
+return ptNew;
+}, "javajs.util.T3,javajs.util.T3");
+Clazz.defineMethod (c$, "leftDifference", 
+function (q2) {
+var q2adjusted = (this.dot (q2) < 0 ? q2.negate () : q2);
+return this.inv ().mulQ (q2adjusted);
+}, "javajs.util.Quat");
+Clazz.defineMethod (c$, "rightDifference", 
+function (q2) {
+var q2adjusted = (this.dot (q2) < 0 ? q2.negate () : q2);
+return this.mulQ (q2adjusted.inv ());
+}, "javajs.util.Quat");
+Clazz.overrideMethod (c$, "toString", 
+function () {
+return "{" + this.q1 + " " + this.q2 + " " + this.q3 + " " + this.q0 + "}";
+});
+c$.div = Clazz.defineMethod (c$, "div", 
+function (data1, data2, nMax, isRelative) {
+var n;
+if (data1 == null || data2 == null || (n = Math.min (data1.length, data2.length)) == 0) return null;
+if (nMax > 0 && n > nMax) n = nMax;
+var dqs =  new Array (n);
+for (var i = 0; i < n; i++) {
+if (data1[i] == null || data2[i] == null) return null;
+dqs[i] = (isRelative ? data1[i].divLeft (data2[i]) : data1[i].div (data2[i]));
+}
+return dqs;
+}, "~A,~A,~N,~B");
+c$.sphereMean = Clazz.defineMethod (c$, "sphereMean", 
+function (data, retStddev, criterion) {
+if (data == null || data.length == 0) return  new javajs.util.Quat ();
+if (retStddev == null) retStddev =  Clazz.newFloatArray (1, 0);
+if (data.length == 1) {
+retStddev[0] = 0;
+return javajs.util.Quat.newQ (data[0]);
+}var diff = 3.4028235E38;
+var lastStddev = 3.4028235E38;
+var qMean = javajs.util.Quat.simpleAverage (data);
+var maxIter = 100;
+var iter = 0;
+while (diff > criterion && lastStddev != 0 && iter < maxIter) {
+qMean = javajs.util.Quat.newMean (data, qMean);
+retStddev[0] = javajs.util.Quat.stdDev (data, qMean);
+diff = Math.abs (retStddev[0] - lastStddev);
+lastStddev = retStddev[0];
+}
+return qMean;
+}, "~A,~A,~N");
+c$.simpleAverage = Clazz.defineMethod (c$, "simpleAverage", 
+($fz = function (ndata) {
+var mean = javajs.util.V3.new3 (0, 0, 1);
+var v = ndata[0].getNormal ();
+mean.add (v);
+for (var i = ndata.length; --i >= 0; ) mean.add (ndata[i].getNormalDirected (mean));
+
+mean.sub (v);
+mean.normalize ();
+var f = 0;
+for (var i = ndata.length; --i >= 0; ) f += Math.abs (ndata[i].get3dProjection (v).dot (mean));
+
+if (f != 0) mean.scale (f / ndata.length);
+f = Math.sqrt (1 - mean.lengthSquared ());
+if (Float.isNaN (f)) f = 0;
+return javajs.util.Quat.newP4 (javajs.util.P4.new4 (mean.x, mean.y, mean.z, f));
+}, $fz.isPrivate = true, $fz), "~A");
+c$.newMean = Clazz.defineMethod (c$, "newMean", 
+($fz = function (data, mean) {
+var sum =  new javajs.util.V3 ();
+var v;
+var q;
+var dq;
+for (var i = data.length; --i >= 0; ) {
+q = data[i];
+dq = q.div (mean);
+v = dq.getNormal ();
+v.scale (dq.getTheta ());
+sum.add (v);
+}
+sum.scale (1 / data.length);
+var dqMean = javajs.util.Quat.newVA (sum, sum.length ());
+return dqMean.mulQ (mean);
+}, $fz.isPrivate = true, $fz), "~A,javajs.util.Quat");
+c$.stdDev = Clazz.defineMethod (c$, "stdDev", 
+($fz = function (data, mean) {
+var sum2 = 0;
+var n = data.length;
+for (var i = n; --i >= 0; ) {
+var theta = data[i].div (mean).getTheta ();
+sum2 += theta * theta;
+}
+return Math.sqrt (sum2 / n);
+}, $fz.isPrivate = true, $fz), "~A,javajs.util.Quat");
+Clazz.defineMethod (c$, "getEulerZYZ", 
+function () {
+var rA;
+var rB;
+var rG;
+if (this.q1 == 0 && this.q2 == 0) {
+var theta = this.getTheta ();
+return  Clazz.newFloatArray (-1, [this.q3 < 0 ? -theta : theta, 0, 0]);
+}rA = Math.atan2 (2 * (this.q2 * this.q3 + this.q0 * this.q1), 2 * (-this.q1 * this.q3 + this.q0 * this.q2));
+rB = Math.acos (this.q3 * this.q3 - this.q2 * this.q2 - this.q1 * this.q1 + this.q0 * this.q0);
+rG = Math.atan2 (2 * (this.q2 * this.q3 - this.q0 * this.q1), 2 * (this.q0 * this.q2 + this.q1 * this.q3));
+return  Clazz.newFloatArray (-1, [(rA / 0.017453292519943295), (rB / 0.017453292519943295), (rG / 0.017453292519943295)]);
+});
+Clazz.defineMethod (c$, "getEulerZXZ", 
+function () {
+var rA;
+var rB;
+var rG;
+if (this.q1 == 0 && this.q2 == 0) {
+var theta = this.getTheta ();
+return  Clazz.newFloatArray (-1, [this.q3 < 0 ? -theta : theta, 0, 0]);
+}rA = Math.atan2 (2 * (this.q1 * this.q3 - this.q0 * this.q2), 2 * (this.q0 * this.q1 + this.q2 * this.q3));
+rB = Math.acos (this.q3 * this.q3 - this.q2 * this.q2 - this.q1 * this.q1 + this.q0 * this.q0);
+rG = Math.atan2 (2 * (this.q1 * this.q3 + this.q0 * this.q2), 2 * (-this.q2 * this.q3 + this.q0 * this.q1));
+return  Clazz.newFloatArray (-1, [(rA / 0.017453292519943295), (rB / 0.017453292519943295), (rG / 0.017453292519943295)]);
+});
+c$.qZero = c$.prototype.qZero =  new javajs.util.P4 ();
+Clazz.defineStatics (c$,
+"RAD_PER_DEG", 0.017453292519943295);
+});