Vous êtes sur la page 1sur 2

Université de Strasbourg L2 informatique

UFR de mathématique et d’informatique 8 Janvier 2019

Structures de données et algorithmes


Epreuve de substitution

Durée 2h. Aucun document n’est autorisé. Vous expliquerez soigneusement vos réponses et vous préciserez
les préconditions des fonctions que vous programmerez.

Avant de commencer
On s’intéresse dans ce problème à la gestion d’objets graphiques en dimension 2 constitués essentiellement
de lignes polygonales fermées, qu’on appellera polygones, définies par une liste de points, voir l’exemple
graphique ci-dessous de deux polygones, l’un simple et l’autre croisé et correspondant chacun à la liste de
points de noms [A, B, C, D, E, F, G, H, I].
G
C G E
H F B

C D
E I H
D F
B A
I
A
polygone simple polygone croisé (avec des auto−intersections)

On suppose qu’on a à notre disposition le type float des nombres en virgule flottante avec les opérations
usuelles (somme, produit, racine carrée sqrt(), etc.) une bibliothèque permettant d’ouvrir une fenêtre
graphique avec des primitives de tracé permettant de tracer des segments de droites. Ceci est détaillé à la
suite.

Points
On considère des objets de type Point, en dimension 2, définis par la spécification suivante:
Spéc POINT étend FLOAT+BASE
Sorte Point Couleur
Opérations
rouge jaune vert bleu noir blanc : -> Couleur
Point_mk : float float Couleur-> Point
Point_x : Point -> float *** abscisse
Point_y : Point -> float *** ordonnée
Point_cl : Point -> Couleur *** couleur associée au point
Point_sc : float Point -> Point *** multiplication des coordonnées par le float
Point_tr : Point Point -> Point *** addition des coordonnées des deux points
Axiomes
*** ... à compléter
L’opération de changement d’échelle Point_sc consiste à multiplier les coordonnées du point en deuxième
argument par le nombre flottant donné en premier argument et l’opération de translation Point_tr à
ajouter deux à deux les coordonnées des deux points donnés en arguments.

1. Complétez cette spécification en en donnant les axiomes.

Choisissez une structure de donnée pour la sorte Couleur. Avec cette structure de donnée, on choisit la
structure de données standard pour implanter les points:
typedef struct { float abscisse ; float ordonnee ; Couleur couleur} Point ;

2. Écrivez le fichier header (.h) correspondant à cette implantation, puis programmez les fonctions corre-
spondantes.

1
Polygones
Un polygone sera représenté par une liste de points qu’on choisit d’implanter avec une liste chaînée avec la
structure de données:
typedef struct lp { Point sommet;
struct lp *next; } _slp, *Polygone;
On autorise les polygones restreints à un seul point.

1. Programmez les fonctions classiques correspondant à la liste de points vide (de prototype
Polygone Plg_vide()), l’insertion en tête (de prototype Polygone Plg_ajt(Polygone l, Point p)),
l’ajout à la fin (de prototype Polygone Plg_ajf(Polygone l, Point p)), l’insertion en ième position (de
prototype Polygone Plg_insi(Polygone l, int i, point p)).
−→
2. On translate un point M du vecteur ~u = OA en ajoutant les coordonnées du point A à celles du point
M . Programmez une opération de nom Plg_translate() qui fasse la translation d’un polygone par le
−→
vecteur OA donné en argument.

3. On suppose que la fonction de prototype void drawSeg(Point p1, Point p2, Couleur color) trace
un segment entre les points p1 et p2 sur la fenêtre graphique. Utilisez cette fonction pour programmer la
fonction Plg_draw() qui dessine un polygone.

Figures et calques
Dans notre contexte, un calque est une liste de polygones et on gère une figure qui est un ensemble de
100 calques. Cela permet de gérer des niveaux de visualisation en sélectionnant les calques à afficher et les
notions d’avant et d’arrière plan : un polygone avec un bas niveau de calque sera plus en arrière plan qu’un
polygone avec un haut niveau de calque. Dans les questions suivantes, on considérera que Figure est un
type mutable et que les fonctions demandées travaillent par effets de bord.

1. Le type Calque sera implantée par une liste circulaire doublement chaînée de polygones avec pointeur
sur le dernier élément et Le type Figure par un tableau contigu de 100 calques avec pour chaque
calque un booléen pour indiquer si celui-ci est visible ou non. Précisez comment on décrit ces structures
de données en C et écrivez une fonction qui retourne une figure vide, c’est-à-dire ne contenant aucun polygone.

2. Écrivez une fonction de nom Calque_draw() qui trace un calque, c’est-à-dire qui dessine toutes les lignes
polygonales contenues dans le claque, puis une fonction de nom Figure_draw() qui dessine toutes les lignes
polygonales contenues dans la figure.

3. Écrivez une fonction C qui fasse la fusion de deux calques numéros i et j : tous les polygones du claque j
se retrouvent dans le calque i et le calque j de vient vide : cette fonction devra être de complexité en temps
constante.

4. Programmez une fonction de prototype Figure Figure_metEnAvantplan(Figure f, Polygon g) qui


place au plan 99 le polygone désigné par g et qu’on suppose dans la figure. Sur le même modèle, écrivez le
code de la fonction Figure_avancePlan(Figue f, Polygone g qui place le polygone g dans le calque de
numéro immédiatement supérieur.

5. Écrivez une fonction C qui ajoute dans une figure un polygone dans le calque numéro i, puis une fonction
de prototype Figure Figure_copiePolyg(Figure f, Polygone g, int i) qui copie le polygone désigné
par g dans le calque numéro i.

Vous aimerez peut-être aussi