qvm/test/rot_mat_test.cpp
Emil Dotchevski 7f7a846bca Euler angles
2018-03-14 21:12:15 -07:00

434 lines
14 KiB
C++

//Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
//Distributed under the Boost Software License, Version 1.0. (See accompanying
//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/qvm/mat_operations.hpp>
#include <boost/qvm/mat.hpp>
#include "test_qvm_matrix.hpp"
#include "test_qvm_vector.hpp"
#include "gold.hpp"
namespace
{
template <int D>
void
test_x()
{
using namespace boost::qvm;
test_qvm::vector<V1,3> axis; axis.a[0]=1;
for( float r=0; r<6.28f; r+=0.5f )
{
test_qvm::matrix<M1,D,D> const m1=rot_mat<D>(axis,r);
test_qvm::rotation_x(m1.b,r);
BOOST_QVM_TEST_EQ(m1.a,m1.b);
test_qvm::matrix<M1,D,D> m2(42,1);
set_rot(m2,axis,r);
test_qvm::rotation_x(m2.b,r);
BOOST_QVM_TEST_EQ(m2.a,m2.b);
test_qvm::matrix<M1,D,D> m3(42,1);
test_qvm::matrix<M1,D,D> m4(42,1);
rotate(m3,axis,r);
m3 = m3*m1;
BOOST_QVM_TEST_EQ(m3.a,m3.a);
}
}
template <int D>
void
test_y()
{
using namespace boost::qvm;
test_qvm::vector<V1,3> axis; axis.a[1]=1;
for( float r=0; r<6.28f; r+=0.5f )
{
test_qvm::matrix<M1,D,D> m1=rot_mat<D>(axis,r);
test_qvm::rotation_y(m1.b,r);
BOOST_QVM_TEST_EQ(m1.a,m1.b);
test_qvm::matrix<M1,D,D> m2(42,1);
set_rot(m2,axis,r);
test_qvm::rotation_y(m2.b,r);
BOOST_QVM_TEST_EQ(m2.a,m2.b);
test_qvm::matrix<M1,D,D> m3(42,1);
test_qvm::matrix<M1,D,D> m4(42,1);
rotate(m3,axis,r);
m3 = m3*m1;
BOOST_QVM_TEST_EQ(m3.a,m3.a);
}
}
template <int D>
void
test_z()
{
using namespace boost::qvm;
test_qvm::vector<V1,3> axis; axis.a[2]=1;
for( float r=0; r<6.28f; r+=0.5f )
{
test_qvm::matrix<M1,D,D> m1=rot_mat<D>(axis,r);
test_qvm::rotation_z(m1.b,r);
BOOST_QVM_TEST_EQ(m1.a,m1.b);
test_qvm::matrix<M1,D,D> m2(42,1);
set_rot(m2,axis,r);
test_qvm::rotation_z(m2.b,r);
BOOST_QVM_TEST_EQ(m2.a,m2.b);
test_qvm::matrix<M1,D,D> m3(42,1);
test_qvm::matrix<M1,D,D> m4(42,1);
rotate(m3,axis,r);
m3 = m3*m1;
BOOST_QVM_TEST_EQ(m3.a,m3.a);
}
}
template <int D>
void
test_xzy()
{
using namespace boost::qvm;
for( float x1=0; x1<6.28f; x1+=0.5f )
for( float z2=0; z2<6.28f; z2+=0.5f )
for( float y3=0; y3<6.28f; y3+=0.5f )
{
mat<float,D,D> const m2 = rotx_mat<D>(x1) * rotz_mat<D>(z2) * roty_mat<D>(y3);
{
mat<float,D,D> m1 = rot_mat_xzy<D>(x1,z2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_xzy(m1,x1,z2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_xzy(m1,x1,z2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_xyz()
{
using namespace boost::qvm;
for( float x1=0; x1<6.28f; x1+=0.5f )
for( float y2=0; y2<6.28f; y2+=0.5f )
for( float z3=0; z3<6.28f; z3+=0.5f )
{
mat<float,D,D> const m2 = rotx_mat<D>(x1) * roty_mat<D>(y2) * rotz_mat<D>(z3);
{
mat<float,D,D> m1 = rot_mat_xyz<D>(x1,y2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_xyz(m1,x1,y2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_xyz(m1,x1,y2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_yxz()
{
using namespace boost::qvm;
for( float y1=0; y1<6.28f; y1+=0.5f )
for( float x2=0; x2<6.28f; x2+=0.5f )
for( float z3=0; z3<6.28f; z3+=0.5f )
{
mat<float,D,D> const m2 = roty_mat<D>(y1) * rotx_mat<D>(x2) * rotz_mat<D>(z3);
{
mat<float,D,D> m1 = rot_mat_yxz<D>(y1,x2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_yxz(m1,y1,x2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_yxz(m1,y1,x2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_yzx()
{
using namespace boost::qvm;
for( float y1=0; y1<6.28f; y1+=0.5f )
for( float z2=0; z2<6.28f; z2+=0.5f )
for( float x3=0; x3<6.28f; x3+=0.5f )
{
mat<float,D,D> const m2 = roty_mat<D>(y1) * rotz_mat<D>(z2) * rotx_mat<D>(x3);
{
mat<float,D,D> m1 = rot_mat_yzx<D>(y1,z2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_yzx(m1,y1,z2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_yzx(m1,y1,z2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_zyx()
{
using namespace boost::qvm;
for( float z1=0; z1<6.28f; z1+=0.5f )
for( float y2=0; y2<6.28f; y2+=0.5f )
for( float x3=0; x3<6.28f; x3+=0.5f )
{
mat<float,D,D> const m2 = rotz_mat<D>(z1) * roty_mat<D>(y2) * rotx_mat<D>(x3);
{
mat<float,D,D> m1 = rot_mat_zyx<D>(z1,y2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_zyx(m1,z1,y2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_zyx(m1,z1,y2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_zxy()
{
using namespace boost::qvm;
for( float z1=0; z1<6.28f; z1+=0.5f )
for( float x2=0; x2<6.28f; x2+=0.5f )
for( float y3=0; y3<6.28f; y3+=0.5f )
{
mat<float,D,D> const m2 = rotz_mat<D>(z1) * rotx_mat<D>(x2) * roty_mat<D>(y3);
{
mat<float,D,D> m1 = rot_mat_zxy<D>(z1,x2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_zxy(m1,z1,x2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_zxy(m1,z1,x2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_xzx()
{
using namespace boost::qvm;
for( float x1=0; x1<6.28f; x1+=0.5f )
for( float z2=0; z2<6.28f; z2+=0.5f )
for( float x3=0; x3<6.28f; x3+=0.5f )
{
mat<float,D,D> const m2 = rotx_mat<D>(x1) * rotz_mat<D>(z2) * rotx_mat<D>(x3);
{
mat<float,D,D> m1 = rot_mat_xzx<D>(x1,z2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_xzx(m1,x1,z2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_xzx(m1,x1,z2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_xyx()
{
using namespace boost::qvm;
for( float x1=0; x1<6.28f; x1+=0.5f )
for( float y2=0; y2<6.28f; y2+=0.5f )
for( float x3=0; x3<6.28f; x3+=0.5f )
{
mat<float,D,D> const m2 = rotx_mat<D>(x1) * roty_mat<D>(y2) * rotx_mat<D>(x3);
{
mat<float,D,D> m1 = rot_mat_xyx<D>(x1,y2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_xyx(m1,x1,y2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_xyx(m1,x1,y2,x3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_yxy()
{
using namespace boost::qvm;
for( float y1=0; y1<6.28f; y1+=0.5f )
for( float x2=0; x2<6.28f; x2+=0.5f )
for( float y3=0; y3<6.28f; y3+=0.5f )
{
mat<float,D,D> const m2 = roty_mat<D>(y1) * rotx_mat<D>(x2) * roty_mat<D>(y3);
{
mat<float,D,D> m1 = rot_mat_yxy<D>(y1,x2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_yxy(m1,y1,x2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_yxy(m1,y1,x2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_yzy()
{
using namespace boost::qvm;
for( float y1=0; y1<6.28f; y1+=0.5f )
for( float z2=0; z2<6.28f; z2+=0.5f )
for( float y3=0; y3<6.28f; y3+=0.5f )
{
mat<float,D,D> const m2 = roty_mat<D>(y1) * rotz_mat<D>(z2) * roty_mat<D>(y3);
{
mat<float,D,D> m1 = rot_mat_yzy<D>(y1,z2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_yzy(m1,y1,z2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_yzy(m1,y1,z2,y3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_zyz()
{
using namespace boost::qvm;
for( float z1=0; z1<6.28f; z1+=0.5f )
for( float y2=0; y2<6.28f; y2+=0.5f )
for( float z3=0; z3<6.28f; z3+=0.5f )
{
mat<float,D,D> const m2 = rotz_mat<D>(z1) * roty_mat<D>(y2) * rotz_mat<D>(z3);
{
mat<float,D,D> m1 = rot_mat_zyz<D>(z1,y2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_zyz(m1,z1,y2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_zyz(m1,z1,y2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
template <int D>
void
test_zxz()
{
using namespace boost::qvm;
for( float z1=0; z1<6.28f; z1+=0.5f )
for( float x2=0; x2<6.28f; x2+=0.5f )
for( float z3=0; z3<6.28f; z3+=0.5f )
{
mat<float,D,D> const m2 = rotz_mat<D>(z1) * rotx_mat<D>(x2) * rotz_mat<D>(z3);
{
mat<float,D,D> m1 = rot_mat_zxz<D>(z1,x2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1; set_rot_zxz(m1,z1,x2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
{
mat<float,D,D> m1 = identity_mat<float,D>(); rotate_zxz(m1,z1,x2,z3);
BOOST_QVM_TEST_CLOSE(m1.a,m2.a,0.0002f);
}
}
}
}
int
main()
{
test_x<3>();
test_y<3>();
test_z<3>();
test_xzy<3>();
test_xyz<3>();
test_yxz<3>();
test_yzx<3>();
test_zyx<3>();
test_zxy<3>();
test_xzx<3>();
test_xyx<3>();
test_yxy<3>();
test_yzy<3>();
test_zyz<3>();
test_zxz<3>();
test_x<4>();
test_y<4>();
test_z<4>();
test_xzy<4>();
test_xyz<4>();
test_yxz<4>();
test_yzx<4>();
test_zyx<4>();
test_zxy<4>();
test_xzx<4>();
test_xyx<4>();
test_yxy<4>();
test_yzy<4>();
test_zyz<4>();
test_zxz<4>();
test_x<5>();
test_y<5>();
test_z<5>();
test_xzy<5>();
test_xyz<5>();
test_yxz<5>();
test_yzx<5>();
test_zyx<5>();
test_zxy<5>();
test_xzx<5>();
test_xyx<5>();
test_yxy<5>();
test_yzy<5>();
test_zyz<5>();
test_zxz<5>();
return boost::report_errors();
}