summaryrefslogtreecommitdiff
path: root/test/morpher/trianglemap.c
blob: 986e40678fc201043540129ace15b6cc85dc2de7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "morpher/trianglemap.h"
#include <stdlib.h>
#include <assert.h>
#include "morpher/quadrilateral.h"

static inline bool neighbors_equals(TriangleMap *neighbors[],
                                    TriangleMap *n1, TriangleMap *n2, TriangleMap *n3) {
  return neighbors[0] == n1 && neighbors[1] == n2 && neighbors[2] == n3;
}

static inline bool vertices_equals(CartesianMapping maps[],
                                   CartesianMapping m1, CartesianMapping m2, CartesianMapping m3) {
  return mappings_equals(maps[0], m1) && mappings_equals(maps[1], m2) && mappings_equals(maps[2], m3);
}

static void test_trianglemap_to() {
  CartesianMapping A = m(50, 0), B = m(0, 100), C = m(100, 100), D = m(0, 200), E = m(100, 200);
  TriangleMap *t = trianglemap_create(A, B, C);
  TriangleMap *r = trianglemap_create(C, B, E);
  TriangleMap *l = trianglemap_create(B, D, E);
  trianglemap_set_neighbors(t, NULL, r, NULL, r);
  trianglemap_set_neighbors(r, t, l, NULL, l);
  trianglemap_set_neighbors(l, NULL, NULL, r, NULL);

  assert(trianglemap_to(t, v(80, 80)) == t);
  assert(trianglemap_to(t, v(0, 0)) == t->neighbors[0]);
  assert(trianglemap_to(t, v(55, 170)) == t->neighbors[1]);

  while (t != NULL) t = trianglemap_destroy(t);
}

static void test_trianglemap_split() {
  CartesianMapping A = m(50, 0), B = m(0, 100), C = m(100, 100), D = m(0, 200), E = m(100, 200), F = m(90, 110);
  TriangleMap *t = trianglemap_create(A, B, C);
  TriangleMap *r = trianglemap_create(C, B, E);
  TriangleMap *l = trianglemap_create(B, D, E);
  trianglemap_set_neighbors(t, NULL, r, NULL, r);
  trianglemap_set_neighbors(r, t, l, NULL, l);
  trianglemap_set_neighbors(l, NULL, NULL, r, NULL);

  TriangleMap *r1 = trianglemap_split(r, F);
  TriangleMap *r2 = r1->next;
  TriangleMap *r3 = r2->next;

  assert(vertices_equals(r1->vertices, C, B, F));
  assert(vertices_equals(r2->vertices, B, E, F));
  assert(vertices_equals(r3->vertices, E, C, F));
  assert(neighbors_equals(r1->neighbors, t, r2, r3));
  assert(neighbors_equals(r2->neighbors, l, r3, r1));
  assert(neighbors_equals(r3->neighbors, NULL, r1, r2));
  assert(t->neighbors[1] == r1 && l->neighbors[2] == r2);

  while (t != NULL) t = trianglemap_destroy(t);
}

static void test_trianglemap_propagate_delaunay() {
  CartesianMapping A = m(0, 0), B = m(0, 10), C = m(10, 10), D = m(10, 0), E = m(4, 6), F = m(8, 7);
  TriangleMap *l = trianglemap_create(A, B, C);
  TriangleMap *r = trianglemap_create(A, C, D);
  trianglemap_set_neighbors(l, NULL, NULL, r, r);
  trianglemap_set_neighbors(r, l, NULL, NULL, NULL);
  trianglemap_split(l, E);
  trianglemap_split(r, F);

  trianglemap_propagate_delaunay(r);

  {
    TriangleMap *triangle;
    int neighbor_index;
    for (triangle = l; triangle != NULL; triangle = triangle->next)
      for (neighbor_index = 0; neighbor_index < 3; ++neighbor_index)
        if (triangle->neighbors[neighbor_index] != NULL)
          assert(quadrilateral_is_delaunay(triangle, triangle->neighbors[neighbor_index]));
  }

  while (l != NULL) l = trianglemap_destroy(l);
}

int main(int argc, char **argv) {
  test_trianglemap_to();
  test_trianglemap_split();
  test_trianglemap_propagate_delaunay();
  return 0;
}