Re: [IMP-dev] IMP-dev Digest, Vol 13, Issue 8
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 >>> >>
My suggestion would be to only have constructions from qyaternions and provide functions to turn your favorite rep into quaternions if you want to use something else fir some reason. That way we can suport both xyz and zxz euler abgles. And there will be no efficiency loss as that is what the current constructor does anyway. And I am curious to hear a reason why anyone would use Euler angles if they know about qyaternions :-)
On Nov 12, 2008, at 4:15 PM, "Javier Ángel Velázquez Muriel" <javi@salilab.o rg> 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 >>>> >>>
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 >>>> >>>
Keren Lasker wrote: > 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?
Euler angles are not used in any Modeller interface; it's all rotation matrices or rotation about an axis. The only place to my knowledge that Euler angles are used at all in Modeller is internally for CG and QN optimizations. For any exposed interface I agree that quaternions are probably the best solution.
P.S. As regards putting this stuff in the IMP kernel, that wouldn't work if you need to use any of the decorators, since those are defined in the core module.
Ben
Ben - welcome back! I just wanted to have the Rotation3D and Transformation3D in the kernel, these are general classes that do not need decorators. Anyway - lets in the mean time until we'll sort out all of the geometry classes interfaces just leave it in misc.
On Nov 12, 2008, at 8:14 PM, Ben Webb wrote:
> Keren Lasker wrote: >> 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? > > Euler angles are not used in any Modeller interface; it's all rotation > matrices or rotation about an axis. The only place to my knowledge > that > Euler angles are used at all in Modeller is internally for CG and QN > optimizations. For any exposed interface I agree that quaternions are > probably the best solution. > > P.S. As regards putting this stuff in the IMP kernel, that wouldn't > work > if you need to use any of the decorators, since those are defined in > the > core module. > > Ben > -- > ben@salilab.org http://salilab.org/~ben/ > "It is a capital mistake to theorize before one has data." > - Sir Arthur Conan Doyle > _______________________________________________ > IMP-dev mailing list > IMP-dev@salilab.org > https://salilab.org/mailman/listinfo/imp-dev
participants (4)
-
Ben Webb
-
Daniel Russel
-
Javier Ángel Velázquez Muriel
-
Keren Lasker