Bon , ça m'a pris un peu de temps, mais il a fallu que je fasse pas mal d'édition par rapport à mon original.
Je note 5 points principaux :
- La méthode est "méthode incrémentale Delete and Build" (voir les commentaires dans le code. Elle a un incconvénient, elle prend plus de temps que par exemple Divide & Conquer. ou Sweep. Cependant, on le re-gagne ensuite, car ces méthodes obligent à tout recalculer si on ajoute ou enlève un point, alors que l'incrémental non. Je fournis d'ailleurs les routines pour ajouter ou enlever un point du réseau (référé par son uméro dans le buffer de points initial)
- Comme pour tous les autres exemples existants, j'ai pris une enveloppe convexe. Dans mes algos à moi, j'avais envisagé le cas d'une enveloppe concave, ce qui complexifie pas mal les calculs. Si quelqu'un le souhaite, je met à disposition, mais le code a environ 5 à 600 lignes de plus.
- Au vu des figures que j'avais, j'aimerais savoir si vous avez la même chose (problème) que j'ai eu avec la routine InCircle, lorsque les triangles sont extrêmement aplatis ou allongés (oui, j'avais des données "étranges"). Là aussi, il m'avait fallu ajouter du code pour tester "manuellement". Je ne l'ai pas inclus, mais là encore je le tiens à disposition (à moins que cela soit la routine que j'avais récupéré ??).
- Egalement, dans mon code original, je faisais ressortir les indices du contour extérieur , ce qui évitait de les recalculer si besoin était (accélarération). Je ne l'ai pas inclus, mais là encore je le tiens à disposition.
- Il y a 2 possibilités de structures de triangle, suivant que l'on veut optimiser en vitesse ou en mémoire utilisée. Par défaut la structure est optimisée en vitesse. Si on veut optimiser en mémoire utilisée, il faut rajouter un flag OPTIMIZED_MEMORY à la compil.
NOTE : le code étant trop long pour tenir dans un seul message, j'ai mis le code en 2 messages (la triangulation proprement dite est dans le suivant).
Maintenant voici :
TriStructs.h
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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 /**************************************************************** ***************************************************************** ***************************************************************** TriStructs.h : Ce module contient l'"include file" des structures utilisées pour le calcul de triangulation. Copyright : Environnement Canada & COGITECH Jean Souviron 2000 Auteur : Jean Souviron (COGITECH Jean Souviron) Janvier 2000 Please insert these copyrights in each code where you use part of this software. Failure to do so is a direct violation of the international copyright laws. ***************************************************************** ***************************************************************** ***************************************************************** */ #ifndef _JS_TRIANGSTRUCTS #define _JS_TRIANGSTRUCTS /* Structure de point utilisée */ typedef struct _GeoPt { double X ; double Y ; } GeoPt ; /* Structure des triangles */ typedef struct _Triangle { int S1 ; int S2 ; int S3 ; #ifndef OPTIMIZED_MEMORY GeoPt Center ; double R ; #endif struct _Triangle *next ; struct _Triangle *previous ; } Triangle ; #ifndef ERROR #define ERROR 1 #endif #ifndef SUCCESS #define SUCCESS 0 #endif #endif
Triangle.h
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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 /**************************************************************** ***************************************************************** ***************************************************************** Triangle.h : Ce module contient l'"include file" des routines publiques de calcul de triangulation. Copyright : Environnement Canada & COGITECH Jean Souviron 2000 Auteur : Jean Souviron (COGITECH Jean Souviron) Janvier 2000 Please insert these copyrights in each code where you use part of this software. Failure to do so is a direct violation of the international copyright laws. ***************************************************************** ***************************************************************** ***************************************************************** */ #ifndef _JS_TRIANGULATION #define _JS_TRIANGULATION #include "TriStructs.h" extern int Triangulate ( GeoPt *Pts, int N_Pts, Triangle **Triangles, int *N_Triangles ); extern int RemovesOnePointToTriangulation ( int num, GeoPt *Pts, Triangle **Triangles, int *N_Triangles ); extern int AddsOnePointToTriangulation ( int num, GeoPt *Pts, Triangle **Triangles, int *N_Triangles ); #endif
Et enfin un exemple (absurde à cause des points, qui sont aléatoires) d'utilisation :
TriMain.c
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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 /**************************************************************** ***************************************************************** ***************************************************************** Ce module contient un exemple d'utilisation de la triangulation Copyright : Environnement Canada & COGITECH Jean Souviron 2000 Auteur : Jean Souviron (COGITECH Jean Souviron) Janvier 2000 Please insert these copyrights in each code where you use part of this software. Failure to do so is a direct violation of the international copyright laws. ***************************************************************** ***************************************************************** ***************************************************************** */ #include <stdlib.h> #include <stdio.h> #include "Triangle.h" int main ( int argc, char **argv ) { GeoPt Pts[100] ; int i, N_Triangles = 0, N_Pts = 100 ; Triangle *Triangles = (Triangle *)NULL, *elt = (Triangle *)NULL ; Triangle *next = (Triangle *)NULL ; /* --- Rempli le buffer de points */ for ( i = 0 ; i < 100 ; i++ ) { Pts[i].X = 30.0 + 40.0 *((double)rand()/RAND_MAX) ; Pts[i].Y = 10.0 + 80.0 *((double)rand()/RAND_MAX) ; } /* --- Triangulate to find the total number of triangles to watch */ i = Triangulate ( Pts, N_Pts, &Triangles, &N_Triangles ); if ( (i == ERROR) || (N_Triangles == 0) ) { return 0 ; } /* --- Affiche les triangles */ elt = Triangles ; while ( elt != (Triangle *)NULL ) { fprintf (stderr, "Sommets [1] %g,%g [2] %g,%g [3] %g %g\n", Pts[elt->S1].X, Pts[elt->S1].Y, Pts[elt->S2].X, Pts[elt->S2].Y, Pts[elt->S3].X, Pts[elt->S3].Y ); elt = elt->next ; } /* --- Frees the triangles */ elt = Triangles ; while ( elt != (Triangle *)NULL ) { next = elt->next ; free ( elt ) ; elt = next ; } return 1 ; }
Partager