]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/math/example/HSO3SO4.cpp
c79ff46a10a1672c2743bbf3cb1da105a8bf8199
1 // test file for HSO3.hpp and HSO4.hpp
3 // (C) Copyright Hubert Holin 2001.
4 // Distributed under the Boost Software License, Version 1.0. (See
5 // accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
11 #include <boost/math/quaternion.hpp>
17 const int number_of_intervals
= 5;
19 const float pi
= ::std::atan(1.0f
)*4;
35 ::std::cout
<< "That's all folks!" << ::std::endl
;
40 // Test of quaternion and R^3 rotation relationship
43 void test_SO3_spherical()
45 ::std::cout
<< "Testing spherical:" << ::std::endl
;
46 ::std::cout
<< ::std::endl
;
48 const float rho
= 1.0f
;
54 for (int idxphi2
= 0; idxphi2
<= number_of_intervals
; idxphi2
++)
56 phi2
= (-pi
/2)+(idxphi2
*pi
)/number_of_intervals
;
58 for (int idxphi1
= 0; idxphi1
<= number_of_intervals
; idxphi1
++)
60 phi1
= (-pi
/2)+(idxphi1
*pi
)/number_of_intervals
;
62 for (int idxtheta
= 0; idxtheta
<= number_of_intervals
; idxtheta
++)
64 theta
= -pi
+(idxtheta
*(2*pi
))/number_of_intervals
;
66 //::std::cout << "theta = " << theta << " ; ";
67 //::std::cout << "phi1 = " << phi1 << " ; ";
68 //::std::cout << "phi2 = " << phi2;
69 //::std::cout << ::std::endl;
71 ::boost::math::quaternion
<float> q
= ::boost::math::spherical(rho
, theta
, phi1
, phi2
);
73 //::std::cout << "q = " << q << ::std::endl;
75 R3_matrix
<float> rot
= quaternion_to_R3_rotation(q
);
77 //::std::cout << "rot = ";
78 //::std::cout << "\t" << rot.a11 << "\t" << rot.a12 << "\t" << rot.a13 << ::std::endl;
79 //::std::cout << "\t";
80 //::std::cout << "\t" << rot.a21 << "\t" << rot.a22 << "\t" << rot.a23 << ::std::endl;
81 //::std::cout << "\t";
82 //::std::cout << "\t" << rot.a31 << "\t" << rot.a32 << "\t" << rot.a33 << ::std::endl;
84 ::boost::math::quaternion
<float> p
= R3_rotation_to_quaternion(rot
, &q
);
86 //::std::cout << "p = " << p << ::std::endl;
88 //::std::cout << "round trip discrepancy: " << ::boost::math::abs(q-p) << ::std::endl;
90 //::std::cout << ::std::endl;
95 ::std::cout
<< ::std::endl
;
99 void test_SO3_semipolar()
101 ::std::cout
<< "Testing semipolar:" << ::std::endl
;
102 ::std::cout
<< ::std::endl
;
104 const float rho
= 1.0f
;
110 for (int idxalpha
= 0; idxalpha
<= number_of_intervals
; idxalpha
++)
112 alpha
= (idxalpha
*(pi
/2))/number_of_intervals
;
114 for (int idxtheta1
= 0; idxtheta1
<= number_of_intervals
; idxtheta1
++)
116 theta1
= -pi
+(idxtheta1
*(2*pi
))/number_of_intervals
;
118 for (int idxtheta2
= 0; idxtheta2
<= number_of_intervals
; idxtheta2
++)
120 theta2
= -pi
+(idxtheta2
*(2*pi
))/number_of_intervals
;
122 //::std::cout << "alpha = " << alpha << " ; ";
123 //::std::cout << "theta1 = " << theta1 << " ; ";
124 //::std::cout << "theta2 = " << theta2;
125 //::std::cout << ::std::endl;
127 ::boost::math::quaternion
<float> q
= ::boost::math::semipolar(rho
, alpha
, theta1
, theta2
);
129 //::std::cout << "q = " << q << ::std::endl;
131 R3_matrix
<float> rot
= quaternion_to_R3_rotation(q
);
133 //::std::cout << "rot = ";
134 //::std::cout << "\t" << rot.a11 << "\t" << rot.a12 << "\t" << rot.a13 << ::std::endl;
135 //::std::cout << "\t";
136 //::std::cout << "\t" << rot.a21 << "\t" << rot.a22 << "\t" << rot.a23 << ::std::endl;
137 //::std::cout << "\t";
138 //::std::cout << "\t" << rot.a31 << "\t" << rot.a32 << "\t" << rot.a33 << ::std::endl;
140 ::boost::math::quaternion
<float> p
= R3_rotation_to_quaternion(rot
, &q
);
142 //::std::cout << "p = " << p << ::std::endl;
144 //::std::cout << "round trip discrepancy: " << ::boost::math::abs(q-p) << ::std::endl;
146 //::std::cout << ::std::endl;
151 ::std::cout
<< ::std::endl
;
155 void test_SO3_multipolar()
157 ::std::cout
<< "Testing multipolar:" << ::std::endl
;
158 ::std::cout
<< ::std::endl
;
166 for (int idxrho
= 0; idxrho
<= number_of_intervals
; idxrho
++)
168 rho1
= (idxrho
*1.0f
)/number_of_intervals
;
169 rho2
= ::std::sqrt(1.0f
-rho1
*rho1
);
171 for (int idxtheta1
= 0; idxtheta1
<= number_of_intervals
; idxtheta1
++)
173 theta1
= -pi
+(idxtheta1
*(2*pi
))/number_of_intervals
;
175 for (int idxtheta2
= 0; idxtheta2
<= number_of_intervals
; idxtheta2
++)
177 theta2
= -pi
+(idxtheta2
*(2*pi
))/number_of_intervals
;
179 //::std::cout << "rho1 = " << rho1 << " ; ";
180 //::std::cout << "theta1 = " << theta1 << " ; ";
181 //::std::cout << "theta2 = " << theta2;
182 //::std::cout << ::std::endl;
184 ::boost::math::quaternion
<float> q
= ::boost::math::multipolar(rho1
, theta1
, rho2
, theta2
);
186 //::std::cout << "q = " << q << ::std::endl;
188 R3_matrix
<float> rot
= quaternion_to_R3_rotation(q
);
190 //::std::cout << "rot = ";
191 //::std::cout << "\t" << rot.a11 << "\t" << rot.a12 << "\t" << rot.a13 << ::std::endl;
192 //::std::cout << "\t";
193 //::std::cout << "\t" << rot.a21 << "\t" << rot.a22 << "\t" << rot.a23 << ::std::endl;
194 //::std::cout << "\t";
195 //::std::cout << "\t" << rot.a31 << "\t" << rot.a32 << "\t" << rot.a33 << ::std::endl;
197 ::boost::math::quaternion
<float> p
= R3_rotation_to_quaternion(rot
, &q
);
199 //::std::cout << "p = " << p << ::std::endl;
201 //::std::cout << "round trip discrepancy: " << ::boost::math::abs(q-p) << ::std::endl;
203 //::std::cout << ::std::endl;
208 ::std::cout
<< ::std::endl
;
212 void test_SO3_cylindrospherical()
214 ::std::cout
<< "Testing cylindrospherical:" << ::std::endl
;
215 ::std::cout
<< ::std::endl
;
223 for (int idxt
= 0; idxt
<= number_of_intervals
; idxt
++)
225 t
= -1.0f
+(idxt
*2.0f
)/number_of_intervals
;
226 radius
= ::std::sqrt(1.0f
-t
*t
);
228 for (int idxlatitude
= 0; idxlatitude
<= number_of_intervals
; idxlatitude
++)
230 latitude
= (-pi
/2)+(idxlatitude
*pi
)/number_of_intervals
;
232 for (int idxlongitude
= 0; idxlongitude
<= number_of_intervals
; idxlongitude
++)
234 longitude
= -pi
+(idxlongitude
*(2*pi
))/number_of_intervals
;
236 //::std::cout << "t = " << t << " ; ";
237 //::std::cout << "longitude = " << longitude;
238 //::std::cout << "latitude = " << latitude;
239 //::std::cout << ::std::endl;
241 ::boost::math::quaternion
<float> q
= ::boost::math::cylindrospherical(t
, radius
, longitude
, latitude
);
243 //::std::cout << "q = " << q << ::std::endl;
245 R3_matrix
<float> rot
= quaternion_to_R3_rotation(q
);
247 //::std::cout << "rot = ";
248 //::std::cout << "\t" << rot.a11 << "\t" << rot.a12 << "\t" << rot.a13 << ::std::endl;
249 //::std::cout << "\t";
250 //::std::cout << "\t" << rot.a21 << "\t" << rot.a22 << "\t" << rot.a23 << ::std::endl;
251 //::std::cout << "\t";
252 //::std::cout << "\t" << rot.a31 << "\t" << rot.a32 << "\t" << rot.a33 << ::std::endl;
254 ::boost::math::quaternion
<float> p
= R3_rotation_to_quaternion(rot
, &q
);
256 //::std::cout << "p = " << p << ::std::endl;
258 //::std::cout << "round trip discrepancy: " << ::boost::math::abs(q-p) << ::std::endl;
260 //::std::cout << ::std::endl;
265 ::std::cout
<< ::std::endl
;
269 void test_SO3_cylindrical()
271 ::std::cout
<< "Testing cylindrical:" << ::std::endl
;
272 ::std::cout
<< ::std::endl
;
280 for (int idxh2
= 0; idxh2
<= number_of_intervals
; idxh2
++)
282 h2
= -1.0f
+(idxh2
*2.0f
)/number_of_intervals
;
284 for (int idxh1
= 0; idxh1
<= number_of_intervals
; idxh1
++)
286 h1
= ::std::sqrt(1.0f
-h2
*h2
)*(-1.0f
+(idxh2
*2.0f
)/number_of_intervals
);
287 r
= ::std::sqrt(1.0f
-h1
*h1
-h2
*h2
);
289 for (int idxangle
= 0; idxangle
<= number_of_intervals
; idxangle
++)
291 angle
= -pi
+(idxangle
*(2*pi
))/number_of_intervals
;
293 //::std::cout << "angle = " << angle << " ; ";
294 //::std::cout << "h1 = " << h1;
295 //::std::cout << "h2 = " << h2;
296 //::std::cout << ::std::endl;
298 ::boost::math::quaternion
<float> q
= ::boost::math::cylindrical(r
, angle
, h1
, h2
);
300 //::std::cout << "q = " << q << ::std::endl;
302 R3_matrix
<float> rot
= quaternion_to_R3_rotation(q
);
304 //::std::cout << "rot = ";
305 //::std::cout << "\t" << rot.a11 << "\t" << rot.a12 << "\t" << rot.a13 << ::std::endl;
306 //::std::cout << "\t";
307 //::std::cout << "\t" << rot.a21 << "\t" << rot.a22 << "\t" << rot.a23 << ::std::endl;
308 //::std::cout << "\t";
309 //::std::cout << "\t" << rot.a31 << "\t" << rot.a32 << "\t" << rot.a33 << ::std::endl;
311 ::boost::math::quaternion
<float> p
= R3_rotation_to_quaternion(rot
, &q
);
313 //::std::cout << "p = " << p << ::std::endl;
315 //::std::cout << "round trip discrepancy: " << ::boost::math::abs(q-p) << ::std::endl;
317 //::std::cout << ::std::endl;
322 ::std::cout
<< ::std::endl
;
328 ::std::cout
<< "Testing SO3:" << ::std::endl
;
329 ::std::cout
<< ::std::endl
;
331 test_SO3_spherical();
333 test_SO3_semipolar();
335 test_SO3_multipolar();
337 test_SO3_cylindrospherical();
339 test_SO3_cylindrical();
344 // Test of quaternion and R^4 rotation relationship
347 void test_SO4_spherical()
349 ::std::cout
<< "Testing spherical:" << ::std::endl
;
350 ::std::cout
<< ::std::endl
;
352 const float rho1
= 1.0f
;
353 const float rho2
= 1.0f
;
363 for (int idxphi21
= 0; idxphi21
<= number_of_intervals
; idxphi21
++)
365 phi21
= (-pi
/2)+(idxphi21
*pi
)/number_of_intervals
;
367 for (int idxphi22
= 0; idxphi22
<= number_of_intervals
; idxphi22
++)
369 phi22
= (-pi
/2)+(idxphi22
*pi
)/number_of_intervals
;
371 for (int idxphi11
= 0; idxphi11
<= number_of_intervals
; idxphi11
++)
373 phi11
= (-pi
/2)+(idxphi11
*pi
)/number_of_intervals
;
375 for (int idxphi12
= 0; idxphi12
<= number_of_intervals
; idxphi12
++)
377 phi12
= (-pi
/2)+(idxphi12
*pi
)/number_of_intervals
;
379 for (int idxtheta1
= 0; idxtheta1
<= number_of_intervals
; idxtheta1
++)
381 theta1
= -pi
+(idxtheta1
*(2*pi
))/number_of_intervals
;
383 for (int idxtheta2
= 0; idxtheta2
<= number_of_intervals
; idxtheta2
++)
385 theta2
= -pi
+(idxtheta2
*(2*pi
))/number_of_intervals
;
387 //::std::cout << "theta1 = " << theta1 << " ; ";
388 //::std::cout << "phi11 = " << phi11 << " ; ";
389 //::std::cout << "phi21 = " << phi21;
390 //::std::cout << "theta2 = " << theta2 << " ; ";
391 //::std::cout << "phi12 = " << phi12 << " ; ";
392 //::std::cout << "phi22 = " << phi22;
393 //::std::cout << ::std::endl;
395 ::boost::math::quaternion
<float> p1
= ::boost::math::spherical(rho1
, theta1
, phi11
, phi21
);
397 //::std::cout << "p1 = " << p1 << ::std::endl;
399 ::boost::math::quaternion
<float> q1
= ::boost::math::spherical(rho2
, theta2
, phi12
, phi22
);
401 //::std::cout << "q1 = " << q1 << ::std::endl;
403 ::std::pair
< ::boost::math::quaternion
<float> , ::boost::math::quaternion
<float> > pq1
=
404 ::std::make_pair(p1
,q1
);
406 R4_matrix
<float> rot
= quaternions_to_R4_rotation(pq1
);
408 //::std::cout << "rot = ";
409 //::std::cout << "\t" << rot.a11 << "\t" << rot.a12 << "\t" << rot.a13 << "\t" << rot.a14 << ::std::endl;
410 //::std::cout << "\t";
411 //::std::cout << "\t" << rot.a21 << "\t" << rot.a22 << "\t" << rot.a23 << "\t" << rot.a24 << ::std::endl;
412 //::std::cout << "\t";
413 //::std::cout << "\t" << rot.a31 << "\t" << rot.a32 << "\t" << rot.a33 << "\t" << rot.a34 << ::std::endl;
414 //::std::cout << "\t";
415 //::std::cout << "\t" << rot.a41 << "\t" << rot.a42 << "\t" << rot.a43 << "\t" << rot.a44 << ::std::endl;
417 ::std::pair
< ::boost::math::quaternion
<float> , ::boost::math::quaternion
<float> > pq2
=
418 R4_rotation_to_quaternions(rot
, &pq1
);
420 //::std::cout << "p1 = " << pq.first << ::std::endl;
421 //::std::cout << "p2 = " << pq.second << ::std::endl;
423 //::std::cout << "round trip discrepancy: " << ::std::sqrt(::boost::math::norm(pq1.first-pq2.first)+::boost::math::norm(pq1.second-pq2.second)) << ::std::endl;
425 //::std::cout << ::std::endl;
433 ::std::cout
<< ::std::endl
;
439 ::std::cout
<< "Testing SO4:" << ::std::endl
;
440 ::std::cout
<< ::std::endl
;
442 test_SO4_spherical();