50 #include "FGMatrix33.h"
51 #include "FGColumnVector3.h"
53 #include "FGQuaternion.h"
73 mEulerAngles = q.mEulerAngles;
74 mEulerSines = q.mEulerSines;
75 mEulerCosines = q.mEulerCosines;
84 InitializeFromEulerAngles(phi, tht, psi);
91 double phi = vOrient(ePhi);
92 double tht = vOrient(eTht);
93 double psi = vOrient(ePsi);
95 InitializeFromEulerAngles(phi, tht, psi);
106 void FGQuaternion::InitializeFromEulerAngles(
double phi,
double tht,
double psi)
108 mEulerAngles(ePhi) = phi;
109 mEulerAngles(eTht) = tht;
110 mEulerAngles(ePsi) = psi;
112 double thtd2 = 0.5*tht;
113 double psid2 = 0.5*psi;
114 double phid2 = 0.5*phi;
116 double Sthtd2 = sin(thtd2);
117 double Spsid2 = sin(psid2);
118 double Sphid2 = sin(phid2);
120 double Cthtd2 = cos(thtd2);
121 double Cpsid2 = cos(psid2);
122 double Cphid2 = cos(phid2);
124 double Cphid2Cthtd2 = Cphid2*Cthtd2;
125 double Cphid2Sthtd2 = Cphid2*Sthtd2;
126 double Sphid2Sthtd2 = Sphid2*Sthtd2;
127 double Sphid2Cthtd2 = Sphid2*Cthtd2;
129 data[0] = Cphid2Cthtd2*Cpsid2 + Sphid2Sthtd2*Spsid2;
130 data[1] = Sphid2Cthtd2*Cpsid2 - Cphid2Sthtd2*Spsid2;
131 data[2] = Cphid2Sthtd2*Cpsid2 + Sphid2Cthtd2*Spsid2;
132 data[3] = Cphid2Cthtd2*Spsid2 - Sphid2Sthtd2*Cpsid2;
141 data[0] = 0.50*sqrt(1.0 + m(1,1) + m(2,2) + m(3,3));
142 double t = 0.25/data[0];
143 data[1] = t*(m(2,3) - m(3,2));
144 data[2] = t*(m(3,1) - m(1,3));
145 data[3] = t*(m(1,2) - m(2,1));
161 -0.5*( data[1]*PQR(eP) + data[2]*PQR(eQ) + data[3]*PQR(eR)),
162 0.5*( data[0]*PQR(eP) - data[3]*PQR(eQ) + data[2]*PQR(eR)),
163 0.5*( data[3]*PQR(eP) + data[0]*PQR(eQ) - data[1]*PQR(eR)),
164 0.5*(-data[2]*PQR(eP) + data[1]*PQR(eQ) + data[0]*PQR(eR))
174 if (norm == 0.0 || fabs(norm - 1.000) < 1e-10)
return;
176 double rnorm = 1.0/norm;
187 void FGQuaternion::ComputeDerivedUnconditional(
void)
const
208 mT(1,1) = q0q0 + q1q1 - q2q2 - q3q3;
209 mT(1,2) = 2.0*(q1q2 + q0q3);
210 mT(1,3) = 2.0*(q1q3 - q0q2);
211 mT(2,1) = 2.0*(q1q2 - q0q3);
212 mT(2,2) = q0q0 - q1q1 + q2q2 - q3q3;
213 mT(2,3) = 2.0*(q2q3 + q0q1);
214 mT(3,1) = 2.0*(q1q3 + q0q2);
215 mT(3,2) = 2.0*(q2q3 - q0q1);
216 mT(3,3) = q0q0 - q1q1 - q2q2 + q3q3;
228 mEulerSines(ePhi) = sin(mEulerAngles(ePhi));
230 mEulerSines(eTht) = -mT(1,3);
231 mEulerSines(ePsi) = sin(mEulerAngles(ePsi));
232 mEulerCosines(ePhi) = cos(mEulerAngles(ePhi));
233 mEulerCosines(eTht) = cos(mEulerAngles(eTht));
234 mEulerCosines(ePsi) = cos(mEulerAngles(ePsi));
239 std::string FGQuaternion::Dump(
const std::string& delimiter)
const
241 std::ostringstream buffer;
242 buffer << std::setprecision(16) << data[0] << delimiter;
243 buffer << std::setprecision(16) << data[1] << delimiter;
244 buffer << std::setprecision(16) << data[2] << delimiter;
245 buffer << std::setprecision(16) << data[3];
251 std::ostream& operator<<(std::ostream& os,
const FGQuaternion& q)
253 os << q(1) <<
" , " << q(2) <<
" , " << q(3) <<
" , " << q(4);