summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpacien2017-12-24 15:35:54 +0100
committerpacien2017-12-24 15:35:54 +0100
commit2a9ca610acdd24ebf1a215f779bf2a5d9f80d9cf (patch)
tree458531b4f450307cc222856cf30155fa00d8d011 /src
parentcdbae7a5e7515ba50ae21f15929a086fc40fcae3 (diff)
downloadmorpher-2a9ca610acdd24ebf1a215f779bf2a5d9f80d9cf.tar.gz
Move Delaunay propagation function
Signed-off-by: pacien <pacien.trangirard@pacien.net>
Diffstat (limited to 'src')
-rw-r--r--src/morpher/quadrilateral.c8
-rw-r--r--src/morpher/trianglemap.c13
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
65void 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
7static 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
6TriangleMap *trianglemap_create(CartesianMapping v1, CartesianMapping v2, CartesianMapping v3) { 15TriangleMap *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
63void trianglemap_propagate_delaunay(TriangleMap *t) {
64 trianglemap_foreach_neighbor(t, propagate_delaunay);
65}
66
54TriangleMap *trianglemap_split(TriangleMap *t, CartesianMapping v) { 67TriangleMap *trianglemap_split(TriangleMap *t, CartesianMapping v) {
55 assert(trianglemap_to(t, v.origin) == t); 68 assert(trianglemap_to(t, v.origin) == t);
56 69