summaryrefslogtreecommitdiff
path: root/libs/ode-0.16.1/libccd/src/testsuites/polytope.c
blob: 65686fbfba459ebc606724780046260edd0fe0f1 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
//#undef NDEBUG
#include <cu/cu.h>
#include <ccd/polytope.h>
#include <ccd/dbg.h>

TEST(ptSetUp)
{
}

TEST(ptTearDown)
{
}


TEST(ptCreate1)
{
    ccd_pt_t pt;
    ccd_pt_vertex_t *v[3];
    ccd_pt_edge_t *e[3];
    ccd_pt_face_t *f;
    ccd_vec3_t u;
    int res;
    size_t i;

    DBG2("------");

    ccdPtInit(&pt);
    ccdPtDestroy(&pt);


    ccdPtInit(&pt);

    ccdVec3Set(&u, -1., -1., 0.);
    v[0] = ccdPtAddVertexCoords(&pt, -1., -1., 0.);
    assertTrue(ccdVec3Eq(&u, &v[0]->v.v));

    ccdVec3Set(&u, 1., 0., 0.);
    v[1] = ccdPtAddVertexCoords(&pt, 1., 0., 0.);
    assertTrue(ccdVec3Eq(&u, &v[1]->v.v));

    ccdVec3Set(&u, 0., 0., 1.);
    v[2] = ccdPtAddVertexCoords(&pt, 0., 0., 1.);
    assertTrue(ccdVec3Eq(&u, &v[2]->v.v));

    for (i = 0; i < 3; i++){
        assertTrue(ccdEq(v[i]->dist, ccdVec3Len2(&v[i]->v.v)));
    }


    e[0] = ccdPtAddEdge(&pt, v[0], v[1]);
    e[1] = ccdPtAddEdge(&pt, v[1], v[2]);
    e[2] = ccdPtAddEdge(&pt, v[2], v[0]);
    for (i = 0; i < 3; i++){
        DBG("e[%d]->dist: %lf", i, e[i]->dist);
        DBG_VEC3(&e[i]->witness, "     ->witness: ");
    }

    f = ccdPtAddFace(&pt, e[0], e[1], e[2]);
    DBG("f->dist: %lf", f->dist);
    DBG_VEC3(&f->witness, "     ->witness: ");

    for (i = 0; i < 3; i++){
        res = ccdPtDelVertex(&pt, v[i]);
        assertFalse(res == 0);
        res = ccdPtDelEdge(&pt, e[i]);
        assertFalse(res == 0);
    }

    ccdPtDelFace(&pt, f);
    for (i = 0; i < 3; i++){
        res = ccdPtDelVertex(&pt, v[i]);
        assertFalse(res == 0);
    }
    for (i = 0; i < 3; i++){
        res = ccdPtDelEdge(&pt, e[i]);
        assertTrue(res == 0);
    }
    for (i = 0; i < 3; i++){
        res = ccdPtDelVertex(&pt, v[i]);
        assertTrue(res == 0);
    }

    v[0] = ccdPtAddVertexCoords(&pt, -1., -1., 0.);
    v[1] = ccdPtAddVertexCoords(&pt, 1., 0., 0.);
    v[2] = ccdPtAddVertexCoords(&pt, 0., 0., 1.);

    e[0] = ccdPtAddEdge(&pt, v[0], v[1]);
    e[1] = ccdPtAddEdge(&pt, v[1], v[2]);
    e[2] = ccdPtAddEdge(&pt, v[2], v[0]);

    f = ccdPtAddFace(&pt, e[0], e[1], e[2]);

    ccdPtDestroy(&pt);
}

