efl

Форк
0
/
eina_test_matrix.c 
955 строк · 29.7 Кб
1
/* EINA - EFL data type library
2
 * Copyright (C) 2015 Cedric Bail
3
 *
4
 * This library is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU Lesser General Public
6
 * License as published by the Free Software Foundation; either
7
 * version 2.1 of the License, or (at your option) any later version.
8
 *
9
 * This library is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
 * Lesser General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU Lesser General Public
15
 * License along with this library;
16
 * if not, see <http://www.gnu.org/licenses/>.
17
 */
18

19
#ifdef HAVE_CONFIG_H
20
# include "config.h"
21
#endif
22

23
#define DBL_EPSILON 0.0000001
24

25
#include <stdio.h>
26
#include <math.h>
27

28
#include <Eina.h>
29

30
#include "eina_suite.h"
31

32
EFL_START_TEST(eina_matrix2)
33
{
34
   Eina_Matrix2 m;
35
   Eina_Matrix2 n;
36
   double xx, xy, yx, yy;
37

38

39
   eina_matrix2_values_set(&m,
40
                           1, 0,
41
                           0, 1);
42
   fail_if(eina_matrix2_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY);
43

44
   eina_matrix2_inverse(&n, &m);
45
   fail_if(eina_matrix2_type_get(&n) != EINA_MATRIX_TYPE_IDENTITY);
46

47
   eina_matrix2_values_get(&m,
48
                           &xx, &xy,
49
                           &yx, &yy);
50

51
   fail_if(!EINA_DBL_EQ(xx, yy) ||
52
           !EINA_DBL_EQ(yy, 1));
53
   fail_if(!EINA_DBL_EQ(xy, yx) ||
54
           !EINA_DBL_EQ(xy, 0));
55

56
}
57
EFL_END_TEST
58

59
EFL_START_TEST(eina_matrix2_operation)
60
{
61
   Eina_Matrix2 m1, m2, m3;
62
   double xx, xy, yx, yy;
63
   double arr[] = {1, 1, 1, 1};
64

65
   eina_matrix2_values_set(&m2,
66
                           2, 3,
67
                           3, 2);
68
   eina_matrix2_inverse(&m1, &m2);
69
   eina_matrix2_values_get(&m1,
70
                           &xx, &xy,
71
                           &yx, &yy);
72
   fail_if((xx - (-0.4) > DBL_EPSILON) || (xy - 0.6 > DBL_EPSILON) ||
73
           (yx - 0.6 > DBL_EPSILON) || (yy - (-0.4) > DBL_EPSILON));
74

75
   eina_matrix2_identity(&m1);
76
   eina_matrix2_values_get(&m1,
77
                           &xx, &xy,
78
                           &yx, &yy);
79
   fail_if(!EINA_DBL_EQ(xx, yy) ||
80
           !EINA_DBL_EQ(yy, 1));
81
   fail_if(!EINA_DBL_EQ(xy, yx) ||
82
           !EINA_DBL_EQ(xy, 0));
83

84
   eina_matrix2_array_set(&m1, arr);
85
   eina_matrix2_values_get(&m1,
86
                           &xx, &xy,
87
                           &yx, &yy);
88
   fail_if(!EINA_DBL_EQ(xx, yy) ||
89
           !EINA_DBL_EQ(yx, xy) ||
90
           !EINA_DBL_EQ(xy, 1));
91

92
   eina_matrix2_copy(&m2, &m1);
93
   eina_matrix2_values_get(&m2,
94
                           &xx, &xy,
95
                           &yx, &yy);
96
   fail_if(!EINA_DBL_EQ(xx, yy) ||
97
           !EINA_DBL_EQ(yx, xy) ||
98
           !EINA_DBL_EQ(xy, 1));
99

100
   eina_matrix2_values_set(&m1,
101
                           2, 3,
102
                           3, 2);
103
   eina_matrix2_multiply_copy(&m3, &m1, &m2);
104
   eina_matrix2_values_get(&m3,
105
                           &xx, &xy,
106
                           &yx, &yy);
107
   fail_if(!EINA_DBL_EQ(xx, yy) ||
108
           !EINA_DBL_EQ(yx, xy) ||
109
           !EINA_DBL_EQ(xy, 5));
110

111
   eina_matrix2_multiply(&m3, &m1, &m2);
112
   eina_matrix2_values_get(&m3,
113
                           &xx, &xy,
114
                           &yx, &yy);
115
   fail_if(!EINA_DBL_EQ(xx, yy) ||
116
           !EINA_DBL_EQ(yx, xy) ||
117
           !EINA_DBL_EQ(xy, 5));
118

119
}
120
EFL_END_TEST
121

