1// Copyright 2008-2022 Emil Dotchevski and Reverge Studios, Inc.
2
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6#ifdef NDEBUG
7#undef NDEBUG
8#endif
9
10#ifdef BOOST_QVM_TEST_SINGLE_HEADER
11# include BOOST_QVM_TEST_SINGLE_HEADER
12#else
13# include <boost/qvm/quat_operations.hpp>
14# include <boost/qvm/quat.hpp>
15#endif
16
17#include "test_qvm_quaternion.hpp"
18#include "gold.hpp"
19
20namespace
21 {
22 void
23 test()
24 {
25 using namespace boost::qvm;
26 {
27 test_qvm::quaternion<Q1> a=rotx_quat(angle: 1.0f);
28 test_qvm::quaternion<Q1> b=rotx_quat(angle: .5f);
29 test_qvm::quaternion<Q1> aa=slerp360(a,b,t: 0);
30 test_qvm::quaternion<Q1> bb=slerp360(a,b,t: 1);
31 BOOST_QVM_TEST_CLOSE(aa.a,a.a,0.0001f);
32 BOOST_QVM_TEST_CLOSE(bb.a,b.a,0.0001f);
33 }
34 for( float a1=0; a1<6.28f; a1+=0.1f )
35 {
36 test_qvm::quaternion<Q1> const qx1=rotx_quat(angle: a1);
37 test_qvm::quaternion<Q1> const qy1=roty_quat(angle: a1);
38 test_qvm::quaternion<Q1> const qz1=rotz_quat(angle: a1);
39 for( float a2=0; a2<6.28f; a2+=0.1f )
40 {
41 test_qvm::quaternion<Q1> const qx2=rotx_quat(angle: a2);
42 test_qvm::quaternion<Q1> const qy2=roty_quat(angle: a2);
43 test_qvm::quaternion<Q1> const qz2=rotz_quat(angle: a2);
44 for( float t=0; t<1; t+=0.1f )
45 {
46 {
47 test_qvm::quaternion<Q1> const qx=rotx_quat(angle: a1*(1-t)+a2*t);
48 test_qvm::quaternion<Q1> const qy=roty_quat(angle: a1*(1-t)+a2*t);
49 test_qvm::quaternion<Q1> const qz=rotz_quat(angle: a1*(1-t)+a2*t);
50 test_qvm::quaternion<Q1> const qsx=slerp360(a: qx1,b: qx2,t);
51 test_qvm::quaternion<Q1> const qsy=slerp360(a: qref(a: qy1),b: qy2,t);
52 test_qvm::quaternion<Q1> const qsz=slerp360(a: qz1,b: qref(a: qz2),t);
53 BOOST_QVM_TEST_CLOSE(qx.a,qsx.a,0.001f);
54 BOOST_QVM_TEST_CLOSE(qy.a,qsy.a,0.001f);
55 BOOST_QVM_TEST_CLOSE(qz.a,qsz.a,0.001f);
56 }
57 {
58 test_qvm::quaternion<Q1> const x1=slerp180(a: qx1,b: qx2,t);
59 test_qvm::quaternion<Q1> const x2=slerp360(a: dot(a: qx1,b: qx2)<0 ? -qx1 : qx1,b: qx2,t);
60 test_qvm::quaternion<Q1> const y1=slerp180(a: qy1,b: qy2,t);
61 test_qvm::quaternion<Q1> const y2=slerp360(a: dot(a: qy1,b: qy2)<0 ? -qy1 : qy1,b: qy2,t);
62 test_qvm::quaternion<Q1> const z1=slerp180(a: qz1,b: qz2,t);
63 test_qvm::quaternion<Q1> const z2=slerp360(a: dot(a: qz1,b: qz2)<0 ? -qz1 : qz1,b: qz2,t);
64 BOOST_QVM_TEST_CLOSE(x1.a,x2.a,0.001f);
65 BOOST_QVM_TEST_CLOSE(y1.a,y2.a,0.001f);
66 BOOST_QVM_TEST_CLOSE(z1.a,z2.a,0.001f);
67 }
68 }
69 }
70 }
71 }
72 }
73
74int
75main()
76 {
77 test();
78 return boost::report_errors();
79 }
80

source code of boost/libs/qvm/test/slerp_test.cpp