ok guys - let me work it out. So the requirements so far are: constructors: 1: Any rotation convention (at least X-Y-Z and Z-Y-Z) BEN: what is used in modeller? 2: rotate around any axis for example (1,1,0),x - meaning rotating around the diagonal of the XY plane in x radians
any other specification I am missing? please reply and I'll try to post some alternatives tomorrow - want to think about it a bit more.
On Nov 12, 2008, at 7:15 PM, Javier Ángel Velázquez Muriel wrote:
> I don't like the convention x-y-z for the Euler angles and we > absolutely need to be consistent around IMP about them or enforce > clear specification. The most used one in EM by far is ZYZ and the one > that I am going to use. > > Javi > > >> >> >> 2008/11/12 imp-dev-request@salilab.org: >>> Send IMP-dev mailing list submissions to >>> imp-dev@salilab.org >>> >>> To subscribe or unsubscribe via the World Wide Web, visit >>> https://salilab.org/mailman/listinfo/imp-dev >>> or, via email, send a message with subject or body 'help' to >>> imp-dev-request@salilab.org >>> >>> You can reach the person managing the list at >>> imp-dev-owner@salilab.org >>> >>> When replying, please edit your Subject line so it is more specific >>> than "Re: Contents of IMP-dev digest..." >>> >>> >>> Today's Topics: >>> >>> 1. Re: [IMP-commits] r854 - trunk/modules/misc/include >>> (Dina Schneidman) >>> 2. Re: [IMP-commits] r854 - trunk/modules/misc/include >>> (Daniel Russel) >>> 3. Re: 2D geometry ( Javier ?ngel Vel?zquez Muriel ) >>> 4. Re: 2D geometry ( Javier ?ngel Vel?zquez Muriel ) >>> 5. Re: 2D geometry (Daniel Russel) >>> 6. Re: 2D geometry (Daniel Russel) >>> 7. Re: 2D geometry (Keren Lasker) >>> >>> >>> ---------------------------------------------------------------------- >>> >>> Message: 1 >>> Date: Wed, 12 Nov 2008 15:59:13 -0800 >>> From: "Dina Schneidman" duhovka@gmail.com >>> Subject: Re: [IMP-dev] [IMP-commits] r854 - trunk/modules/misc/ >>> include >>> To: "List for IMP development" imp-dev@salilab.org >>> Message-ID: >>> 55d63ce50811121559p4995f334kf9e9c1247f21d35f@mail.gmail.com >>> Content-Type: text/plain; charset="iso-8859-1" >>> >>> I think these are Euler angles. >>> http://www.euclideanspace.com/maths/algebra/matrix/orthogonal/rotation/index... >>> Daniel, I agree that conceptually it is wrong to store them in >>> Vector3D, but >>> it is very convenient in practice. >>> >>> On Wed, Nov 12, 2008 at 10:33 PM, Keren Lasker >>> kerenl@salilab.org wrote: >>> >>>> Daniel - the angles are not Euler angles but just three angles >>>> around >>>> X/Y/Z axis. >>>> 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? >>>> 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 < >>>> imp-commits@salilab.org >>>>>> wrote: >>>>> >>>>>> Author: kerenl@SALILAB.ORG >>>>>> 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 >>>>>> IMP-commits@salilab.org >>>>>> https://salilab.org/mailman/listinfo/imp-commits >>>>> _______________________________________________ >>>>> IMP-dev mailing list >>>>> IMP-dev@salilab.org >>>>> https://salilab.org/mailman/listinfo/imp-dev >>>> >>>> _______________________________________________ >>>> IMP-dev mailing list >>>> IMP-dev@salilab.org >>>> https://salilab.org/mailman/listinfo/imp-dev >>>> >>>