122
EFL_START_TEST(eina_matrix4)
123
{
124
   Eina_Matrix4 m;
125
   Eina_Matrix4 n;
126
   double xx, xy, xz, xw,
127
     yx, yy, yz, yw,
128
     zx, zy, zz, zw,
129
     wx, wy, wz, ww;
130

131

132
   eina_matrix4_values_set(&m,
133
                           1, 0, 0, 0,
134
                           0, 1, 0, 0,
135
                           0, 0, 1, 0,
136
                           0, 0, 0, 1);
137
   fail_if(eina_matrix4_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY);
138

139
   fail_if(!eina_matrix4_normalized(&n, &m));
140
   fail_if(eina_matrix4_type_get(&n) != EINA_MATRIX_TYPE_IDENTITY);
141

142
   fail_if(!eina_matrix4_inverse(&n, &m));
143
   fail_if(eina_matrix4_type_get(&n) != EINA_MATRIX_TYPE_IDENTITY);
144

145
   eina_matrix4_values_get(&m,
146
                           &xx, &xy, &xz, &xw,
147
                           &yx, &yy, &yz, &yw,
148
                           &zx, &zy, &zz, &zw,
149
                           &wx, &wy, &wz, &ww);
150

151
   fail_if(!EINA_DBL_EQ(xx, yy) ||
152
           !EINA_DBL_EQ(yy, zz) ||
153
           !EINA_DBL_EQ(zz, ww) ||
154
           !EINA_DBL_EQ(ww, 1));
155
   fail_if(!EINA_DBL_EQ(xy, xz) ||
156
           !EINA_DBL_EQ(xz, xw) ||
157
           !EINA_DBL_EQ(xw, yx) ||
158
           !EINA_DBL_EQ(yx, yz) ||
159
           !EINA_DBL_EQ(yz, yw) ||
160
           !EINA_DBL_EQ(yw, zx) ||
161
           !EINA_DBL_EQ(zx, zy) ||
162
           !EINA_DBL_EQ(zy, zw) ||
163
           !EINA_DBL_EQ(zw, wx) ||
164
           !EINA_DBL_EQ(wx, wy) ||
165
           !EINA_DBL_EQ(wy, wz) ||
166
           !EINA_DBL_EQ(wz, 0));
167

168
   eina_matrix4_values_set(&m,
169
                           1, 2, 3, 4,
170
                           5, 6, 7, 8,
171
                           9, 10, 11, 12,
172
                           13, 14, 15, 16);
173

174
   eina_matrix4_transpose(&n, &m);
175
   fail_if(!EINA_DBL_EQ(n.xx, 1) ||
176
           !EINA_DBL_EQ(n.xy, 5) ||
177
           !EINA_DBL_EQ(n.xz, 9) ||
178
           !EINA_DBL_EQ(n.xw, 13) ||
179
           !EINA_DBL_EQ(n.yx, 2) ||
180
           !EINA_DBL_EQ(n.yy, 6) ||
181
           !EINA_DBL_EQ(n.yz, 10) ||
182
           !EINA_DBL_EQ(n.yw, 14) ||
183
           !EINA_DBL_EQ(n.zx, 3) ||
184
           !EINA_DBL_EQ(n.zy, 7) ||
185
           !EINA_DBL_EQ(n.zz, 11) ||
186
           !EINA_DBL_EQ(n.zw, 15) ||
187
           !EINA_DBL_EQ(n.wx, 4) ||
188
           !EINA_DBL_EQ(n.wy, 8) ||
189
           !EINA_DBL_EQ(n.wz, 12) ||
190
           !EINA_DBL_EQ(n.ww, 16));
191

192
}
193
EFL_END_TEST
194

195
#define MATRIX4_CMP(XX, XY, XZ, XW, YX, YY, YZ, YW, ZX, ZY, ZZ, ZW, WX, WY, WZ, WW, AXX, AXY, AXZ, AXW, AYX, AYY, AYZ, AYW, AZX, AZY, AZZ, AZW, AWX, AWY, AWZ, AWW) \
196
  (EINA_DBL_EQ(XX, AXX) && \
197
   EINA_DBL_EQ(XY, AXY) && \
198
   EINA_DBL_EQ(XZ, AXZ) && \
199
   EINA_DBL_EQ(XW, AXW) && \
200
   EINA_DBL_EQ(YX, AYX) && \
201
   EINA_DBL_EQ(YY, AYY) && \
202
   EINA_DBL_EQ(YZ, AYZ) && \
203
   EINA_DBL_EQ(YW, AYW) && \
204
   EINA_DBL_EQ(ZX, AZX) && \
205
   EINA_DBL_EQ(ZY, AZY) && \
206
   EINA_DBL_EQ(ZZ, AZZ) && \
207
   EINA_DBL_EQ(ZW, AZW) && \
208
   EINA_DBL_EQ(WX, AWX) && \
209
   EINA_DBL_EQ(WY, AWY) && \
210
   EINA_DBL_EQ(WZ, AWZ) && \
211
   EINA_DBL_EQ(WW, AWW))
212

