retour sommaire des sujets logo ULP

Master Ingénierie et Technologies

Spécialité Génie Mécanique et Industriel

(Formation Continue)
29 mars 2006

contrôle TCP 19 – Génie informatique

Durée de l'épreuve : 2h. Tous documents papier autorisés. Les questions, bien que liées, peuvent être traitées indépendamment. Il faut aller vite, sans chercher à traiter des cas particuliers non spécifiés dans le sujet.

On désire créer une bibliothèque graphique, utilisable dans tous nos futurs programmes en C++ nécessitant du graphisme de type schéma, tracé de courbe, organigramme... Il n'est pas prévu de gestion d'images complexes comme les photos. Nous supposerons bien évidemment travailler dans un environnement graphique, comme Windows ou KDE sous Linux. Nos graphiques se feront donc dans une fenêtre dans laquelle les coordonnées sont des entiers (unité : un pixel, c'est à dire un point de l'écran). La coordonnée du point inférieur gauche est (0,0), celui juste à côté (à sa droite, mais toujours en bas) est donc (0,1)... Chaque point est allumé dans une couleur donnée (représentée par un entier), nous supposerons n'utiliser qu'un nombre réduit de couleurs. On suppose disposer (en incluant "fenetres.h") d'une classe nommée "fenetre" pour laquelle on dispose des méthodes publiques suivantes (je ne vous dit pas ce qui est privé, c'est inutile) :

void ouvrir_graphique(void); //nécessaire avant de commencer du graphique.
void fermer_graphique(void); //à appeler avant de quitter le programme
int get_couleur_fond(void); //nous dit quelle est la couleur du fond
int get_x_max(void); //nous dit quel est le X du coin inférieur droit de la fenêtre
int get_y_max(void); //nous dit quel est le Y du coin supérieur gauche
int get_couleur(int x, int y); // nous dit quelle est la couleur actuelle du pt (x,y)
int allume(int x, int y,int c); // allume le pt (x,y) dans la couleur c

Question 1 : que fait le programme ci-dessous (barème maxi : 1/20) ?

#include "fenetres.h"
int main(void)
 {
  fenetre f;
  int x,y;
  f.ouvrir_graphique();
  x=f.get_x_max()/2;
  y=f.get_y_max()/2;
  f.allume(x,y,f.get_couleur_fond());
  f.fermer_graphique();
 }

Question 2 : (barème maxi : 19/20) Gérer un dessin point par point n'est pas forcément pratique. Vous allez donc créer une classe d'objets (appelée "figure") pour les différentes figures de base que l'on aimerait gérer. Dans cette classe, un entier définit le type de figure : 1=droite horizontale, 2=droite verticale, 3 droite inclinée, 4=cercle, 5=rectangle (parallèle aux côtés de la fenêtre), 6=croix (utile pour les tracés de courbes), 7=triangle isocèle à base horizontale (les deux autres côtés sont de même longueur)... Deux entiers x,y définissent la position de la figure, par un point particulier (son centre), et deux autres entiers a,b serviront à définir la taille de la figure (type 1 : a=longueur(>0), b=0; type 2 : a=0, b=longueur(>0); type 3 : a=longueur en x(>0), b=longueur en y (>0 si vers la droite on monte, <0 si on descend); type 4 : a=b=diamètre, types 5 à 7 : a=longueur en x(>0), b=hauteur en y(>0). Un autre entier définit la couleur de la figure.

Question 2.1) : déclarez la classe "figure". Laissez de la place pour déclarer les méthodes, au fur et à mesure des questions suivantes (une page suffit).

Question 2.2) : L'utilisateur n'a pas à savoir les codes utilisés pour les types de figures. C'est pourquoi on lui propose des méthodes différentes pour chaque type de figure. Dans cette question, vous définirez les accesseurs en écriture cités ci-après. Tous reçoivent en argument les deux coordonnées du centre et la couleur, mais en plus : "set_droite" reçoit la largeur et la hauteur, l'un des deux pouvant être nul; "set_cercle" reçoit le diamètre (il serait idiot de devoir donner deux paramètres identiques), "set_croix", "set_rectangle" et "set_triangle" reçoivent la largeur et la hauteur.

Question 2.3) : Comme accesseur en lecture, on prévoit de récupérer la couleur d'une figure (get_couleur), les coordonnées du centre (get_x_centre, get_y_centre), les valeurs d'encombrement maxi (get_x_min, get_x_max, get_y_min, get_y_max). Déclarez et définissez ces méthodes (pour les valeurs d'encombrement, un seule me suffit).

Question 2.4) : Nous n'avons pour l'instant pas encore dessiné nos figures. C'est ce que vous allez faire ici. Déclarez la méthode nommée "dessiner", puis définissez la en vous limitant aux types 1, 2 et 5 (pour le type 5, vous pourriez réutiliser ce que vous avez déjà fait). Pour la suite du sujet, vous supposerez que cette méthode fonctionne pour tous les types.

Question 2.5) : Déclarez et définissez la méthode "déplacer" qui reçoit deux arguments entiers, correspondant au déplacement en x et y, qui efface (dessine dans la couleur du fond) la figure dans sa position initiale, puis déplace son centre et la redessine.

Question 2.6) : Ecrivez un programme qui fasse un dessin ressemblant à celui ci-contre :

Question 2.7) : Déclarez la classe "dessin" qui contient un ensemble de figures, sous la forme d'un tableau (100 figures maximum), et un entier en définissant le nombre. Vous pouvez prévoir quelques méthodes (uniquement les déclarer).

Question 2.8) : Déclarez et définissez la méthode "déplacer" qui, appliquée à un dessin, reçoit deux arguments entiers, correspondant au déplacement en x et y, qui déplace toutes les figures du dessin.

Remarque : le centre (de gravité) d'un triangle isocèle à base horizontale est placé au dessus du milieu de la base, au tiers de la hauteur du triangle.



correction ? c'est par là !

retour sommaire des sujetsPatrick TRAU, ULP - IPST mars 06