1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
/**
* 2D cross fonction
*/
template < typename T, size_t N >
T squared_distance( Vector< T, N > const& a, Vector< T, N > const& b )
{
T result = T(0);
for ( size_t i = 0; i < N; i++ ){
result += ( b[i] - a[i] )*( b[i] - a[i] ) ;
}
return result ;
}
/**
* 2D cross fonction
*/
template < typename T >
T cross( Vector< T, 2 > const& a, Vector< T, 2 > const& b )
{
return a[0]*b[1] - a[1] * b[0] ;
}
/**
* 3D cross fonction
*/
template < typename T >
Vector< T, 3 > cross( Vector< T, 3 > const& a, Vector< T, 3 > const& b )
{
return Vector< T, 3 >(
a[1]*b[2] - a[2] * b[1],
a[2]*b[0] - a[0] * b[2],
a[0]*b[1] - a[1] * b[0]
);
}
const double ABSOLUTE_EPSILON = 1.0e-10 ;
BOOST_AUTO_TEST_SUITE( TestVector )
BOOST_AUTO_TEST_CASE( testDistance )
{
Vector< double, 2 > origine;
Vector< double, 2 > uy(3.0,4.0);
BOOST_CHECK_CLOSE( squared_distance( uy, origine ), 25.0, ABSOLUTE_EPSILON );
}
BOOST_AUTO_TEST_CASE( test2D )
{
Vector< double, 2 > ux(1.0,0.0);
Vector< double, 2 > uy(0.0,1.0);
BOOST_CHECK_CLOSE( cross( ux, uy ), 1.0, ABSOLUTE_EPSILON );
}
BOOST_AUTO_TEST_CASE( test3D )
{
Vector< double, 3 > ux(1.0,0.0,0.0);
Vector< double, 3 > uy(0.0,1.0,0.0);
Vector< double, 3 > uz(0.0,0.0,1.0);
BOOST_CHECK_SMALL( squared_distance( cross( ux, uy ), uz ), ABSOLUTE_EPSILON );
}
BOOST_AUTO_TEST_CASE( testNonInstanciable )
{
Vector< double, 4 > ux; ux[0] = 1.0 ;
Vector< double, 4 > uy; uy[1] = 1.0 ;
//provoque bien une erreur
//cross( ux, uy );
//TempTest.cpp:192:16: error: no matching function for call to 'cross(Vector<double, 4u>&, Vector<double, 4u>&)'
//TempTest.cpp:192:16: note: candidates are:
//TempTest.cpp:140:3: note: template<class T> T cross(const Vector<T, 2u>&, const Vector<T, 2u>&)
//TempTest.cpp:148:16: note: template<class T> Vector<T, 3u> cross(const Vector<T, 3u>&, const Vector<T, 3u>&)
}
BOOST_AUTO_TEST_SUITE_END() |
Partager