213
EFL_START_TEST(eina_matrix4_operation)
214
{
215
   double det;
216
   double l=5, r=4, b=4, t=3, dn=3, df=2;
217
   Eina_Matrix4 m, m1, m2;
218
   double xx, xy, xz, xw,
219
          yx, yy, yz, yw,
220
          zx, zy, zz, zw,
221
          wx, wy, wz, ww;
222
   const double arr[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
223
   double rotate_radian = 45.0 * M_PI / 180.0;
224

225
   eina_matrix4_values_set(&m,
226
                           0, 0, 2, 0,
227
                           2, 0, 0, 0,
228
                           0, 0, 0, 2,
229
                           0, 2, 0, 0);
230
   det = eina_matrix4_determinant(&m);
231
   fail_if(!EINA_DBL_EQ(det, -16));
232

233
   eina_matrix4_inverse(&m1, &m);
234
   eina_matrix4_values_get(&m1,
235
                           &xx, &xy, &xz, &xw,
236
                           &yx, &yy, &yz, &yw,
237
                           &zx, &zy, &zz, &zw,
238
                           &wx, &wy, &wz, &ww);
239
   fail_if (!EINA_DBL_EQ(xy, 0.5) ||
240
            !EINA_DBL_EQ(yw, xy) ||
241
            !EINA_DBL_EQ(zx, yw) ||
242
            !EINA_DBL_EQ(wz, zx));
243

244
   eina_matrix4_identity(&m1);
245
   eina_matrix4_values_get(&m1,
246
                           &xx, &xy, &xz, &xw,
247
                           &yx, &yy, &yz, &yw,
248
                           &zx, &zy, &zz, &zw,
249
                           &wx, &wy, &wz, &ww);
250
   fail_if (!EINA_DBL_EQ(xx, 1) ||
251
            !EINA_DBL_EQ(yy, xx) ||
252
            !EINA_DBL_EQ(zz, yy) ||
253
            !EINA_DBL_EQ(ww, zz));
254

255
   eina_matrix4_values_set(&m1,
256
                           0, 2, 2, 0,
257
                           2, 0, 0, 2,
258
                           2, 0, 0, 2,
259
                           0, 2, 2, 0);
260
   eina_matrix4_multiply_copy(&m2, &m1, &m);
261
   eina_matrix4_values_get(&m2,
262
                           &xx, &xy, &xz, &xw,
263
                           &yx, &yy, &yz, &yw,
264
                           &zx, &zy, &zz, &zw,
265
                           &wx, &wy, &wz, &ww);
266
   fail_if (!EINA_DBL_EQ(xx, 4) ||
267
            !EINA_DBL_EQ(xw, xx) ||
268
            !EINA_DBL_EQ(yy, xw) ||
269
            !EINA_DBL_EQ(yz, yy) ||
270
            !EINA_DBL_EQ(zy, yz) ||
271
            !EINA_DBL_EQ(zz, yy) ||
272
            !EINA_DBL_EQ(wx, xx) ||
273
            !EINA_DBL_EQ(ww, zy));
274

275
   eina_matrix4_multiply(&m2, &m1, &m);
276
   eina_matrix4_values_get(&m2,
277
                           &xx, &xy, &xz, &xw,
278
                           &yx, &yy, &yz, &yw,
279
                           &zx, &zy, &zz, &zw,
280
                           &wx, &wy, &wz, &ww);
281
   fail_if (!EINA_DBL_EQ(xx, 4) ||
282
            !EINA_DBL_EQ(xw, xx) ||
283
            !EINA_DBL_EQ(yy, xw) ||
284
            !EINA_DBL_EQ(yz, yy) ||
285
            !EINA_DBL_EQ(zy, yz) ||
286
            !EINA_DBL_EQ(zz, yy) ||
287
            !EINA_DBL_EQ(wx, xx) ||
288
            !EINA_DBL_EQ(ww, zy));
289

290
   eina_matrix4_array_set(&m1, arr);
291
   eina_matrix4_values_get(&m1,
292
                           &xx, &xy, &xz, &xw,
293
                           &yx, &yy, &yz, &yw,
294
                           &zx, &zy, &zz, &zw,
295
                           &wx, &wy, &wz, &ww);
296
   fail_if (!EINA_DBL_EQ(xx, 1) ||
297
            !EINA_DBL_EQ(xw, xx) ||
298
            !EINA_DBL_EQ(yy, xw) ||
299
            !EINA_DBL_EQ(yz, yy) ||
300
            !EINA_DBL_EQ(zy, yz) ||
301
            !EINA_DBL_EQ(zz, yy) ||
302
            !EINA_DBL_EQ(wx, xx) ||
303
            !EINA_DBL_EQ(ww, zy));
304

305
   eina_matrix4_copy(&m, &m1);
306
   eina_matrix4_values_get(&m1,
307
                           &xx, &xy, &xz, &xw,
308
                           &yx, &yy, &yz, &yw,
309
                           &zx, &zy, &zz, &zw,
310
                           &wx, &wy, &wz, &ww);
311
   fail_if (!EINA_DBL_EQ(xx, 1) ||
312
            !EINA_DBL_EQ(xw, xx) ||
313
            !EINA_DBL_EQ(yy, xw) ||
314
            !EINA_DBL_EQ(yz, yy) ||
315
            !EINA_DBL_EQ(zy, yz) ||
316
            !EINA_DBL_EQ(zz, yy) ||
317
            !EINA_DBL_EQ(wx, xx) ||
318
            !EINA_DBL_EQ(ww, zy));
319

320
   eina_matrix4_ortho_set(&m, l, r, b, t, dn, df);
321
   eina_matrix4_values_get(&m,
322
                           &xx, &xy, &xz, &xw,
323
                           &yx, &yy, &yz, &yw,
324
                           &zx, &zy, &zz, &zw,
325
                           &wx, &wy, &wz, &ww);
326
   fail_if (!EINA_DBL_EQ(xx, -2) ||
327
            !EINA_DBL_EQ(yy, -2) ||
328
            !EINA_DBL_EQ(zz, 2) ||
329
            !EINA_DBL_EQ(wx, 9) ||
330
            !EINA_DBL_EQ(wy, 7) ||
331
            !EINA_DBL_EQ(wz, 5) ||
332
            !EINA_DBL_EQ(ww, 1));
333

334

335
   eina_matrix4_identity(&m);
336

337
   eina_matrix4_scale(&m, 5, 5, 5);
338
   eina_matrix4_values_get(&m,
339
                           &xx, &xy, &xz, &xw,
340
                           &yx, &yy, &yz, &yw,
341
                           &zx, &zy, &zz, &zw,
342
                           &wx, &wy, &wz, &ww);
343

344
   fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
345
                        yx, yy, yz, yw,
346
                        zx, zy, zz, zw,
347
                        wx, wy, wz, ww,
348
                        5, 0, 0, 0,
349
                        0, 5, 0, 0,
350
                        0, 0, 5, 0,
351
                        0, 0, 0, 1));
