summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpacien2017-12-24 00:07:53 +0100
committerpacien2017-12-24 00:07:53 +0100
commitcdbae7a5e7515ba50ae21f15929a086fc40fcae3 (patch)
tree492c7451e559beb35b0680cd474adaa5a0d8f0d0 /src
parent39cbe5d0d7db78f0d2808abea5562db84d03a07e (diff)
downloadmorpher-cdbae7a5e7515ba50ae21f15929a086fc40fcae3.tar.gz
Implement Delaunay propagation
Signed-off-by: pacien <pacien.trangirard@pacien.net>
Diffstat (limited to 'src')
-rw-r--r--src/morpher/quadrilateral.c17
-rw-r--r--src/morpher/trianglemap.c7
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
5static inline IntVector p2(IntVector n) { 6static 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
49void quadrilateral_flip_diagonal(TriangleMap *t1, TriangleMap *t2) { 50void 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
55bool quadrilateral_is_delaunay(TriangleMap *t1, TriangleMap *t2) { 59bool 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
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 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
7TriangleMap *trianglemap_create(CartesianMapping v1, CartesianMapping v2, CartesianMapping v3) { 6TriangleMap *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
48void 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
49TriangleMap *trianglemap_split(TriangleMap *t, CartesianMapping v) { 54TriangleMap *trianglemap_split(TriangleMap *t, CartesianMapping v) {
50 assert(trianglemap_to(t, v.origin) == t); 55 assert(trianglemap_to(t, v.origin) == t);
51 56