JAL-1807 still testing
[jalviewjs.git] / bin / javajs / util / Quat.js
index bfc5444..0db2469 100644 (file)
-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);
-});
+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