352

353
   eina_matrix4_translate(&m, 5, 5, 5);
354
   eina_matrix4_values_get(&m,
355
                           &xx, &xy, &xz, &xw,
356
                           &yx, &yy, &yz, &yw,
357
                           &zx, &zy, &zz, &zw,
358
                           &wx, &wy, &wz, &ww);
359
   fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
360
                        yx, yy, yz, yw,
361
                        zx, zy, zz, zw,
362
                        wx, wy, wz, ww,
363
                        5, 0, 0, 5,
364
                        0, 5, 0, 5,
365
                        0, 0, 5, 5,
366
                        0, 0, 0, 1));
367

368
   eina_matrix4_identity(&m);
369
   eina_matrix4_rotate(&m, rotate_radian, EINA_MATRIX_AXIS_X);
370
   eina_matrix4_values_get(&m,
371
                           &xx, &xy, &xz, &xw,
372
                           &yx, &yy, &yz, &yw,
373
                           &zx, &zy, &zz, &zw,
374
                           &wx, &wy, &wz, &ww);
375
   fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
376
                        yx, yy, yz, yw,
377
                        zx, zy, zz, zw,
378
                        wx, wy, wz, ww,
379
                        1, 0, 0, 0,
380
                        0, cos(rotate_radian), -sin(rotate_radian), 0,
381
                        0, sin(rotate_radian), cos(rotate_radian), 0,
382
                        0, 0, 0, 1));
383

384
   eina_matrix4_identity(&m);
385
   eina_matrix4_rotate(&m, rotate_radian, EINA_MATRIX_AXIS_Y);
386
   eina_matrix4_values_get(&m,
387
                           &xx, &xy, &xz, &xw,
388
                           &yx, &yy, &yz, &yw,
389
                           &zx, &zy, &zz, &zw,
390
                           &wx, &wy, &wz, &ww);
391
   fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
392
                        yx, yy, yz, yw,
393
                        zx, zy, zz, zw,
394
                        wx, wy, wz, ww,
395
                        cos(rotate_radian), 0, sin(rotate_radian), 0,
396
                        0, 1, 0, 0,
397
                        -sin(rotate_radian), 0, cos(rotate_radian), 0,
398
                        0, 0, 0, 1));
399

400
   eina_matrix4_identity(&m);
401
   eina_matrix4_rotate(&m, rotate_radian, EINA_MATRIX_AXIS_Z);
402
   eina_matrix4_values_get(&m,
403
                           &xx, &xy, &xz, &xw,
404
                           &yx, &yy, &yz, &yw,
405
                           &zx, &zy, &zz, &zw,
406
                           &wx, &wy, &wz, &ww);
407
   fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
408
                        yx, yy, yz, yw,
409
                        zx, zy, zz, zw,
410
                        wx, wy, wz, ww,
411
                        cos(rotate_radian), -sin(rotate_radian), 0, 0,
412
                        sin(rotate_radian), cos(rotate_radian), 0, 0,
413
                        0, 0, 1, 0,
414
                        0, 0, 0, 1));
415

416

417
   eina_matrix4_identity(&m1);
418
   eina_matrix4_values_set(&m2,
419
                            1,  2,  3,  4,
420
                            5,  6,  7,  8,
421
                            9, 10, 11, 12,
422
                           13, 14, 15, 16);
423
   eina_matrix4_compose(&m1, &m2, &m);
424
   eina_matrix4_values_get(&m,
425
                           &xx, &xy, &xz, &xw,
426
                           &yx, &yy, &yz, &yw,
427
                           &zx, &zy, &zz, &zw,
428
                           &wx, &wy, &wz, &ww);
429
   fail_if(!MATRIX4_CMP(xx, xy, xz, xw,
430
                        yx, yy, yz, yw,
431
                        zx, zy, zz, zw,
432
                        wx, wy, wz, ww,
433
                         1,  2,  3,  4,
434
                         5,  6,  7,  8,
435
                         9, 10, 11, 12,
436
                        13, 14, 15, 16));
437
}
438
EFL_END_TEST
439

440
EFL_START_TEST(eina_matrix4_2_3)
441
{
442
   Eina_Matrix4 m4;
443
   Eina_Matrix3 m3, m3b;
444

445

446
   eina_matrix3_values_set(&m3,
447
                           1, 3, 2,
448
                           3, 1, 4,
449
                           2, 4, 1);
450

451
   eina_matrix3_matrix4_to(&m4, &m3);
452
   eina_matrix4_matrix3_to(&m3b, &m4);
453

454
   fail_if(memcmp(&m3, &m3b, sizeof (Eina_Matrix3)) != 0);
455

456
}
457
EFL_END_TEST
458