TEST(ptCreate2)
{
    ccd_pt_t pt;
    ccd_pt_vertex_t *v[4];
    ccd_pt_edge_t *e[6];
    ccd_pt_face_t *f[4];
    ccd_vec3_t u;
    int res;
    unsigned int i;

    DBG2("------");

    ccdPtInit(&pt);

    ccdVec3Set(&u, -1., -1., 0.);
    v[0] = ccdPtAddVertexCoords(&pt, -1., -1., 0.);
    assertTrue(ccdVec3Eq(&u, &v[0]->v.v));

    ccdVec3Set(&u, 1., 0., 0.);
    v[1] = ccdPtAddVertexCoords(&pt, 1., 0., 0.);
    assertTrue(ccdVec3Eq(&u, &v[1]->v.v));

    ccdVec3Set(&u, 0., 0., 1.);
    v[2] = ccdPtAddVertexCoords(&pt, 0., 0., 1.);
    assertTrue(ccdVec3Eq(&u, &v[2]->v.v));

    ccdVec3Set(&u, 0., 1., 0.);
    v[3] = ccdPtAddVertexCoords(&pt, 0., 1., 0.);
    assertTrue(ccdVec3Eq(&u, &v[3]->v.v));

    for (i = 0; i < 4; i++){
        assertTrue(ccdEq(v[i]->dist, ccdVec3Len2(&v[i]->v.v)));
    }
    for (i = 0; i < 4; i++){
        DBG("v[%d]->dist: %lf", i, v[i]->dist);
        DBG_VEC3(&v[i]->witness, "     ->witness: ");
    }

    e[0] = ccdPtAddEdge(&pt, v[0], v[1]);
    e[1] = ccdPtAddEdge(&pt, v[1], v[2]);
    e[2] = ccdPtAddEdge(&pt, v[2], v[0]);
    e[3] = ccdPtAddEdge(&pt, v[3], v[0]);
    e[4] = ccdPtAddEdge(&pt, v[3], v[1]);
    e[5] = ccdPtAddEdge(&pt, v[3], v[2]);
    for (i = 0; i < 6; i++){
        DBG("e[%d]->dist: %lf", i, e[i]->dist);
        DBG_VEC3(&e[i]->witness, "     ->witness: ");
    }

    f[0] = ccdPtAddFace(&pt, e[0], e[1], e[2]);
    f[1] = ccdPtAddFace(&pt, e[3], e[4], e[0]);
    f[2] = ccdPtAddFace(&pt, e[4], e[5], e[1]);
    f[3] = ccdPtAddFace(&pt, e[5], e[3], e[2]);
    for (i = 0; i < 4; i++){
        DBG("f[%d]->dist: %lf", i, f[i]->dist);
        DBG_VEC3(&f[i]->witness, "     ->witness: ");
    }

    for (i = 0; i < 4; i++){
        res = ccdPtDelVertex(&pt, v[i]);
        assertFalse(res == 0);
    }
    for (i = 0; i < 6; i++){
        res = ccdPtDelEdge(&pt, e[i]);
        assertFalse(res == 0);
    }

    res = ccdPtDelFace(&pt, f[0]);
    for (i = 0; i < 6; i++){
        res = ccdPtDelEdge(&pt, e[i]);
        assertFalse(res == 0);
    }

    res = ccdPtDelFace(&pt, f[1]);
    assertTrue(ccdPtDelEdge(&pt, e[0]) == 0);
    assertFalse(ccdPtDelEdge(&pt, e[1]) == 0);
    assertFalse(ccdPtDelEdge(&pt, e[2]) == 0);
    assertFalse(ccdPtDelEdge(&pt, e[3]) == 0);
    assertFalse(ccdPtDelEdge(&pt, e[4]) == 0);
    assertFalse(ccdPtDelEdge(&pt, e[5]) == 0);
    for (i = 0; i < 4; i++){
        res = ccdPtDelVertex(&pt, v[i]);
        assertFalse(res == 0);
    }

    res = ccdPtDelFace(&pt, f[2]);
    assertTrue(ccdPtDelEdge(&pt, e[1]) == 0);
    assertTrue(ccdPtDelEdge(&pt, e[4]) == 0);
    assertFalse(ccdPtDelEdge(&pt, e[2]) == 0);
    assertFalse(ccdPtDelEdge(&pt, e[3]) == 0);
    assertFalse(ccdPtDelEdge(&pt, e[5]) == 0);

    assertTrue(ccdPtDelVertex(&pt, v[1]) == 0);
    assertFalse(ccdPtDelVertex(&pt, v[0]) == 0);
    assertFalse(ccdPtDelVertex(&pt, v[2]) == 0);
    assertFalse(ccdPtDelVertex(&pt, v[3]) == 0);

    res = ccdPtDelFace(&pt, f[3]);
    assertTrue(ccdPtDelEdge(&pt, e[2]) == 0);
    assertTrue(ccdPtDelEdge(&pt, e[3]) == 0);
    assertTrue(ccdPtDelEdge(&pt, e[5]) == 0);

    assertTrue(ccdPtDelVertex(&pt, v[0]) == 0);
    assertTrue(ccdPtDelVertex(&pt, v[2]) == 0);
    assertTrue(ccdPtDelVertex(&pt, v[3]) == 0);


    v[0] = ccdPtAddVertexCoords(&pt, -1., -1., 0.);
    v[1] = ccdPtAddVertexCoords(&pt, 1., 0., 0.);
    v[2] = ccdPtAddVertexCoords(&pt, 0., 0., 1.);
    v[3] = ccdPtAddVertexCoords(&pt, 0., 1., 0.);

    e[0] = ccdPtAddEdge(&pt, v[0], v[1]);
    e[1] = ccdPtAddEdge(&pt, v[1], v[2]);
    e[2] = ccdPtAddEdge(&pt, v[2], v[0]);
    e[3] = ccdPtAddEdge(&pt, v[3], v[0]);
    e[4] = ccdPtAddEdge(&pt, v[3], v[1]);
    e[5] = ccdPtAddEdge(&pt, v[3], v[2]);

    f[0] = ccdPtAddFace(&pt, e[0], e[1], e[2]);
    f[1] = ccdPtAddFace(&pt, e[3], e[4], e[0]);
    f[2] = ccdPtAddFace(&pt, e[4], e[5], e[1]);
    f[3] = ccdPtAddFace(&pt, e[5], e[3], e[2]);

    ccdPtDestroy(&pt);
}

