Académique Documents
Professionnel Documents
Culture Documents
Février 2008
1
Tables des matières
Introduction ................................................................................................................................ 4
Description générale................................................................................................................... 5
II Architecture.................................................................................................................... 6
I Graphe d’enchaînement.................................................................................................. 8
III Algorithmes.............................................................................................................. 14
Couche graphique..................................................................................................................... 22
I Tracé du MNT.............................................................................................................. 22
II Tracé du graphe............................................................................................................ 23
V Transformations ........................................................................................................... 29
Conclusion................................................................................................................................ 30
2
Sources ............................................................................................ Erreur ! Signet non défini.
3
Introduction
Le projet avait comme but d’extraire des lignes de crêtes et de talwegs, ce qui constitue un
problème fondamental en Géomatique. A partir d’un simple fichier MNT pouvant avoir
divers formats en fonction de sa régularité ou non, et en utilisant un maillage, il fallait alors
tracer les graphes correspondants à ces lignes caractéristiques et les représenter.
Le travail se divisait ainsi en plusieurs parties, une phase d’algorithmique visant à détecter les
crêtes/talwegs et à construire les graphes correspondants, une phase de représentation
graphique à l’aide des librairies OpenGL, et enfin la mise en place d’une IHM permettant à
l’utilisateur de pouvoir charger plusieurs MNT différents et visualiser les résultats du calcul.
4
Description générale
I Structure HBDS :
Le but du projet est d’obtenir deux graphes distincts pour les crêtes et les talwegs, à partir
d’un semis de points connus en X, Y, Z. Ce semis de points est automatiquement associé à un
5
maillage, c’est le cas si le MNT est régulier, sinon il faut appliquer un algorithme
d’interpolation pour construire un maillage régulier.
II Architecture
En amont, un fichier de MNT et/ou un graphe de crêtes et talwegs sont donnés pour le calcul.
On a également la possibilité d’exporter un graphe de crêtes et talwegs de la couche calcul
vers le noyau. Ensuite, le graphe des crêtes et talwegs est calculé, puis dessiné dans des
couches différentes qui communiquent avec l’Interface Homme Machine.
6
Figure 2 : architecture du programme
7
Algorithme de calcul
I Graphe d’enchaînement
La première partie du calcul consiste au traitement du MNT, à savoir s’il est régulier ou
irrégulier. Deux premiers algorithmes consistent à créer un maillage régulier de valeurs en Z à
partir d’un MNT irrégulier, ils ne sont donc pas nécessaires pour un MNT régulier, à moins de
fabriquer un maillage différent de celui du MNT d’origine.
8
A partir d’un semis de point, il faut donc rattacher chaque point à une maille donnée
(Algorithme Rattach_point), pour pouvoir ensuite interpoler et calculer la valeur en Z de
chaque nœud du maillage (Algorithme G3D) à l’aide de la méthode du Paraboloïde
hyperbolique de Laporte. Pour interpoler, un minimum de 6 points est nécessaire, ainsi, s’il
n’y a pas assez de points dans la maille, il est possible d’effectuer jusqu’à 3 agrandissements
de la fenêtre de calcul.
TXYZ
1 10 460 412 MNT
2 20 190 430
3 20 410 100 500
4 90 50 448
5 110 260 131
6 130 420 423 400
10 260 90 378
11 290 310 343
12 320 210 17 200
0
0 100 200 300 400 500
PT
1 1
2 3 C
3 6 2 2 0 1 0 NX=5
4 8 0 0 1 0 1
5 13 0 1 0 2 0
6 11 1 2 0 0 0
7 15 1 0 1 0 0
8 5 NY=5
9 12 +
10 14 PT
11 2 1 1 1 1 1 NX=5
12 7 1 1 1 1 1
13 9 1 1 1 1 1
14 4 1 1 1 1 1
15 10 NTXYZ=15 1 1 1 1 1
NY=5
9
INTERXY
Figure 5 : Recherche des points et interpolation avec INTERXY
Une fois que l’on a obtenu un maillage bien régulier (X0, Y0, DX, DY, NX, NY) en Z, on
peut lancer la détection de crêtes/talwegs, la deuxième étape consiste donc à balayer cette
matrice de Z à la fois horizontalement et verticalement de manière à repérer les creux (pour
les talwegs) lorsque Zi-1,j ≥ Zi,j ≤ Zi+1,j et les bosses (pour les crêtes) lorsque Zi-1,j ≤ Zi,j ≥ Zi+1,j.
Pour éviter d’avoir des crêtes/talwegs trop larges, on se fixe un critère d’arrêt lors du
balayage : si l’on rencontre plus 5 « vrais » à la suite, on remet tout à « faux ». Physiquement
ce cas correspondrait à une large vallée (talwegs) ou à un plateau (crêtes). Une fois les 2
matrices de balayage, H et V, remplies, on fait l’union entre les deux pour obtenir une matrice
nommée MT (talwegs) ou MC (crêtes).
10
MNT
NY H
V T=HUV
0 0 0 0 0 0 1 0 1 0
0 0 1 0 0 0 1 1 0 0
1 0 0 0 0 1 1 0 0 0
0 1 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
T J M IN NC F BR
1 3 2
1 1 4 6
1 1 1 1 8 2
IM IN 1 1 1 1 8 6
1 1 1 1 IB A R, J B A R
1 1 1 1
NLF 1 1 1
1 1 1
1 1 1
1 1
1
Xo, Y o NX
11
T J M IN NC F
1
1 1
1 1 1 1
IM IN 1 1 1
1 IB A R , J B A R
1 1
NLF 1 1
1 1 1
1 1 1
1 1
1
Xo, Y o NX
L’étape suivante est la recherche des voisins : pour chaque « vrai », on remplit la matrice P
qui donne la ligne sur la table PVOIS, puis la tables de pointeurs de voisin (PVOIS) et la table
listant tous les voisins (VOIS).
T PVOIS VOIS
0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2
0 1 0 0 0 0 0 1 0 0 0 2 2 3 2 1 10
0 1 0 0 0 1 1 0 0 0 0 3 4 5 3 2 8
0 0 1 0 1 0 0 0 0 0 0 4 6 6 4 1 9
0 0 0 1 0 0 0 0 0 0 0 5 7 8 5 1 11
0 0 0 1 0 0 0 0 0 0 0 6 9 10 6 1 10
0 0 1 0 1 0 0 0 0 0 0 7 11 12 7 1 2
0 1 0 0 0 1 0 0 0 0 0 8 13 14 8 3 2
0 1 0 0 0 0 1 0 0 0 0 9 15 16 9 1 9
1 0 0 0 0 0 0 1 1 0 0 10 17 18 10 3 7
1 0 0 0 0 0 0 0 0 1 1 11 19 20 11 2 2
12 21 23 12 4 3
P 13 24 26 13 3 7
0 1 0 0 0 0 0 0 2 3 4 14 27 28 14 4 5
0 5 0 0 0 0 0 6 0 0 0 15 29 30 15 3 6
0 7 0 0 0 8 9 0 0 0 0 16 31 32 16 2 8
0 0 10 0 11 0 0 0 0 0 0 17 33 34 17 3 2
0 0 0 12 0 0 0 0 0 0 0 18 35 36 18 5 4
0 0 0 13 0 0 0 0 0 0 0 19 37 38 19 3 6
0 0 14 0 15 0 0 0 0 0 0 20 39 40 20 5 4
0 16 0 0 0 17 0 0 0 0 0 21 41 42 21 6 4 coordonnées
0 18 0 0 0 0 19 0 0 0 0 22 43 44 22 4 3 des voisins
de 12
20 0 0 0 0 0 0 21 22 0 0 23 45 45 23 4 5
23 0 0 0 0 0 0 0 0 24 25 24 46 47 24 5 4
25 48 48 25 7 3
26 7 5
27
28
etc
Enfin une fois tous les voisin connus, il nous est possible de tracer les arcs. Ainsi, on
recherche les points ayant un nombre de voisins différent de 2, ce qui permet de dire que c’est
12
un sommet et pour chacun de ces points, on parcourt tous les arcs qui le concernent en
remplissant au fur et à mesure, toutes les tables caractéristiques des graphes. Il s’agit en sortie
des tables, SXYZ, SIF, AXYZ, PAXYZ et cela à la fois pour le graphe des crêtes et à la fois
pour les graphes de talwegs.
II Graphe d’appel
Ce graphe d’appel ne prend en compte que les algorithmes de calcul, les procédures
d’affichage ou d’IHM ne sont pas traités dans cette partie.
13
III Algorithmes
RATTACH_POINT
variable mode genre type description
Paramètres formels
TXYZ IN matrice réel X, Y, Z de tous les points de notre semi de point de départ
(NTXYZ*3)
NTXYZ IN scalaire entier Nombre de points de départ
X0, Y0 IN scalaire réel Coordonnées de l’origine du maillage
DX, DY IN scalaire réel Pas du maillage
NX, NY IN scalaire entier Nombre de nœuds du maillage
C OUT matrice entier matrice de compteur, nombre de points du jeu de données dans chaque
(NY*NX) maille
P OUT matrice entier matrice de pointeurs, adresse dans la table PT pour récupérer tous les
(NY*NX) points se situant dans une maille
PT OUT vecteur entier ensemble des points triés dans l’ordre du maillage
(NTXYZ)
Variables locales
IM, JM scalaire entier Position (ligne, colonne) du nœud de la maille
BI, BF scalaire entier Bornes de balayage de la table PT pour le nœud (IM, JM)
Principe :
A partir du semi de point de départ connu en X,Y,Z (table TXYZ), on trace un maillage
(X0,Y0,DX,DY,NX,NY) et on cherche à rattacher chaque point à une maille donnée. On
fabrique ainsi deux matrices correspondant au maillage à savoir le compteur C (nombre de
points dans chaque maille) et le pointeur P (adresse du 1er point pour chaque maille dans PT),
PT étant le vecteur correspondant au semi de point trié avec le maillage.
ALGORITHME censuré
14
G3D
Principe :
On parcourt le maillage, pour chaque maille, on répertorie les points du MNT qu’elle contient.
On délimite une fenêtre puis on regarde s’il y a au moins 6 points à l’intérieur sinon on
agrandit le dispositif sauf si la fenêtre est de 7 sur 7 auquel cas, on se limite aux points
présents. Dès que l’on a trouvé les 6 points nécessaires, on interpole avec la méthode du
Paraboloïde hyperbolique (procédure INTERXY). Pour chaque nœud de maille, on calcule
ainsi un Z associé et on sort à la fin une matrice Z du maillage régulier.
ALGORITHME censuré
15
BALAYAGE
variable mode genre type description
Paramètres formels
Z IN matrice réel Z du maillage obtenu par l’interpolation du MNT
(NY*NX)
TYP IN scalaire caractère « T » pour balayer les talwegs, « C » pour balayer les crêtes
(1)
NX, NY IN scalaire entier Nombre de nœuds du maillage
T OUT matrice booléen Matrice des crêtes/talwegs (non amaigrie) après balayage
(NY*NX)
Variables locales
H, V matrice booléen Scan horizontal/vertical de la matrice Z
(NY*NX)
CP scalaire entier Compteur de ⇒ consécutifs
Principe :
On initialise deux matrices H et V de même taille que la matrice Z, puis on scanne la matrice
Z horizontalement et verticalement. Avec un compteur, on vérifie que le nombre de ⇒
n’excède pas 5 auquel cas, on les supprime pour ne pas avoir de crêtes/talwegs trop larges.
Une fois les 2 matrices obtenues, la réunion des 2 nous donne la matrice des crêtes/talwegs.
ALGORITHME censuré
16
CURE
Principe :
ALGORITHME censuré
17
RATTACH_VOIS
variable mode genre type description
Paramètres formels
T IN matrice booléen Matrice des crêtes/talwegs « amaigrie »
(NY*NX)
NX, NY IN scalaire entier Nombre de nœuds du maillage
P OUT matrice entier Matrice donnant la ligne dans la table PVOIS pour chaque élément
(NY*NX) de T
B OUT matrice booléen initialisé ici et utilisé dans la procédure GRAPHE
(NY*NX)
PVOIS OUT matrice entier Table des pointeurs sur la table des voisins
(NPVOIS*2)
NPVOIS OUT scalaire entier Cardinalité de PVOIS Æ nombre de ⇒ dans la matrice T
VOIS OUT matrice entier Table avec la position des voisins en i,j
(NVOIS*2)
NVOIS OUT scalaire entier Cardinalité de VOIS Æ nombre total de voisins
Variables locales
C scalaire entier Compteur de voisins
BIL, BFI, BIC, BFC scalaire entier Bornes de la fenêtre de recherche des voisins, par défaut -1 et 1 sauf
sur les bords
Principe :
Pour chaque ⇒ que l’on trouve dans la matrice T « amaigrie » en position Ti,j , on regarde
les 8 éléments adjacents et on récupère tous les voisins potentiels, c’est-à-dire les autres ⇒ ,
on fait correspondre à Pi,j la ligne dans la table de pointeurs PVOIS, cette table nous permet
pour chaque Ti,j de déterminer les lignes de début et de fin correspondantes aux voisins
potentiels de ce Ti,j dans la table VOIS. Attention, on ne peut rencontrer deux voisins côte à
côte d’où la nécessité d’un contrôle : si l’on est sur un voisin en diagonale, on ne le prend en
compte que s’il n’y a pas de ⇒ à côté. Ces tables pourront ensuite servir à la détermination
des sommets, points annexes…
ALGORITHME censuré
18
GRAPHE
Principe :
Dans la matrice Ti,j , pour chaque ⇒ , on teste d’abord si ça n’est pas un sommet isolé (cas
où Pi,j = -1) auquel cas, on a juste SXYZ à remplir. Dans le cas général, on compte le nombre
de voisins dans la table VOIS, s’il est égal à 2, on est pas sur un sommet donc on ne le traite
pas tout de suite. Si c’est un sommet, on le stocke puis on parcourt tous ses arcs en suivant les
voisins successifs jusqu’à ce que le nombre de voisins soit différent de 2 auquel cas, c’est le
sommet final de l’arc. A chaque point, on regarde s’il on n’est pas sur un creux/ ou sur une
19
bosse, si c’est le cas, le point devient un sommet (principe de fragmentation). On oriente tous
les arcs dans le sens d’écoulement de l’eau.
ALGORITHME censuré
20
Gestion dynamique de mémoire
L’utilisation des tableaux en ADL, se fait comme si celui-ci est de taille variable. Ainsi,
l’extension ou la réduction de la taille de celui-ci ne nécessite aucune manipulation
supplémentaire. En effet il existe des langages de programmation, dans lesquels, il suffit de
déclarer que le tableau est de taille variable ; et la modification cette taille n’entraine aucune
perte de données.
Sous Fortran, il en est autrement. Il existe bel et bien la notion de tableaux extensibles. Mais
lorsqu’il s’agit d’étendre, ou de réduire la taille de celui-ci, cinq opérations sont nécessaires :
Dans le cadre de ce projet de géomatique, les tableaux sont alloués par bloc de 10, 100, 1000
selon le cas. A la fin de la manipulation d’un tableau, celui-ci est soit purement et simplement
détruit, ou réduit à la taille strictement nécessaire.
21
Couche graphique
La couche graphique est programmée grâce aux bibliothèques OpenGL directement importées
sur le compilateur Fortran.
I Tracé du MNT
PROGRAMME censuré
22
- Le MNT surfacique : procédure CreeListeMNTSurf
PROGRAMME censuré
II Tracé du graphe
Pour chaque arc, la procédure teste d’abord si l’arc est isolé et trop petit auquel cas il n’est pas
tracé. S’il satisfait le critère, l’arc peut être tracé, deux cas se présentent alors :
- l’arc ne comporte pas de points annexes : on trace une ligne simple entre le sommet
initial et le sommet final en déclarant les deux points.
PROGRAMME censuré
- L’arc comporte des points annexes : on trace d’abord le sommet initial, puis on fait
une boucle sur la table de points annexes et enfin on termine par le sommet final, le
mode GL_LINE_STRIP faisant en sorte de relier les points un à un.
PROGRAMME censuré
23
Figure 12 : Affichage du graphe de talweg
Les crêtes/talwegs sont plaqués directement sur le MNT mais on rajoute un ∆Z pour éviter
qu’il y ait un conflit d’affichage entre le MNT et les graphes (ce qui empêcherait de voir la
totalité du graphe).
III Anaglyphe
PROGRAMME censuré
On peut ensuite dessiner deux MNT en mode filaire : un premier rouge et un autre vert
translaté suivant le sens et la direction du vecteur ana.
PROGRAMME censuré
24
Figure 13 : vision stéréoscopique
En plus de l’IHM, il est également possible d’utiliser plusieurs fonctions à l’aide d’un
raccourci clavier. Les flèches directionnelles appellent les primitives de déplacement
(glTranslate), de changement d’échelle (glScale) ou de rotations (glRotate) correspondantes.
Ces fonctions sont regroupées dans les modules ParametresCalcul et Normal. Il s’agit entre
autres des procédures suivantes :
25
- Calcul_Matreduite : Prend en entrée un entier N, elle est utilisable pour réduire la
matrice d’altitude d’une colonne sur N.
- Vect_Normal : calcule pour chaque surface son vecteur normal à l’aide d’un produit
vectoriel.
26
Interface Homme Machine
Figure 14 : IHM
27
II Ouverture de fichier
Deux cases à cocher permettent d’affecter un identifiant appelé i_cretal, il est égal à :
- CRE (1) pour les crêtes
- TAL (2) pour les talwegs
- CRETAL (3) pour les deux
- 0 si aucun des deux
L’identifiant i_cretal permet ensuite d’appeler ou non les listes d’affichage des crêtes/talwegs
à savoir :
- La liste pour afficher les crêtes (IDCRE)
- La liste pour affiche les talwegs (IDTAL)
28
V Transformations
Les rotations peuvent se faire autour des 3 axes (Ox, Oy, Oz), 6 boutons sont pour cela
nécessaires, l’action sur le bouton implique la rotation du repère de – 10° ou de 10° autour de
ces trois axes (ce sont les angles lambda, phi, kappa).
Les translations peuvent là aussi se faire suivant les 3 axes, dans un sens ou dans l’autre :
- gauche ou droite : translation suivant Ox.
- haut ou gauche : translation suivant Oy.
- avant ou arrière : translation suivant Oz.
- bouton centrer : permet de réinitialiser la position au centre du MNT.
29
Conclusion
Ce projet nous a permis d’écrire des algorithmes de géomatique assez complexes, ce qui a
demandé beaucoup de méthode et de rigueur. De nombreuses difficultés sont intervenues : la
méthode pour amaigrir les matrices de booléens n’a pas été évidente à mettre en œuvre au
départ. La prise de contact avec OpenGL a également posé pas mal de problèmes.
Le rendu final des lignes de crêtes et talwegs peut être sujet à amélioration puisque plusieurs
algorithmes de filtrage et de rattachement ont été écrits mais nous n’avons pas encore réussi à
trouver des critères optimaux pour arriver aux résultats souhaités. De nombreux efforts ont été
consentis pour pouvoir charger des MNT réguliers ou non, mais l’ouverture des fichiers sous
différents formats peut encore être amélioré.
30
31