459
EFL_START_TEST(eina_matrix3)
460
{
461
   Eina_Bool ret;
462
   Eina_Matrix3 m, m1, m2;
463
   double xx, xy, xz,
464
          yx, yy, yz,
465
          zx, zy, zz;
466

467

468
   eina_matrix3_values_set(&m,
469
                           1, 0, 0,
470
                           0, 1, 0,
471
                           0, 0, 1);
472

473
   eina_matrix3_values_set(&m1,
474
                           1, 0, 0,
475
                           0, 1, 0,
476
                           0, 0, 1);
477

478
   eina_matrix3_values_set(&m2,
479
                           1, 1, 1,
480
                           0, 1, 0,
481
                           0, 0, 1);
482
   fail_if(eina_matrix3_type_get(&m) != EINA_MATRIX_TYPE_IDENTITY);
483

484
   eina_matrix3_values_get(&m,
485
                           &xx, &xy, &xz,
486
                           &yx, &yy, &yz,
487
                           &zx, &zy, &zz);
488

489
   fail_if(!EINA_DBL_EQ(xx, yy) ||
490
           !EINA_DBL_EQ(yy, zz) ||
491
           !EINA_DBL_EQ(zz, 1));
492

493
   fail_if(!EINA_DBL_EQ(xy, xz) ||
494
           !EINA_DBL_EQ(yx, yz) ||
495
           !EINA_DBL_EQ(zx, zy) ||
496
           !EINA_DBL_EQ(zy, 0));
497

498
   ret = eina_matrix3_equal(&m, &m1);
499
   fail_if(ret != EINA_TRUE);
500

501
   ret = eina_matrix3_equal(&m1, &m2);
502
   fail_if(ret != EINA_FALSE);
503

504
}
505
EFL_END_TEST
506

507
#define MATRIX3_CMP(XX, XY, XZ, YX, YY, YZ, ZX, ZY, ZZ, AXX, AXY, AXZ, AYX, AYY, AYZ, AZX, AZY, AZZ) \
508
  (EINA_DBL_EQ(XX, AXX) && \
509
   EINA_DBL_EQ(XY, AXY) && \
510
   EINA_DBL_EQ(XZ, AXZ) && \
511
   EINA_DBL_EQ(YX, AYX) && \
512
   EINA_DBL_EQ(YY, AYY) && \
513
   EINA_DBL_EQ(YZ, AYZ) && \
514
   EINA_DBL_EQ(ZX, AZX) && \
515
   EINA_DBL_EQ(ZY, AZY) && \
516
   EINA_DBL_EQ(ZZ, AZZ))
517

