35 AxisAngle AxisAngle::operator * (
const Rotation3D & r)
const {
37 return operator* ( Quaternion(r) );
41 AxisAngle AxisAngle::operator * (
const AxisAngle & a)
const {
43 return operator* ( Quaternion(a) );
46 AxisAngle AxisAngle::operator * (
const EulerAngles & e)
const {
48 return operator* ( Quaternion(e) );
51 AxisAngle AxisAngle::operator * (
const RotationZYX & r)
const {
53 return operator* ( Quaternion(r) );
56 AxisAngle AxisAngle::operator * (
const Quaternion & q)
const {
58 return AxisAngle ( Quaternion(*
this) * q );
63 AxisAngle AxisAngle::operator * (
const Quaternion & q)
const {
65 const Scalar s1 = std::sin(fAngle/2);
66 const Scalar au = std::cos(fAngle/2);
67 const Scalar ai = s1 * fAxis.X();
68 const Scalar aj = s1 * fAxis.Y();
69 const Scalar ak = s1 * fAxis.Z();
70 Scalar aqu = au*q.U() - ai*q.I() - aj*q.J() - ak*q.K();
71 Scalar aqi = au*q.I() + ai*q.U() + aj*q.K() - ak*q.J();
72 Scalar aqj = au*q.J() - ai*q.K() + aj*q.U() + ak*q.I();
73 Scalar aqk = au*q.K() + ai*q.J() - aj*q.I() + ak*q.U();
74 Scalar r = std::sqrt(aqi*aqi + aqj*aqj + aqk*aqk);
76 if (aqu < 0) { aqu = - aqu; aqi = - aqi; aqj = - aqj, aqk = - aqk; }
77 const Scalar angle = 2*asin ( r );
78 DisplacementVector3D< Cartesian3D<double> > axis ( aqi, aqj, aqk );
80 axis.SetCoordinates(0,0,1);
84 return AxisAngle ( axis, angle );
89 AxisAngle AxisAngle::operator * (
const RotationX & rx)
const {
92 const Scalar s1 = std::sin(fAngle/2);
93 const Scalar au = std::cos(fAngle/2);
94 const Scalar ai = s1 * fAxis.X();
95 const Scalar aj = s1 * fAxis.Y();
96 const Scalar ak = s1 * fAxis.Z();
97 Scalar c = rx.CosAngle();
100 Scalar qu = std::sqrt( .5*(1+c) );
101 Scalar qi = std::sqrt( .5*(1-c) );
102 if ( rx.SinAngle() < 0 ) qi = -qi;
103 Scalar aqu = au*qu - ai*qi;
104 Scalar aqi = ai*qu + au*qi;
105 Scalar aqj = aj*qu + ak*qi;
106 Scalar aqk = ak*qu - aj*qi;
107 Scalar r = std::sqrt(aqi*aqi + aqj*aqj + aqk*aqk);
109 if (aqu < 0) { aqu = - aqu; aqi = - aqi; aqj = - aqj, aqk = - aqk; }
110 const Scalar angle = 2*asin ( r );
111 DisplacementVector3D< Cartesian3D<double> > axis ( aqi, aqj, aqk );
113 axis.SetCoordinates(0,0,1);
117 return AxisAngle ( axis, angle );
120 AxisAngle AxisAngle::operator * (
const RotationY & ry)
const {
123 const Scalar s1 = std::sin(fAngle/2);
124 const Scalar au = std::cos(fAngle/2);
125 const Scalar ai = s1 * fAxis.X();
126 const Scalar aj = s1 * fAxis.Y();
127 const Scalar ak = s1 * fAxis.Z();
128 Scalar c = ry.CosAngle();
130 if ( c < -1 ) c = -1;
131 Scalar qu = std::sqrt( .5*(1+c) );
132 Scalar qj = std::sqrt( .5*(1-c) );
133 if ( ry.SinAngle() < 0 ) qj = -qj;
134 Scalar aqu = au*qu - aj*qj;
135 Scalar aqi = ai*qu - ak*qj;
136 Scalar aqj = aj*qu + au*qj;
137 Scalar aqk = ak*qu + ai*qj;
138 Scalar r = std::sqrt(aqi*aqi + aqj*aqj + aqk*aqk);
140 if (aqu < 0) { aqu = - aqu; aqi = - aqi; aqj = - aqj, aqk = - aqk; }
141 const Scalar angle = 2*asin ( r );
142 DisplacementVector3D< Cartesian3D<double> > axis ( aqi, aqj, aqk );
144 axis.SetCoordinates(0,0,1);
148 return AxisAngle ( axis, angle );
151 AxisAngle AxisAngle::operator * (
const RotationZ & rz)
const {
154 const Scalar s1 = std::sin(fAngle/2);
155 const Scalar au = std::cos(fAngle/2);
156 const Scalar ai = s1 * fAxis.X();
157 const Scalar aj = s1 * fAxis.Y();
158 const Scalar ak = s1 * fAxis.Z();
159 Scalar c = rz.CosAngle();
161 if ( c < -1 ) c = -1;
162 Scalar qu = std::sqrt( .5*(1+c) );
163 Scalar qk = std::sqrt( .5*(1-c) );
164 if ( rz.SinAngle() < 0 ) qk = -qk;
165 Scalar aqu = au*qu - ak*qk;
166 Scalar aqi = ai*qu + aj*qk;
167 Scalar aqj = aj*qu - ai*qk;
168 Scalar aqk = ak*qu + au*qk;
169 Scalar r = std::sqrt(aqi*aqi + aqj*aqj + aqk*aqk);
171 if (aqu < 0) { aqu = - aqu; aqi = - aqi; aqj = - aqj, aqk = - aqk; }
172 const Scalar angle = 2*asin ( r );
173 DisplacementVector3D< Cartesian3D<double> > axis ( aqi, aqj, aqk );
175 axis.SetCoordinates(0,0,1);
179 return AxisAngle ( axis, angle );
182 AxisAngle operator*( RotationX
const & r, AxisAngle
const & a ) {
183 return AxisAngle(r) * a;
186 AxisAngle operator*( RotationY
const & r, AxisAngle
const & a ) {
187 return AxisAngle(r) * a;
190 AxisAngle operator*( RotationZ
const & r, AxisAngle
const & a ) {
191 return AxisAngle(r) * a;