summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpacien2017-12-22 01:53:55 +0100
committerpacien2017-12-22 01:55:25 +0100
commita767c658cb603de9ec9f0577627b9b32cbf82b2b (patch)
tree084b023cf34a60e4cbbc79053723bf23c96fa678 /src
parent7af561eccb7b4210e4e8233d53876b7af5607234 (diff)
downloadmorpher-a767c658cb603de9ec9f0577627b9b32cbf82b2b.tar.gz
Simplify and add geom. and matrix utility functions
Signed-off-by: pacien <pacien.trangirard@pacien.net>
Diffstat (limited to 'src')
-rw-r--r--src/common/geom.c19
-rw-r--r--src/common/matrix.c63
-rw-r--r--src/morpher/matrix.c16
3 files changed, 35 insertions, 63 deletions
diff --git a/src/common/geom.c b/src/common/geom.c
index 7abb422..219270f 100644
--- a/src/common/geom.c
+++ b/src/common/geom.c
@@ -1,5 +1,24 @@
1#include "common/geom.h" 1#include "common/geom.h"
2#include "morpher/matrix.h"
3
4CartesianMapping m(int x, int y) {
5 return (CartesianMapping) {{x, y},
6 {x, y}};
7}
8
9CartesianVector v(int x, int y) {
10 return (CartesianVector) {x, y};
11}
12
13bool mappings_equals(CartesianMapping m1, CartesianMapping m2) {
14 return vector_equals(m1.origin, m2.origin) && vector_equals(m1.target, m2.target);
15}
2 16
3bool vector_equals(CartesianVector v1, CartesianVector v2) { 17bool vector_equals(CartesianVector v1, CartesianVector v2) {
4 return v1.x == v2.x && v1.y == v2.y; 18 return v1.x == v2.x && v1.y == v2.y;
5} 19}
20
21IntVector triangle_area(CartesianVector v1, CartesianVector v2, CartesianVector v3) {
22 return matrix_int_det2(v1.x - v3.x, v2.x - v3.x,
23 v1.y - v3.y, v2.y - v3.y);
24}
diff --git a/src/common/matrix.c b/src/common/matrix.c
deleted file mode 100644
index 60f9afb..0000000
--- a/src/common/matrix.c
+++ /dev/null
@@ -1,63 +0,0 @@
1#include "common/matrix.h"
2#include <assert.h>
3#include <memory.h>
4#include <stdlib.h>
5#include "common/mem.h"
6
7static inline IntSquareMatrix *matrix_without_row(IntSquareMatrix *target, IntSquareMatrix *origin,
8 IntVector omitted_row) {
9 int origin_row, target_row;
10
11 for (origin_row = 0, target_row = 0; origin_row < origin->dim; ++origin_row)
12 if (origin_row != omitted_row)
13 target->elements[target_row++] = origin->elements[origin_row];
14
15 return target;
16}
17
18static inline IntVector det_dev_sign(IntVector row, IntVector col) {
19 assert(row > 0 && col > 0);
20 return ((row + col) % 2 == 0) ? 1 : -1;
21}
22
23static inline IntVector det_reduce(IntSquareMatrix *matrix) {
24 IntSquareMatrix sub_matrix;
25 int row;
26 IntVector det = 0;
27
28 assert(matrix->dim > 2);
29
30 sub_matrix.dim = matrix->dim - 1;
31 sub_matrix.elements = malloc_or_die(sub_matrix.dim * sizeof(IntVector *));
32
33 for (row = 0; row < matrix->dim; ++row)
34 det += matrix->elements[row][matrix->dim - 1]
35 * det_dev_sign(row + 1, matrix->dim)
36 * matrix_int_det(matrix_without_row(&sub_matrix, matrix, row));
37
38
39 free(sub_matrix.elements);
40 return det;
41}
42
43IntVector matrix_int_det(IntSquareMatrix *matrix) {
44 assert(matrix->dim > 0);
45 switch (matrix->dim) {
46 case 1:
47 return matrix->elements[0][0];
48
49 case 2:
50 return matrix->elements[0][0] * matrix->elements[1][1] - matrix->elements[0][1] * matrix->elements[1][0];
51
52 default:
53 return det_reduce(matrix);
54 }
55}
56
57void matrix_reshape(IntVector **bi_dim, IntVector *flat, int width, int height) {
58 int row;
59 assert(width > 0 && height > 0);
60
61 for (row = 0; row < height; ++row)
62 bi_dim[row] = flat + row * width;
63}
diff --git a/src/morpher/matrix.c b/src/morpher/matrix.c
new file mode 100644
index 0000000..2fe1193
--- /dev/null
+++ b/src/morpher/matrix.c
@@ -0,0 +1,16 @@
1#include "morpher/matrix.h"
2
3IntVector matrix_int_det2(IntVector u11, IntVector u12,
4 IntVector u21, IntVector u22) {
5
6 return u11 * u22 - u12 * u21;
7}
8
9IntVector matrix_int_det3(IntVector u11, IntVector u12, IntVector u13,
10 IntVector u21, IntVector u22, IntVector u23,
11 IntVector u31, IntVector u32, IntVector u33) {
12
13 return u11 * matrix_int_det2(u22, u23, u32, u33)
14 - u21 * matrix_int_det2(u12, u13, u32, u33)
15 + u31 * matrix_int_det2(u12, u13, u22, u23);
16}