518
EFL_START_TEST(eina_matrix3_operations)
519
{
520
   Eina_Matrix3 m1, m2, m3;
521
   double xx, xy, xz,
522
          yx, yy, yz,
523
          zx, zy, zz;
524
   double tx = 20, ty = 30, ret;
525
   const double arr[] = {1, 1, 1, 1, 1, 1, 1, 1, 1};
526
   double rotate_radian = 45.0 * M_PI / 180.0;
527

528
   eina_matrix3_values_set(&m1,
529
                           1, 0, 0,
530
                           0, 1, 0,
531
                           0, 0, 1);
532

533
   eina_matrix3_values_set(&m2,
534
                           1, 1, 1,
535
                           1, 1, 1,
536
                           1, 1, 1);
537

538

539
   eina_matrix3_compose(&m1, &m2, &m3);
540
   eina_matrix3_values_get(&m3,
541
                           &xx, &xy, &xz,
542
                           &yx, &yy, &yz,
543
                           &zx, &zy, &zz);
544
   fail_if (!EINA_DBL_EQ(xx, xy) ||
545
            !EINA_DBL_EQ(xy, xz) ||
546
            !EINA_DBL_EQ(yx, yy) ||
547
            !EINA_DBL_EQ(yy, yz) ||
548
            !EINA_DBL_EQ(zx, zy) ||
549
            !EINA_DBL_EQ(zy, zz) ||
550
            !EINA_DBL_EQ(zz, 1));
551

552
   eina_matrix3_translate(&m1, tx, ty);
553
   eina_matrix3_values_get(&m1,
554
                           &xx, &xy, &xz,
555
                           &yx, &yy, &yz,
556
                           &zx, &zy, &zz);
557
   fail_if(!MATRIX3_CMP(xx, xy, xz,
558
                        yx, yy, yz,
559
                        zx, zy, zz,
560
                        1, 0, tx,
561
                        0, 1, ty,
562
                        0, 0, 1));
563

564
   eina_matrix3_values_set(&m1,
565
                           1, 0, 0,
566
                           0, 1, 0,
567
                           0, 0, 1);
568

569
   eina_matrix3_scale(&m1, tx, ty);
570
   eina_matrix3_values_get(&m1,
571
                           &xx, &xy, &xz,
572
                           &yx, &yy, &yz,
573
                           &zx, &zy, &zz);
574
   fail_if(!MATRIX3_CMP(xx, xy, xz,
575
                       yx, yy, yz,
576
                       zx, zy, zz,
577
                       tx, 0, 0,
578
                       0, ty, 0,
579
                       0, 0, 1));
580

581
   eina_matrix3_values_set(&m1,
582
                           1, 0, 0,
583
                           0, 1, 0,
584
                           0, 0, 1);
585
   eina_matrix3_rotate(&m1, rotate_radian);
586
   fail_if (!MATRIX3_CMP(m1.xx, m1.xy, m1.xz,
587
                         m1.yx, m1.yy, m1.yz,
588
                         m1.zx, m1.zy, m1.zz,
589
                         cos(rotate_radian), -sin(rotate_radian), 0,
590
                         sin(rotate_radian),  cos(rotate_radian), 0,
591
                         0, 0, 1));
592

593
   eina_matrix3_values_set(&m1,
594
                           1, 1, 1,
595
                           1, 1, 1,
596
                           1, 1, 1);
597
   eina_matrix3_identity(&m1);
598
   eina_matrix3_values_get(&m1,
599
                           &xx, &xy, &xz,
600
                           &yx, &yy, &yz,
601
                           &zx, &zy, &zz);
602
   fail_if(!EINA_DBL_EQ(xx, yy) ||
603
           !EINA_DBL_EQ(yy, zz) ||
604
           !EINA_DBL_EQ(zz, 1));
605

606
   fail_if(!EINA_DBL_EQ(xy, xz) ||
607
           !EINA_DBL_EQ(yx, yz) ||
608
           !EINA_DBL_EQ(zx, zy) ||
609
           !EINA_DBL_EQ(zy, 0));
610

611
   eina_matrix3_values_set(&m1,
612
                           1, 2, 1,
613
                           2, 1, 1,
614
                           1, 2, 2);
615
   ret = eina_matrix3_determinant(&m1);
616
   fail_if(!EINA_DBL_EQ(ret, -3));
617

618
   eina_matrix3_values_set(&m1,
619
                           3, 3, 3,
620
                           3, 3, 3,
621
                           3, 3, 3);
622
   eina_matrix3_divide(&m1, 2);
623
   eina_matrix3_values_get(&m1,
624
                           &xx, &xy, &xz,
625
                           &yx, &yy, &yz,
626
                           &zx, &zy, &zz);
627
   fail_if (!EINA_DBL_EQ(xx, xy) ||
628
            !EINA_DBL_EQ(xy, xz) ||
629
            !EINA_DBL_EQ(yx, yy) ||
630
            !EINA_DBL_EQ(yy, yz) ||
631
            !EINA_DBL_EQ(zx, zy) ||
632
            !EINA_DBL_EQ(zy, zz) ||
633
            !EINA_DBL_EQ(zz, 1.5));
634

635
   eina_matrix3_values_set(&m1,
636
                           0, 2, 0,
637
                           2, 2, 0,
638
                           2, 1, 2);
639
   eina_matrix3_inverse(&m1, &m2);
640
   eina_matrix3_values_get(&m2,
641
                           &xx, &xy, &xz,
642
                           &yx, &yy, &yz,
643
                           &zx, &zy, &zz);
644
   fail_if(!MATRIX3_CMP(xx, xy, xz,
645
                        yx, yy, yz,
646
                        zx, zy, zz,
647
                        -0.5, 0.5, 0.0,
648
                        0.5, 0.0, 0.0,
649
                        0.25, -0.5, 0.5));
650

651
   eina_matrix3_values_set(&m1,
652
                           1, 2, 3,
653
                           4, 5, 6,
654
                           7, 8, 9);
655
   eina_matrix3_transpose(&m1, &m2);
656
   eina_matrix3_values_get(&m2,
657
                           &xx, &xy, &xz,
658
                           &yx, &yy, &yz,
659
                           &zx, &zy, &zz);
660
   fail_if(!MATRIX3_CMP(xx, xy, xz,
661
                        yx, yy, yz,
662
                        zx, zy, zz,
663
                        1, 4, 7,
664
                        2, 5, 8,
665
                        3, 6, 9));
666

667
   eina_matrix3_values_set(&m1,
668
                           1, 2, 3,
669
                           0, 4, 5,
670
                           1, 0, 6);
671
   eina_matrix3_cofactor(&m1, &m2);
672
   eina_matrix3_values_get(&m2,
673
                           &xx, &xy, &xz,
674
                           &yx, &yy, &yz,
675
                           &zx, &zy, &zz);
676
   fail_if(!MATRIX3_CMP(xx, xy, xz,
677
                        yx, yy, yz,
678
                        zx, zy, zz,
679
                        24, 5, -4,
680
                        -12, 3, 2,
681
                        -2, -5, 4));
682

683
   eina_matrix3_adjoint(&m1, &m2);
684
   eina_matrix3_values_get(&m2,
685
                           &xx, &xy, &xz,
686
                           &yx, &yy, &yz,
687
                           &zx, &zy, &zz);
688
   fail_if(!MATRIX3_CMP(xx, xy, xz,
689
                        yx, yy, yz,
690
                        zx, zy, zz,
691
                        24, -12, -2,
692
                        5, 3, -5,
693
                        -4, 2, 4));
694

695
   eina_matrix3_values_set(&m2,
696
                           2, 2, 2,
697
                           1, 1, 1,
698
                           3, 3, 3);
699
   eina_matrix3_values_set(&m3,
700
                           3, 3, 3,
701
                           2, 2, 2,
702
                           1, 1, 1);
703
   eina_matrix3_multiply_copy(&m1, &m2, &m3);
704
   eina_matrix3_values_get(&m1,
705
                           &xx, &xy, &xz,
706
                           &yx, &yy, &yz,
707
                           &zx, &zy, &zz);
708
   fail_if(!MATRIX3_CMP(xx, xy, xz,
709
                        yx, yy, yz,
710
                        zx, zy, zz,
711
                        12, 12, 12,
712
                        6, 6, 6,
713
                        18, 18, 18));
714

715
   eina_matrix3_values_set(&m2,
716
                           2, 2, 2,
717
                           1, 1, 1,
718
                           0, 0, 0);
719
   eina_matrix3_multiply(&m1, &m2, &m3);
720
   eina_matrix3_values_get(&m1,
721
                           &xx, &xy, &xz,
722
                           &yx, &yy, &yz,
723
                           &zx, &zy, &zz);
724
   fail_if(!MATRIX3_CMP(xx, xy, xz,
725
                        yx, yy, yz,
726
                        zx, zy, zz,
727
                        12, 12, 12,
728
                        6, 6, 6,
729
                        0, 0, 0));
730

731
   eina_matrix3_copy(&m1, &m2);
732
   eina_matrix3_values_get(&m1,
733
                           &xx, &xy, &xz,
734
                           &yx, &yy, &yz,
735
                           &zx, &zy, &zz);
736
   fail_if(!MATRIX3_CMP(xx, xy, xz,
737
                        yx, yy, yz,
738
                        zx, zy, zz,
739
                        2, 2, 2,
740
                        1, 1, 1,
741
                        0, 0, 0));
742

743
   eina_matrix3_array_set(&m1, arr);
744
   eina_matrix3_values_get(&m1,
745
                           &xx, &xy, &xz,
746
                           &yx, &yy, &yz,
747
                           &zx, &zy, &zz);
748
   fail_if(!MATRIX3_CMP(xx, xy, xz,
749
                        yx, yy, yz,
750
                        zx, zy, zz,
751
                        1, 1, 1,
752
                        1, 1, 1,
753
                        1, 1, 1));
754

755
   eina_matrix3_position_transform_set(&m3, 5, 3);
756
   eina_matrix3_values_get(&m3,
757
                           &xx, &xy, &xz,
758
                           &yx, &yy, &yz,
759
                           &zx, &zy, &zz);
760
   fail_if (!EINA_DBL_EQ(xz, 5) ||
761
            !EINA_DBL_EQ(yz, 3));
762

763
   eina_matrix3_scale_transform_set(&m2, 6, 7);
764
   eina_matrix3_values_get(&m2,
765
                           &xx, &xy, &xz,
766
                           &yx, &yy, &yz,
767
                           &zx, &zy, &zz);
768
   fail_if (!EINA_DBL_EQ(xx, 6) ||
769
            !EINA_DBL_EQ(yy, 7));
770
}
771
EFL_END_TEST
772