TEST(ptNearest)
{
    ccd_pt_t pt;
    ccd_pt_vertex_t *v[4];
    ccd_pt_edge_t *e[6];
    ccd_pt_face_t *f[4];
    ccd_pt_el_t *nearest;

    DBG2("------");

    ccdPtInit(&pt);

    v[0] = ccdPtAddVertexCoords(&pt, -1., -1., 0.);
    v[1] = ccdPtAddVertexCoords(&pt, 1., 0., 0.);
    v[2] = ccdPtAddVertexCoords(&pt, 0., 0., 1.);
    v[3] = ccdPtAddVertexCoords(&pt, 0., 1., 0.);

    e[0] = ccdPtAddEdge(&pt, v[0], v[1]);
    e[1] = ccdPtAddEdge(&pt, v[1], v[2]);
    e[2] = ccdPtAddEdge(&pt, v[2], v[0]);
    e[3] = ccdPtAddEdge(&pt, v[3], v[0]);
    e[4] = ccdPtAddEdge(&pt, v[3], v[1]);
    e[5] = ccdPtAddEdge(&pt, v[3], v[2]);

    f[0] = ccdPtAddFace(&pt, e[0], e[1], e[2]);
    f[1] = ccdPtAddFace(&pt, e[3], e[4], e[0]);
    f[2] = ccdPtAddFace(&pt, e[4], e[5], e[1]);
    f[3] = ccdPtAddFace(&pt, e[5], e[3], e[2]);

    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_FACE);
    assertEquals(nearest, (ccd_pt_el_t *)f[1]);
    assertTrue(ccdPtDelFace(&pt, f[1]) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_FACE);
    assertTrue(nearest == (ccd_pt_el_t *)f[0]
                || nearest == (ccd_pt_el_t *)f[3]);
    assertTrue(ccdPtDelFace(&pt, (ccd_pt_face_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_FACE);
    assertTrue(nearest == (ccd_pt_el_t *)f[0]
                || nearest == (ccd_pt_el_t *)f[3]);
    assertTrue(ccdPtDelFace(&pt, (ccd_pt_face_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_EDGE);
    assertTrue(nearest == (ccd_pt_el_t *)e[0]
                || nearest == (ccd_pt_el_t *)e[3]);
    assertTrue(ccdPtDelEdge(&pt, (ccd_pt_edge_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_EDGE);
    assertTrue(nearest == (ccd_pt_el_t *)e[0]
                || nearest == (ccd_pt_el_t *)e[3]);
    assertTrue(ccdPtDelEdge(&pt, (ccd_pt_edge_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_FACE);
    assertEquals(nearest, (ccd_pt_el_t *)f[2]);
    assertTrue(ccdPtDelFace(&pt, f[2]) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_EDGE);
    assertTrue(nearest == (ccd_pt_el_t *)e[1]
                || nearest == (ccd_pt_el_t *)e[4]
                || nearest == (ccd_pt_el_t *)e[5]);
    assertTrue(ccdPtDelEdge(&pt, (ccd_pt_edge_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_EDGE);
    assertTrue(nearest == (ccd_pt_el_t *)e[1]
                || nearest == (ccd_pt_el_t *)e[4]
                || nearest == (ccd_pt_el_t *)e[5]);
    assertTrue(ccdPtDelEdge(&pt, (ccd_pt_edge_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_EDGE);
    assertTrue(nearest == (ccd_pt_el_t *)e[1]
                || nearest == (ccd_pt_el_t *)e[4]
                || nearest == (ccd_pt_el_t *)e[5]);
    assertTrue(ccdPtDelEdge(&pt, (ccd_pt_edge_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_EDGE);
    assertTrue(nearest == (ccd_pt_el_t *)e[2]);
    assertTrue(ccdPtDelEdge(&pt, (ccd_pt_edge_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_VERTEX);
    assertTrue(nearest == (ccd_pt_el_t *)v[1]
                || nearest == (ccd_pt_el_t *)v[2]
                || nearest == (ccd_pt_el_t *)v[3]);
    assertTrue(ccdPtDelVertex(&pt, (ccd_pt_vertex_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_VERTEX);
    assertTrue(nearest == (ccd_pt_el_t *)v[1]
                || nearest == (ccd_pt_el_t *)v[2]
                || nearest == (ccd_pt_el_t *)v[3]);
    assertTrue(ccdPtDelVertex(&pt, (ccd_pt_vertex_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_VERTEX);
    assertTrue(nearest == (ccd_pt_el_t *)v[1]
                || nearest == (ccd_pt_el_t *)v[2]
                || nearest == (ccd_pt_el_t *)v[3]);
    assertTrue(ccdPtDelVertex(&pt, (ccd_pt_vertex_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    //DBG("nearest->type: %d", nearest->type);
    //DBG("       ->dist: %lf", nearest->dist);
    //DBG_VEC3(&nearest->witness, "       ->witness: ");
    assertEquals(nearest->type, CCD_PT_VERTEX);
    assertTrue(nearest == (ccd_pt_el_t *)v[0]);
    assertTrue(ccdPtDelVertex(&pt, (ccd_pt_vertex_t *)nearest) == 0);


    nearest = ccdPtNearest(&pt);
    assertTrue(nearest == NULL);

    ccdPtDestroy(&pt);
}