[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [IMP-dev] [IMP-commits] r854 - trunk/modules/misc/include




On Nov 12, 2008, at 6:55 PM, Daniel Russel wrote:


On Nov 12, 2008, at 10:33 PM, Keren Lasker wrote:

Daniel - the angles are not Euler angles but just three angles around
X/Y/Z axis.
It is not entirely clear to me what the constructor does, but I
suspect it is one of the things that gets called Euler rotations (but
I haven't looked at Euler angles in a while).  I think it needs to be
made clearer whether the rotation is about the rotated or unrotated
versions of the specified axis.

Why are we providing initialization from such a representation anyway?
Is there some use for which they are better than quaternions?

look at the latest version of Rotation3D class - I added some documentation on quaternions

Would you like the option to rotate around another axis, ,something
like:
(1,1,0),45 - meaning rotating around the diagonal of the XY plane in
45 degrees?
Yes, although radians are probably preferable. Basically a non-
normalized quaternion.
yes we use radians - this is just for readability :)




On Nov 12, 2008, at 5:43 PM, Daniel Russel wrote:

I don't like having two equivalent constructors from thevsame data or
using a vector to hold angles.

What I had meant with my suggestion is initialization from an axis
and
an amount of rotation about that axis as that is a somewhat less
problematic basis than Euler angles (and one I use :-)



On Nov 12, 2008, at 2:31 PM, Notification of IMP commits <
wrote:

Author: 
Date: 2008-11-12 14:31:59 -0800 (Wed, 12 Nov 2008)
New Revision: 854

Modified:
trunk/modules/misc/include/Rotation3D.h
Log:
1. Change protected to private
2. Add constructors from Vector3D and an angle
3. update documentation

Modified: trunk/modules/misc/include/Rotation3D.h
===================================================================
--- trunk/modules/misc/include/Rotation3D.h    2008-11-12 21:15:36
UTC (rev 853)
+++ trunk/modules/misc/include/Rotation3D.h    2008-11-12 22:31:59
UTC (rev 854)
@@ -19,26 +19,28 @@

class IMPMISCEXPORT Rotation3D {
public:
-  //! Initialize a rotation in x-y-z order from three angles
+  Rotation3D(){
+ }
+  //! Initialize a rotation in x-y-z order from three Euler angles
/** \param[in] xr Rotation around the X axis
   \param[in] yr Rotation around the Y axis
   \param[in] zr Rotation around the Z axis
*/
Rotation3D(Float xr, Float yr, Float zr) {
-    Float cx = cos(xr);  Float cy = cos(yr);  Float cz = cos(zr);
-    Float sx = sin(xr);  Float sy = sin(yr);  Float sz = sin(zr);
-    Float m00 = cz*cy;
-    Float m11 = -sy*sx*sz + cx*cz;
-    Float m22 = cy*cx;
-    quat_[0] = sqrt(1+m00+m11+m22)/2.0;
-    quat_[1] = sqrt(1+m00-m11-m22)/2.0;
-    quat_[2] = sqrt(1-m00+m11-m22)/2.0;
-    quat_[3] = sqrt(1-m00-m11+m22)/2.0;
-    if (cy*sx + sy*cx*sz + sx*cz < 0.0) quat_[1] = -quat_[1];
-    if (sz*sx - sy*cx*cz - sy < 0.0)    quat_[2] = -quat_[2];
-    if (sz*cy + sy*sx*cz + sz*cx < 0.0) quat_[3] = -quat_[3];
+    init_angles(xr,yr,zr);
}
-
+  //! Initialize a rotation in x-y-z order from three identical
Euler angles
+  /** \param[in] e_angle Rotation around first the X axis, Y axis
and Z axis
+  */
+  Rotation3D(Float e_angle){
+    init_angles(e_angle, e_angle, e_angle);
+  }
+  //! Initialize a rotation in x-y-z order from three Euler angles
+  /** \param[in] v  A vector that holds three Euler angles (x-y-z
order)
+  */
+  Rotation3D(const Vector3D &v){
+    init_angles(v[0],v[1],v[2]);
+  }
Matrix3D get_matrix() const {
const Float a = quat_[0];
const Float b = quat_[1];
@@ -76,7 +78,22 @@
 return atan2(matrix21(), matrix11());
}

-protected:
+private:
+  void init_angles(Float xr, Float yr, Float zr) {
+    Float cx = cos(xr);  Float cy = cos(yr);  Float cz = cos(zr);
+    Float sx = sin(xr);  Float sy = sin(yr);  Float sz = sin(zr);
+    Float m00 = cz*cy;
+    Float m11 = -sy*sx*sz + cx*cz;
+    Float m22 = cy*cx;
+    quat_[0] = sqrt(1+m00+m11+m22)/2.0;
+    quat_[1] = sqrt(1+m00-m11-m22)/2.0;
+    quat_[2] = sqrt(1-m00+m11-m22)/2.0;
+    quat_[3] = sqrt(1-m00-m11+m22)/2.0;
+    if (cy*sx + sy*cx*sz + sx*cz < 0.0) quat_[1] = -quat_[1];
+    if (sz*sx - sy*cx*cz - sy < 0.0)    quat_[2] = -quat_[2];
+    if (sz*cy + sy*sx*cz + sz*cx < 0.0) quat_[3] = -quat_[3];
+  }
+
Float matrix11() const {
 return sqr(quat_[0]) + sqr(quat_[1]) - sqr(quat_[2]) -
sqr(quat_[3]);
}

_______________________________________________
IMP-commits mailing list

https://salilab.org/mailman/listinfo/imp-commits
_______________________________________________
IMP-dev mailing list

https://salilab.org/mailman/listinfo/imp-dev

_______________________________________________
IMP-dev mailing list

https://salilab.org/mailman/listinfo/imp-dev

_______________________________________________
IMP-dev mailing list

https://salilab.org/mailman/listinfo/imp-dev