773
EFL_START_TEST(eina_matrix3_f16p16)
774
{
775
   Eina_Matrix3_F16p16 m1;
776
   Eina_Matrix3 m2;
777
   Eina_F16p16 xx, xy, xz,
778
               yx, yy, yz,
779
               zx, zy, zz;
780
   Eina_Matrix3_F16p16 m3;
781

782

783
   eina_matrix3_values_set(&m2,
784
                           1, 0, 0,
785
                           0, 1, 0,
786
                           0, 0, 1);
787
   eina_matrix3_matrix3_f16p16_to(&m2, &m1);
788
   fail_if (eina_matrix3_f16p16_type_get(&m1) != EINA_MATRIX_TYPE_IDENTITY);
789

790
   eina_matrix3_fixed_values_get(&m2,
791
                                 &xx, &xy, &xz,
792
                                 &yx, &yy, &yz,
793
                                 &zx, &zy, &zz);
794
   fail_if(xx != yy ||
795
           yy != zz ||
796
           zz != 65536);
797

798
   fail_if(xy != xz ||
799
           yx != yz ||
800
           zx != zy ||
801
           zy != 0);
802

803
   eina_matrix3_values_set(&m2,
804
                           1, 2, 3,
805
                           4, 5, 6,
806
                           7, 8, 9);
807
   eina_matrix3_matrix3_f16p16_to(&m2, &m1);
808
   eina_matrix3_f16p16_identity(&m1);
809
   fail_if(m1.xx != m1.yy ||
810
           m1.yy != m1.zz ||
811
           m1.zz != 65536);
812

813
   fail_if(m1.xy != m1.xz ||
814
           m1.yx != m1.yz ||
815
           m1.zx != m1.zy ||
816
           m1.zy != 0);
817

818
   eina_matrix3_values_set(&m2,
819
                           1, 1, 1,
820
                           1, 1, 1,
821
                           1, 1, 1);
822
   eina_matrix3_matrix3_f16p16_to(&m2, &m1);
823
   eina_matrix3_f16p16_compose(&m1, &m1, &m3);
824
   fail_if (m3.xx != m3.xy ||
825
            m3.xy != m3.xz ||
826
            m3.yx != m3.yy ||
827
            m3.yy != m3.yz ||
828
            m3.zx != m3.zy ||
829
            m3.zy != m3.zz ||
830
            m3.zz != 196608);
831

832
}
833
EFL_END_TEST
834

