diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/morpher/quadrilateral.c | 8 | ||||
-rw-r--r-- | src/morpher/trianglemap.c | 13 |
2 files changed, 13 insertions, 8 deletions
diff --git a/src/morpher/quadrilateral.c b/src/morpher/quadrilateral.c index af77f0f..9c73dfa 100644 --- a/src/morpher/quadrilateral.c +++ b/src/morpher/quadrilateral.c | |||
@@ -61,11 +61,3 @@ bool quadrilateral_is_delaunay(TriangleMap *t1, TriangleMap *t2) { | |||
61 | 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) && |
62 | 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); |
63 | } | 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 01b66c9..6658901 100644 --- a/src/morpher/trianglemap.c +++ b/src/morpher/trianglemap.c | |||
@@ -1,8 +1,17 @@ | |||
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 "morpher/quadrilateral.h" | ||
4 | #include "common/mem.h" | 5 | #include "common/mem.h" |
5 | 6 | ||
7 | static void propagate_delaunay(TriangleMap *start, TriangleMap *neighbor) { | ||
8 | assert(start != NULL && neighbor != NULL); | ||
9 | if (!quadrilateral_is_delaunay(start, neighbor)) { | ||
10 | quadrilateral_flip_diagonal(start, neighbor); | ||
11 | trianglemap_foreach_neighbor(neighbor, propagate_delaunay); | ||
12 | } | ||
13 | } | ||
14 | |||
6 | TriangleMap *trianglemap_create(CartesianMapping v1, CartesianMapping v2, CartesianMapping v3) { | 15 | TriangleMap *trianglemap_create(CartesianMapping v1, CartesianMapping v2, CartesianMapping v3) { |
7 | TriangleMap *triangle = malloc_or_die(sizeof(TriangleMap)); | 16 | TriangleMap *triangle = malloc_or_die(sizeof(TriangleMap)); |
8 | triangle->vertices[0] = v1; | 17 | triangle->vertices[0] = v1; |
@@ -51,6 +60,10 @@ void trianglemap_foreach_neighbor(TriangleMap *t, void (*f)(TriangleMap *, Trian | |||
51 | for (cursor = 0; cursor < 3; ++cursor) if (t->neighbors[cursor] != NULL) f(t, t->neighbors[cursor]); | 60 | for (cursor = 0; cursor < 3; ++cursor) if (t->neighbors[cursor] != NULL) f(t, t->neighbors[cursor]); |
52 | } | 61 | } |
53 | 62 | ||
63 | void trianglemap_propagate_delaunay(TriangleMap *t) { | ||
64 | trianglemap_foreach_neighbor(t, propagate_delaunay); | ||
65 | } | ||
66 | |||
54 | TriangleMap *trianglemap_split(TriangleMap *t, CartesianMapping v) { | 67 | TriangleMap *trianglemap_split(TriangleMap *t, CartesianMapping v) { |
55 | assert(trianglemap_to(t, v.origin) == t); | 68 | assert(trianglemap_to(t, v.origin) == t); |
56 | 69 | ||