Baudouin
-
10 nov. 2008 à 18:44
Sacabouffe
Messages postés9427Date d'inscriptiondimanche 19 août 2007StatutMembreDernière intervention29 mai 2009
-
10 nov. 2008 à 18:45
Bonjour,
Dites, j'ai un exo de C à faire et c'est vraiment galère et la panique totale! Il s'agit du parcours d'une goutte d'eau dans un MNT!
En gros voilà le sujet, mais il manque toutes les illustrations! Un immense merci! :
(Le sujet est visible sur le site
http://www.irit.fr/ACTIVITES/EQ_TCI/ENSEIGNEMENT/CetSHELL/TP/tp02.html
sauf que c'est pas exactement celui-là pour le début, mais ça ne change rien)
MERCI !
Avant-propos :
Soit un fichier qui indique l'altitude de points géographiques repérés par leur latitude et leur longitude. Un tel fichier s'appelle un "modèle numérique de terrain", ou MNT. L'image ci-après, qui correspond à un relevé réel, constitue un MNT. Dans cette image, l'altitude est associée à une échelle en niveaux de gris. Plus une zone est élevée, plus elle est claire sur l'image. Réciproquement, une région sombre correspond à un terrain peu élevé :
* Sélectionner ces cent valeurs, dans la fenêtre netscape, à l'aide du bouton de gauche de la souris.
* Coller ces cent valeurs dans une fenêtre asedit vide, en cliquant sur le bouton du milieu de la souris (des tabulations apparaissent : ne pas s'en soucier).
* Sauvegarder ce fichier de texte sous le nom mnt.txt
Ce MNT peut être représenté en perspective par :
Représentation MNT
2) Écrire une fonction permettant de lire dans le fichier précédent, et de stocker les données dans une matrice de taille 12 x 12 (et non de taille 10 x 10), de manière à rajouter une bordure, qui sera initialisée à l'altitude 0
Remarques :
* On commencera obligatoirement le programme par les trois lignes suivantes :
#include <stdio.h>
#define TAILLE 12
typedef int matrice[TAILLE][TAILLE];
* On n'utilisera, à aucun endroit du programme, les valeurs 10, 11 ou 12, mais uniquement les expressions TAILLE-2, TAILLE-1 ou TAILLE.
3) Tester la fonction précédente, à l'aide d'un programme principal qui affiche les valeurs de la matrice.
4) On appelle "voisin" d'un point du MNT, un des huit points situés immédiatement autour de ce point :
8 voisins
Écrire une fonction qui renvoie dans un tableau les coordonnées du voisin le plus bas d'un point dont les coordonnées sont passées en paramètres.
Remarque :
Dans le cas où plusieurs voisins possèdent l'altitude minimale, on choisira un de ces points de manière arbitraire.
5) Écrire le programme principal, qui doit :
* Demander à l'utilisateur de taper les coordonnées d'un point du MNT (ce point désigne un endroit du MNT, où on suppose qu'on lache une goutte d'eau).
* Afficher tous les points du parcours de la goutte, sachant que :
o En chaque point, la goutte se dirige vers le voisin le plus bas.
o Le parcours se termine si la goutte atteint le bord du MNT, ou si elle tombe dans un creux, auxquels cas un message doit s'afficher pour indiquer la raison de l'arrêt.
* Proposer à l'utilisateur de lacher une autre goutte d'eau.
Il est demandé de n'utiliser aucune variable globale pour réaliser cet exercice.
7. Exercice 2.
Reprendre l'exercice précédent en rajoutant le raffinement suivant : en cas de conflit entre plusieurs voisins possédant la même altitude minimale, on choisit le point qui "perturbe" le moins le trajet de la goutte d'eau.
Exemple :
A B C
1 105 100 110
2 92 90 95
3 105 80 80
Si la goutte d'eau se trouve au point B2 et vient du point B1, lors du déplacement suivant, elle se dirige (selon la règle du plus grand dénivelé) soit vers B3, soit vers C3. Le déplacement qui perturbe le moins son trajet est B3.
On codera les huit directions, correspondant aux huit plus proches voisins, par les indices de tableaux suivants :
Direction
Indice
Est
0
Nord-Est
1
Nord
2
Nord-Ouest
3
Ouest
4
Sud-Ouest
5
Sud
6
Sud-Est
7
On pourra donc décrire la position des huit voisins d'un point par leurs décalages respectifs, suivant la latitude et la longitude, en déclarant en variables globales constantes les deux tableaux suivants :
const int deca_lat[VOISINS]={0,-1,-1,-1,0,1,1,1};
const int deca_lon[VOISINS]={1,1,0,-1,-1,-1,0,1};
L'intérêt est que, par exemple, le voisin d'indice 3 dans les tableaux précédents correspond à un déplacement dans la direction du NORD_OUEST, de code 3.
Répondre aux questions suivantes :
1) Écrire la fonction angle qui retourne l'angle entre deux directions. Cet angle est toujours compris entre 0 et 4 (compris). Par exemple, l'angle entre le SUD et le NORD_EST est égal à 3.
2) Écrire la fonction plus_bas qui renvoie dans un tableau les coordonnées du voisin le plus bas, ainsi que le code de la direction du déplacement correspondant. S'il existe plusieurs voisins possibles, on choisit celui qui fait faire l'angle le plus faible à la trajectoire de la goutte d'eau. Cette fonction fait donc appel à la fonction précédente. Au niveau du point de départ de la goutte, la direction de la trajectoire sera initialisée à la valeur SUD_OUEST.
Remarque :
Si plusieurs voisins possèdent la même altitude et font prendre le même angle (en valeur absolue) à la trajectoire, on en choisira un arbitrairement.
3) Écrire le programme principal, répondant aux mêmes exigences que celui de l'exercice 1.