835
EFL_START_TEST(eina_matrix3_map_transform)
836
{
837
   double x = 2, y = 3, x1, y1;
838
   Eina_Matrix3 m;
839
   Eina_Rectangle r;
840
   Eina_Quad q;
841
   Eina_Bool ret;
842

843

844
   eina_matrix3_values_set(&m,
845
                           0, 1, 0,
846
                           1, 0, 0,
847
                           0, 0, 1);
848

849
   eina_matrix3_point_transform(&m,
850
                                x, y,
851
                                &x1, &y1);
852
   fail_if(!EINA_DBL_EQ(x1, 3) ||
853
           !EINA_DBL_EQ(y1, 2));
854

855
   EINA_RECTANGLE_SET(&r, 0, 0, 3, 4);
856
   eina_matrix3_rectangle_transform(&m, &r, &q);
857

858
   fail_if(!EINA_DBL_EQ(q.x0, 0) ||
859
           !EINA_DBL_EQ(q.y0, 0) ||
860
           !EINA_DBL_EQ(q.x1, 0) ||
861
           !EINA_DBL_EQ(q.y1, 3) ||
862
           !EINA_DBL_EQ(q.x2, 4) ||
863
           !EINA_DBL_EQ(q.y2, 3) ||
864
           !EINA_DBL_EQ(q.x3, 4) ||
865
           !EINA_DBL_EQ(q.y3, 0));
866

867
   eina_quad_coords_set(&q,
868
                        0.0, 0.0,
869
                        3.0, 0.0,
870
                        3.0, 3.0,
871
                        0.0, 3.0);
872
   ret = eina_matrix3_square_quad_map(&m, &q);
873
   fail_if(ret != EINA_TRUE);
874

875
   fail_if(!MATRIX3_CMP(m.xx, m.xy, m.xz,
876
                        m.yx, m.yy, m.yz,
877
                        m.zx, m.zy, m.zz,
878
                        3, 0, 0,
879
                        0, 3, 0,
880
                        0, 0, 1));
881

882
   ret = eina_matrix3_quad_square_map(&m, &q);
883
   fail_if(ret != EINA_TRUE);
884

885
   fail_if(!EINA_DBL_EQ(q.x0, 0) ||
886
           !EINA_DBL_EQ(q.y0, 0) ||
887
           !EINA_DBL_EQ(q.x1, 3) ||
888
           !EINA_DBL_EQ(q.y1, 0) ||
889
           !EINA_DBL_EQ(q.x2, 3) ||
890
           !EINA_DBL_EQ(q.y2, 3) ||
891
           !EINA_DBL_EQ(q.x3, 0) ||
892
           !EINA_DBL_EQ(q.y3, 3));
893

894
}
895
EFL_END_TEST
896

897
EFL_START_TEST(eina_normal3_test)
898
{
899
   Eina_Matrix3 out;
900
   Eina_Matrix4 m;
901
   double xx, xy, xz,
902
          yx, yy, yz,
903
          zx, zy, zz;
904

905
   eina_matrix4_values_set(&m,
906
                           1, 0, 0, 0,
907
                           0, 1, 0, 0,
908
                           0, 0, 1, 0,
909
                           0, 0, 0, 1);
910
   eina_normal3_matrix_get(&out, &m);
911
   eina_matrix3_values_get(&out,
912
                           &xx, &xy, &xz,
913
                           &yx, &yy, &yz,
914
                           &zx, &zy, &zz
915
                           );
916

917
   fail_if((fabs(xy) - 1.0) > DBL_EPSILON ||
918
           (fabs(yx) - 1.0) > DBL_EPSILON ||
919
           (fabs(yz) - 1.0) > DBL_EPSILON ||
920
           (fabs(zy) - 1.0) > DBL_EPSILON
921
          );
922

923
   eina_matrix4_values_set(&m,
924
                           0, 0, 0, 0,
925
                           0, 1, 0, 0,
926
                           0, 0, 0, 0,
927
                           0, 0, 0, 1);
928
   eina_normal3_matrix_get(&out, &m);
929
   eina_matrix3_values_get(&out,
930
                           &xx, &xy, &xz,
931
                           &yx, &yy, &yz,
932
                           &zx, &zy, &zz
933
                           );
934
   fail_if((fabs(xy)) > DBL_EPSILON ||
935
           (fabs(yx)) > DBL_EPSILON ||
936
           (fabs(yz)) > DBL_EPSILON ||
937
           (fabs(zy)) > DBL_EPSILON
938
          );
939
}
940
EFL_END_TEST
941

942
void
943
eina_test_matrix(TCase *tc)
944
{
945
   tcase_add_test(tc, eina_matrix2);
946
   tcase_add_test(tc, eina_matrix2_operation);
947
   tcase_add_test(tc, eina_matrix4);
948
   tcase_add_test(tc, eina_matrix4_operation);
949
   tcase_add_test(tc, eina_matrix4_2_3);
950
   tcase_add_test(tc, eina_matrix3);
951
   tcase_add_test(tc, eina_matrix3_operations);
952
   tcase_add_test(tc, eina_matrix3_f16p16);
953
   tcase_add_test(tc, eina_matrix3_map_transform);
954
   tcase_add_test(tc, eina_normal3_test);
955
}
956

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.