Revision: 18393 http://sourceforge.net/p/jmol/code/18393 Author: hansonr Date: 2013-07-01 20:03:33 +0000 (Mon, 01 Jul 2013) Log Message: -----------
Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/util/Quaternion.java trunk/Jmol/src/org/jmol/util/Tensor.java Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2013-07-01 18:38:26 UTC (rev 18392) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2013-07-01 20:03:33 UTC (rev 18393) @@ -282,7 +282,7 @@ } public JmolList<Tensor> getAllAtomTensors(String type) { - return atomTensors.get(type.toLowerCase()); + return (atomTensors == null ? null : atomTensors.get(type.toLowerCase())); } private Tensor[] getTensorList(JmolList<Tensor> list) { Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2013-07-01 18:38:26 UTC (rev 18392) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2013-07-01 20:03:33 UTC (rev 18393) @@ -3367,6 +3367,8 @@ // q%2 y // q%3 z // q%4 normal + // q%5 EulerZXZ (degrees) + // q%6 EulerZYZ (degrees) // q%-1 vector(1) // q%-2 theta // q%-3 Matrix column 0 @@ -3374,7 +3376,6 @@ // q%-5 Matrix column 2 // q%-6 AxisAngle format // q%-9 Matrix format - // q%-10 EulerZXZ (degrees) case 0: return addXFloat(pt4.w); case 1: @@ -3391,7 +3392,7 @@ case 5: return addXAF(q.getEulerZXZ()); case 6: - return addXAF(q.getEulerZXZ()); + return addXAF(q.getEulerZYZ()); case -1: return addXPt(P3.newP(q.getVector(-1))); case -2: Modified: trunk/Jmol/src/org/jmol/util/Quaternion.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Quaternion.java 2013-07-01 18:38:26 UTC (rev 18392) +++ trunk/Jmol/src/org/jmol/util/Quaternion.java 2013-07-01 20:03:33 UTC (rev 18393) @@ -37,10 +37,8 @@ * This ensures that the reported theta is always positive, and the normal * reported is always associated with a positive theta. * - * By Bob Hanson, hans...@stolaf.edu 6/2008 + * @author Bob Hanson, hans...@stolaf.edu 6/2008 * - * - * */ public class Quaternion { @@ -315,11 +313,23 @@ q3 *= -1; } - public static final Quaternion getQuaternionFrame(P3 center, Tuple3f x, Tuple3f y) { + /** + * returns a quaternion frame based on three points (center, x, and any point in xy plane) + * or two vectors (vA, vB). + * + * @param center (null for vA/vB option) + * @param x + * @param xy + * @return quaternion for frame + */ + public static final Quaternion getQuaternionFrame(P3 center, Tuple3f x, + Tuple3f xy) { V3 vA = V3.newV(x); - vA.sub(center); - V3 vB = V3.newV(y); - vB.sub(center); + V3 vB = V3.newV(xy); + if (center != null) { + vA.sub(center); + vB.sub(center); + } return getQuaternionFrameV(vA, vB, null, false); } @@ -804,16 +814,21 @@ } public float[] getEulerZYZ() { - return null; + // http://www.swarthmore.edu/NatSci/mzucker1/e27/diebel2006attitude.pdf + double rA, rB, rG; + rA = Math.atan2(2 * (q2 * q3 - q0 * q1), 2 * (q1 * q3 + q0 * q2 )); + rB = Math.acos(q3 * q3 - q2 * q2 - q1 * q1 + q0 * q0); + rG = Math.atan2( 2 * (q2 * q3 + q0 * q1), 2 * (q0 * q2 - q1 * q3)); + return new float[] {(float) (rA / RAD_PER_DEG), (float) (rB / RAD_PER_DEG), (float) (rG / RAD_PER_DEG)}; } public float[] getEulerZXZ() { // NOT http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles // http://www.swarthmore.edu/NatSci/mzucker1/e27/diebel2006attitude.pdf double rA, rB, rG; + rA = Math.atan2(2 * (q1 * q3 + q0 * q2), 2 * (q0 * q1 - q2 * q3 )); + rB = Math.acos(q3 * q3 - q2 * q2 - q1 * q1 + q0 * q0); rG = Math.atan2( 2 * (q1 * q3 - q0 * q2), 2 * (q2 * q3 + q0 * q1)); - rB = Math.acos(q3 * q3 - q2 * q2 - q1 * q1 + q0 * q0); - rA = Math.atan2(2 * (q1 * q3 + q0 * q2), 2 * (q0 * q1 - q2 * q3 )); return new float[] {(float) (rA / RAD_PER_DEG), (float) (rB / RAD_PER_DEG), (float) (rG / RAD_PER_DEG)}; } Modified: trunk/Jmol/src/org/jmol/util/Tensor.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Tensor.java 2013-07-01 18:38:26 UTC (rev 18392) +++ trunk/Jmol/src/org/jmol/util/Tensor.java 2013-07-01 20:03:33 UTC (rev 18393) @@ -29,7 +29,7 @@ /** * @author Bob Hanson hans...@stolaf.edu 6/30/2013 - * + * @author Simone Sturniolo */ public class Tensor { @@ -125,7 +125,8 @@ switch ((";............." + ";eigenvalues.." + ";eigenvectors." + ";asymmetric..." + ";symmetric...." + ";trace........" + ";haeberlen...." + ";eulerzyz....." + ";eulerzxz....." - + ";indices......" + ";type.........").indexOf(infoType) / 14) { + + ";quaternion..." + ";indices......" + ";type.........") + .indexOf(infoType) / 14) { case 1: return eigenValues; case 2: @@ -159,14 +160,15 @@ / (eigenValues[2] - haeb[0])); return haeb; case 7: // eulerzyz - return Quaternion.getQuaternionFrame(P3.new3(0, 0, 0), - eigenVectors[0], eigenVectors[1]).getEulerZYZ(); + return ((Quaternion) getInfo("quaternion")).getEulerZYZ(); case 8: // eulerzxz - return Quaternion.getQuaternionFrame(P3.new3(0, 0, 0), - eigenVectors[0], eigenVectors[1]).getEulerZXZ(); - case 9: // + return ((Quaternion) getInfo("quaternion")).getEulerZXZ(); + case 9: // quaternion + return Quaternion.getQuaternionFrame(null, eigenVectors[0], + eigenVectors[1]); + case 10: // return new int[] { modelIndex, atomIndex1, atomIndex2 }; - case 10: + case 11: return type; default: return null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits