diff options
author | pacien | 2017-12-24 00:07:53 +0100 |
---|---|---|
committer | pacien | 2017-12-24 00:07:53 +0100 |
commit | cdbae7a5e7515ba50ae21f15929a086fc40fcae3 (patch) | |
tree | 492c7451e559beb35b0680cd474adaa5a0d8f0d0 /src | |
parent | 39cbe5d0d7db78f0d2808abea5562db84d03a07e (diff) | |
download | morpher-cdbae7a5e7515ba50ae21f15929a086fc40fcae3.tar.gz |
Implement Delaunay propagation
Signed-off-by: pacien <pacien.trangirard@pacien.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/morpher/quadrilateral.c | 17 | ||||
-rw-r--r-- | src/morpher/trianglemap.c | 7 |
2 files changed, 21 insertions, 3 deletions
diff --git a/src/morpher/quadrilateral.c b/src/morpher/quadrilateral.c index 9671116..af77f0f 100644 --- a/src/morpher/quadrilateral.c +++ b/src/morpher/quadrilateral.c | |||
@@ -1,5 +1,6 @@ | |||
1 | #include "morpher/quadrilateral.h" | 1 | #include "morpher/quadrilateral.h" |
2 | #include "common/geom.h" | 2 | #include <stdlib.h> |
3 | #include <assert.h> | ||
3 | #include "morpher/matrix.h" | 4 | #include "morpher/matrix.h" |
4 | 5 | ||
5 | static inline IntVector p2(IntVector n) { | 6 | static inline IntVector p2(IntVector n) { |
@@ -47,12 +48,24 @@ static inline void rotate_neighbors(TriangleMap *t1, TriangleMap *t2, int e1, in | |||
47 | } | 48 | } |
48 | 49 | ||
49 | void quadrilateral_flip_diagonal(TriangleMap *t1, TriangleMap *t2) { | 50 | void quadrilateral_flip_diagonal(TriangleMap *t1, TriangleMap *t2) { |
50 | int e1 = trianglemap_find_common_edge(t1, t2), e2 = trianglemap_find_common_edge(t2, t1); | 51 | int e1, e2; |
52 | assert(t1 != NULL && t2 != NULL); | ||
53 | e1 = trianglemap_find_common_edge(t1, t2); | ||
54 | e2 = trianglemap_find_common_edge(t2, t1); | ||
51 | rotate_vertices(t1, t2, e1, e2); | 55 | rotate_vertices(t1, t2, e1, e2); |
52 | rotate_neighbors(t1, t2, e1, e2); | 56 | rotate_neighbors(t1, t2, e1, e2); |
53 | } | 57 | } |
54 | 58 | ||
55 | bool quadrilateral_is_delaunay(TriangleMap *t1, TriangleMap *t2) { | 59 | bool quadrilateral_is_delaunay(TriangleMap *t1, TriangleMap *t2) { |
60 | assert(t1 != NULL && t2 != NULL); | ||
56 | return not_in_circumcircle(t1, t2->vertices[(trianglemap_find_common_edge(t2, t1) + 2) % 3].origin) && | 61 | return not_in_circumcircle(t1, t2->vertices[(trianglemap_find_common_edge(t2, t1) + 2) % 3].origin) && |
57 | not_in_circumcircle(t2, t1->vertices[(trianglemap_find_common_edge(t1, t2) + 2) % 3].origin); | 62 | not_in_circumcircle(t2, t1->vertices[(trianglemap_find_common_edge(t1, t2) + 2) % 3].origin); |
58 | } | 63 | } |
64 | |||
65 | void quadrilateral_propagate_delaunay(TriangleMap *start, TriangleMap *neighbor) { | ||
66 | assert(start != NULL && neighbor != NULL); | ||
67 | if (!quadrilateral_is_delaunay(start, neighbor)) { | ||
68 | quadrilateral_flip_diagonal(start, neighbor); | ||
69 | trianglemap_foreach_neighbor(neighbor, quadrilateral_propagate_delaunay); | ||
70 | } | ||
71 | } | ||
diff --git a/src/morpher/trianglemap.c b/src/morpher/trianglemap.c index 45f4ade..01b66c9 100644 --- a/src/morpher/trianglemap.c +++ b/src/morpher/trianglemap.c | |||
@@ -1,7 +1,6 @@ | |||
1 | #include "morpher/trianglemap.h" | 1 | #include "morpher/trianglemap.h" |
2 | #include <stdlib.h> | 2 | #include <stdlib.h> |
3 | #include <assert.h> | 3 | #include <assert.h> |
4 | #include "common/geom.h" | ||
5 | #include "common/mem.h" | 4 | #include "common/mem.h" |
6 | 5 | ||
7 | TriangleMap *trianglemap_create(CartesianMapping v1, CartesianMapping v2, CartesianMapping v3) { | 6 | TriangleMap *trianglemap_create(CartesianMapping v1, CartesianMapping v2, CartesianMapping v3) { |
@@ -46,6 +45,12 @@ void trianglemap_replace_neighbor(TriangleMap *t, TriangleMap *old, TriangleMap | |||
46 | if (t != NULL) t->neighbors[trianglemap_find_common_edge(t, old)] = new; | 45 | if (t != NULL) t->neighbors[trianglemap_find_common_edge(t, old)] = new; |
47 | } | 46 | } |
48 | 47 | ||
48 | void trianglemap_foreach_neighbor(TriangleMap *t, void (*f)(TriangleMap *, TriangleMap *)) { | ||
49 | int cursor; | ||
50 | assert(t != NULL); | ||
51 | for (cursor = 0; cursor < 3; ++cursor) if (t->neighbors[cursor] != NULL) f(t, t->neighbors[cursor]); | ||
52 | } | ||
53 | |||
49 | TriangleMap *trianglemap_split(TriangleMap *t, CartesianMapping v) { | 54 | TriangleMap *trianglemap_split(TriangleMap *t, CartesianMapping v) { |
50 | assert(trianglemap_to(t, v.origin) == t); | 55 | assert(trianglemap_to(t, v.origin) == t); |
51 | 56 | ||