matrix3x2.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. //
  2. // Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
  3. //
  4. // Distributed under the Boost Software License, Version 1.0
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. //
  8. #include <boost/gil/extension/numeric/affine.hpp>
  9. #include <boost/gil/extension/numeric/resample.hpp>
  10. #include <boost/gil/extension/numeric/sampler.hpp>
  11. #include <boost/gil.hpp>
  12. #define BOOST_TEST_MODULE test_ext_numeric_matrix3x2
  13. #include "unit_test.hpp"
  14. namespace gil = boost::gil;
  15. namespace {
  16. constexpr double HALF_PI = 1.57079632679489661923;
  17. }
  18. BOOST_AUTO_TEST_CASE(matrix3x2_default_constructor)
  19. {
  20. gil::matrix3x2<int> m1;
  21. BOOST_TEST(m1.a == 1);
  22. BOOST_TEST(m1.b == 0);
  23. BOOST_TEST(m1.c == 0);
  24. BOOST_TEST(m1.d == 1);
  25. BOOST_TEST(m1.e == 0);
  26. BOOST_TEST(m1.f == 0);
  27. }
  28. BOOST_AUTO_TEST_CASE(matrix3x2_parameterized_constructor)
  29. {
  30. gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
  31. BOOST_TEST(m1.a == 1);
  32. BOOST_TEST(m1.b == 2);
  33. BOOST_TEST(m1.c == 3);
  34. BOOST_TEST(m1.d == 4);
  35. BOOST_TEST(m1.e == 5);
  36. BOOST_TEST(m1.f == 6);
  37. }
  38. BOOST_AUTO_TEST_CASE(matrix3x2_copy_constructor)
  39. {
  40. gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
  41. gil::matrix3x2<int> m2(m1);
  42. BOOST_TEST(m2.a == 1);
  43. BOOST_TEST(m2.b == 2);
  44. BOOST_TEST(m2.c == 3);
  45. BOOST_TEST(m2.d == 4);
  46. BOOST_TEST(m2.e == 5);
  47. BOOST_TEST(m2.f == 6);
  48. }
  49. BOOST_AUTO_TEST_CASE(matrix3x2_assignment_operator)
  50. {
  51. gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
  52. gil::matrix3x2<int> m2;
  53. m2 = m1;
  54. BOOST_TEST(m2.a == 1);
  55. BOOST_TEST(m2.b == 2);
  56. BOOST_TEST(m2.c == 3);
  57. BOOST_TEST(m2.d == 4);
  58. BOOST_TEST(m2.e == 5);
  59. BOOST_TEST(m2.f == 6);
  60. }
  61. BOOST_AUTO_TEST_CASE(matrix3x2_multiplication_assignment)
  62. {
  63. gil::matrix3x2<int> m1;
  64. gil::matrix3x2<int> m2;
  65. m2 *= m1;
  66. BOOST_TEST(m2.a == 1);
  67. BOOST_TEST(m2.b == 0);
  68. BOOST_TEST(m2.c == 0);
  69. BOOST_TEST(m2.d == 1);
  70. BOOST_TEST(m2.e == 0);
  71. BOOST_TEST(m2.f == 0);
  72. gil::matrix3x2<int> m3(0, 0, 0, 0, 0, 0);
  73. m2 *= m3;
  74. BOOST_TEST(m2.a == 0);
  75. BOOST_TEST(m2.b == 0);
  76. BOOST_TEST(m2.c == 0);
  77. BOOST_TEST(m2.d == 0);
  78. BOOST_TEST(m2.e == 0);
  79. BOOST_TEST(m2.f == 0);
  80. }
  81. BOOST_AUTO_TEST_CASE(matrix3x2_matrix3x2_multiplication)
  82. {
  83. gil::matrix3x2<int> m1;
  84. gil::matrix3x2<int> m2(0, 0, 0, 0, 0, 0);
  85. gil::matrix3x2<int> m3;
  86. m3 = m1 * m2;
  87. BOOST_TEST(m3.a == 0);
  88. BOOST_TEST(m3.b == 0);
  89. BOOST_TEST(m3.c == 0);
  90. BOOST_TEST(m3.d == 0);
  91. BOOST_TEST(m3.e == 0);
  92. BOOST_TEST(m3.f == 0);
  93. }
  94. BOOST_AUTO_TEST_CASE(matrix3x2_vector_multiplication)
  95. {
  96. gil::matrix3x2<int> m1;
  97. gil::point<int> v1{2, 4};
  98. gil::point<int> v2 = v1 * m1;
  99. BOOST_TEST(v2.x == 2);
  100. BOOST_TEST(v2.y == 4);
  101. gil::point<int> v3 = gil::transform(m1, v1);
  102. BOOST_TEST(v3.x == 2);
  103. BOOST_TEST(v3.y == 4);
  104. }
  105. BOOST_AUTO_TEST_CASE(matrix3x2_get_rotate)
  106. {
  107. auto m1 = gil::matrix3x2<double>::get_rotate(HALF_PI);
  108. BOOST_TEST(m1.a == std::cos(HALF_PI), btt::tolerance(0.03));
  109. BOOST_TEST(m1.b == 1);
  110. BOOST_TEST(m1.c == -1);
  111. BOOST_TEST(m1.d == std::cos(HALF_PI), btt::tolerance(0.03));
  112. BOOST_TEST(m1.e == 0);
  113. BOOST_TEST(m1.f == 0);
  114. }
  115. BOOST_AUTO_TEST_CASE(matrix3x2_get_scale)
  116. {
  117. gil::matrix3x2<int> m1;
  118. m1 = gil::matrix3x2<int>::get_scale(2);
  119. BOOST_TEST(m1.a == 2);
  120. BOOST_TEST(m1.b == 0);
  121. BOOST_TEST(m1.c == 0);
  122. BOOST_TEST(m1.d == 2);
  123. BOOST_TEST(m1.e == 0);
  124. BOOST_TEST(m1.f == 0);
  125. m1 = gil::matrix3x2<int>::get_scale(2, 4);
  126. BOOST_TEST(m1.a == 2);
  127. BOOST_TEST(m1.d == 4);
  128. m1 = gil::matrix3x2<int>::get_scale(gil::point<int>{4, 8});
  129. BOOST_TEST(m1.a == 4);
  130. BOOST_TEST(m1.d == 8);
  131. }
  132. BOOST_AUTO_TEST_CASE(matrix3x2_get_translate)
  133. {
  134. gil::matrix3x2<int> m1;
  135. m1 = gil::matrix3x2<int>::get_translate(2, 4);
  136. BOOST_TEST(m1.a == 1);
  137. BOOST_TEST(m1.b == 0);
  138. BOOST_TEST(m1.c == 0);
  139. BOOST_TEST(m1.d == 1);
  140. BOOST_TEST(m1.e == 2);
  141. BOOST_TEST(m1.f == 4);
  142. m1 = gil::matrix3x2<int>::get_translate(gil::point<int>{4, 8});
  143. BOOST_TEST(m1.e == 4);
  144. BOOST_TEST(m1.f == 8);
  145. }
  146. BOOST_AUTO_TEST_CASE(matrix3x2_transform)
  147. {
  148. gil::matrix3x2<int> m1;
  149. gil::point<int> v1{2, 4};
  150. gil::point<int> v2 = gil::transform(m1, v1);
  151. BOOST_TEST(v2.x == 2);
  152. BOOST_TEST(v2.y == 4);
  153. }