1//
2// Copyright 2019-2020 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.hpp>
9#include <boost/gil/extension/numeric/affine.hpp>
10#include <boost/gil/extension/numeric/resample.hpp>
11#include <boost/gil/extension/numeric/sampler.hpp>
12
13#include <boost/core/lightweight_test.hpp>
14
15#include "test_utility_with_tolerance.hpp"
16
17#include <cmath>
18
19namespace gil = boost::gil;
20
21namespace {
22constexpr double HALF_PI = 1.57079632679489661923;
23}
24
25void test_matrix3x2_default_constructor()
26{
27 gil::matrix3x2<int> m1;
28 BOOST_TEST_EQ(m1.a, 1);
29 BOOST_TEST_EQ(m1.b, 0);
30 BOOST_TEST_EQ(m1.c, 0);
31 BOOST_TEST_EQ(m1.d, 1);
32 BOOST_TEST_EQ(m1.e, 0);
33 BOOST_TEST_EQ(m1.f, 0);
34}
35
36void test_matrix3x2_parameterized_constructor()
37{
38 gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
39 BOOST_TEST_EQ(m1.a, 1);
40 BOOST_TEST_EQ(m1.b, 2);
41 BOOST_TEST_EQ(m1.c, 3);
42 BOOST_TEST_EQ(m1.d, 4);
43 BOOST_TEST_EQ(m1.e, 5);
44 BOOST_TEST_EQ(m1.f, 6);
45}
46
47void test_matrix3x2_copy_constructor()
48{
49 gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
50 gil::matrix3x2<int> m2(m1);
51 BOOST_TEST_EQ(m2.a, 1);
52 BOOST_TEST_EQ(m2.b, 2);
53 BOOST_TEST_EQ(m2.c, 3);
54 BOOST_TEST_EQ(m2.d, 4);
55 BOOST_TEST_EQ(m2.e, 5);
56 BOOST_TEST_EQ(m2.f, 6);
57}
58
59void test_matrix3x2_assignment_operator()
60{
61 gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
62 gil::matrix3x2<int> m2;
63 m2 = m1;
64 BOOST_TEST_EQ(m2.a, 1);
65 BOOST_TEST_EQ(m2.b, 2);
66 BOOST_TEST_EQ(m2.c, 3);
67 BOOST_TEST_EQ(m2.d, 4);
68 BOOST_TEST_EQ(m2.e, 5);
69 BOOST_TEST_EQ(m2.f, 6);
70}
71
72void test_matrix3x2_multiplication_assignment()
73{
74 gil::matrix3x2<int> m1;
75 gil::matrix3x2<int> m2;
76 m2 *= m1;
77 BOOST_TEST_EQ(m2.a, 1);
78 BOOST_TEST_EQ(m2.b, 0);
79 BOOST_TEST_EQ(m2.c, 0);
80 BOOST_TEST_EQ(m2.d, 1);
81 BOOST_TEST_EQ(m2.e, 0);
82 BOOST_TEST_EQ(m2.f, 0);
83
84 gil::matrix3x2<int> m3(0, 0, 0, 0, 0, 0);
85 m2 *= m3;
86 BOOST_TEST_EQ(m2.a, 0);
87 BOOST_TEST_EQ(m2.b, 0);
88 BOOST_TEST_EQ(m2.c, 0);
89 BOOST_TEST_EQ(m2.d, 0);
90 BOOST_TEST_EQ(m2.e, 0);
91 BOOST_TEST_EQ(m2.f, 0);
92}
93
94void test_matrix3x2_matrix3x2_multiplication()
95{
96 gil::matrix3x2<int> m1;
97 gil::matrix3x2<int> m2(0, 0, 0, 0, 0, 0);
98 gil::matrix3x2<int> m3;
99 m3 = m1 * m2;
100 BOOST_TEST_EQ(m3.a, 0);
101 BOOST_TEST_EQ(m3.b, 0);
102 BOOST_TEST_EQ(m3.c, 0);
103 BOOST_TEST_EQ(m3.d, 0);
104 BOOST_TEST_EQ(m3.e, 0);
105 BOOST_TEST_EQ(m3.f, 0);
106}
107
108void test_matrix3x2_vector_multiplication()
109{
110 gil::matrix3x2<int> m1;
111 gil::point<int> v1{2, 4};
112
113 gil::point<int> v2 = v1 * m1;
114 BOOST_TEST_EQ(v2.x, 2);
115 BOOST_TEST_EQ(v2.y, 4);
116
117 gil::point<int> v3 = gil::transform(mat: m1, src: v1);
118 BOOST_TEST_EQ(v3.x, 2);
119 BOOST_TEST_EQ(v3.y, 4);
120}
121
122void test_matrix3x2_get_rotate()
123{
124 auto m1 = gil::matrix3x2<double>::get_rotate(rads: HALF_PI);
125 BOOST_TEST_WITH(m1.a, std::cos(HALF_PI), gil::test::utility::with_tolerance<double>(0.03));
126 BOOST_TEST_EQ(m1.b, 1);
127 BOOST_TEST_EQ(m1.c, -1);
128 BOOST_TEST_WITH(m1.d, std::cos(HALF_PI), gil::test::utility::with_tolerance<double>(0.03));
129 BOOST_TEST_EQ(m1.e, 0);
130 BOOST_TEST_EQ(m1.f, 0);
131}
132
133void test_matrix3x2_get_scale()
134{
135 gil::matrix3x2<int> m1;
136 m1 = gil::matrix3x2<int>::get_scale(s: 2);
137 BOOST_TEST_EQ(m1.a, 2);
138 BOOST_TEST_EQ(m1.b, 0);
139 BOOST_TEST_EQ(m1.c, 0);
140 BOOST_TEST_EQ(m1.d, 2);
141 BOOST_TEST_EQ(m1.e, 0);
142 BOOST_TEST_EQ(m1.f, 0);
143 m1 = gil::matrix3x2<int>::get_scale(x: 2, y: 4);
144 BOOST_TEST_EQ(m1.a, 2);
145 BOOST_TEST_EQ(m1.d, 4);
146 m1 = gil::matrix3x2<int>::get_scale(s: gil::point<int>{4, 8});
147 BOOST_TEST_EQ(m1.a, 4);
148 BOOST_TEST_EQ(m1.d, 8);
149}
150
151void test_matrix3x2_get_translate()
152{
153 gil::matrix3x2<int> m1;
154 m1 = gil::matrix3x2<int>::get_translate(x: 2, y: 4);
155 BOOST_TEST_EQ(m1.a, 1);
156 BOOST_TEST_EQ(m1.b, 0);
157 BOOST_TEST_EQ(m1.c, 0);
158 BOOST_TEST_EQ(m1.d, 1);
159 BOOST_TEST_EQ(m1.e, 2);
160 BOOST_TEST_EQ(m1.f, 4);
161 m1 = gil::matrix3x2<int>::get_translate(t: gil::point<int>{4, 8});
162 BOOST_TEST_EQ(m1.e, 4);
163 BOOST_TEST_EQ(m1.f, 8);
164}
165
166void test_matrix3x2_transform()
167{
168 gil::matrix3x2<int> m1;
169 gil::point<int> v1{2, 4};
170 gil::point<int> v2 = gil::transform(mat: m1, src: v1);
171 BOOST_TEST_EQ(v2.x, 2);
172 BOOST_TEST_EQ(v2.y, 4);
173}
174
175void test_matrix3x2_inverse()
176{
177 using matrix_t = gil::matrix3x2<double>;
178 using point_t = gil::point<double>;
179
180 matrix_t mo = matrix_t::get_translate(x: 0, y: 16);
181 matrix_t mb = matrix_t::get_rotate(rads: HALF_PI);
182 auto m = mo * mb;
183
184 point_t p(10, 10);
185 point_t q = gil::transform(mat: inverse(m), src: p);
186 point_t p2 = gil::transform(mat: m, src: q);
187
188 BOOST_TEST_WITH(p.x, p2.x, gil::test::utility::with_tolerance<double>(1e-9));
189 BOOST_TEST_WITH(p.y, p2.y, gil::test::utility::with_tolerance<double>(1e-9));
190}
191
192void test_matrix3x2_center_rotate()
193{
194 gil::point<double> dimension(100.0,100.0);
195 gil::matrix3x2<double> m1;
196
197 m1 = gil::center_rotate(dims: dimension, rads: HALF_PI);
198
199 BOOST_TEST_WITH(m1.a , std::cos(HALF_PI) , gil::test::utility::with_tolerance<double>(1e-9));
200 BOOST_TEST_EQ (m1.b , 1);
201 BOOST_TEST_EQ (m1.c , -1);
202 BOOST_TEST_WITH(m1.d , std::cos(HALF_PI) , gil::test::utility::with_tolerance<double>(1e-9));
203 BOOST_TEST_EQ (m1.e , 100);
204 BOOST_TEST_WITH(m1.f , std::cos(HALF_PI) , gil::test::utility::with_tolerance<double>(1e-9));
205}
206
207int main()
208{
209 test_matrix3x2_default_constructor();
210 test_matrix3x2_parameterized_constructor();
211 test_matrix3x2_copy_constructor();
212 test_matrix3x2_assignment_operator();
213 test_matrix3x2_multiplication_assignment();
214 test_matrix3x2_matrix3x2_multiplication();
215 test_matrix3x2_vector_multiplication();
216 test_matrix3x2_get_rotate();
217 test_matrix3x2_get_scale();
218 test_matrix3x2_get_translate();
219 test_matrix3x2_transform();
220 test_matrix3x2_inverse();
221 test_matrix3x2_center_rotate();
222
223 return ::boost::report_errors();
224}
225

source code of boost/libs/gil/test/extension/numeric/matrix3x2.cpp