retour sujet

correction tcp19 fc mars 06


//1: allume de la couleur du fond (donc efface) le point au milieu de la fenetre

//2.1
class figure {
  int typ,x,y,a,b,coul;
 public :
  void set_droite(int xc, int yc, int couleur, int l, int h);
  void set_cercle(int xc, int yc, int couleur, int diam);
  void set_croix(int xc, int yc, int couleur, int l, int h);
  void set_rectangle(int xc, int yc, int couleur, int l, int h);
  void set_triangle(int xc, int yc, int couleur, int l, int h);
  int get_x_centre(void);
  int get_y_centre(void);
  int get_couleur(void);
  int get_x_min(void);
  int get_y_min(void); 
  int get_x_max(void);
  int get_y_max(void); 
  void dessiner(fenetre f);
  void deplacer(int dx,int dy);
};

//2.2
void figure::set_droite(int xc, int yc, int couleur, int l, int h)
 {
  x=xc;y=yc;coul=couleur;a=l;b=h;
  if(h==0)typ=1;
  else if(l==0)typ=2;
  else typ=3;
 }
void figure::set_cercle(int xc, int yc, int couleur, int diam)
 { x=xc;y=yc;coul=couleur;a=diam;b=diam;typ=4; }
void figure::set_croix(int xc, int yc, int couleur, int l, int h)
 { x=xc;y=yc;coul=couleur;a=l;b=h;typ=5; }
void figure::set_rectangle(int xc, int yc, int couleur, int l, int h)
 { x=xc;y=yc;coul=couleur;a=l;b=h;typ=6; }
void figure::set_triangle(int xc, int yc, int couleur, int l, int h)
 { x=xc;y=yc;coul=couleur;a=l;b=h;typ=7; }

//2.3
int figure::get_x_centre(void)   {return x;}
int figure::get_y_centre(void)   {return y;}
int figure::get_couleur(void)    {return coul;}
int figure::get_x_min(void)   { return (x-abs(a/2)); }
int figure::get_x_max(void)   { return (x+abs(a/2)); }
int figure::get_y_min(void)  //il n'y a que pour type 7 que le centre n'est pas au milieu 
 { 
   if(typ==7)return (y-abs(b/3));
   else return (y-abs(b/2)); 
 }
int figure::get_y_max(void)
 { 
   if(typ==7)return (y+abs(2*b)/3);
   else return (y+abs(b/2)); 
 }

//2.4
void figure::dessiner(fenetre f)
 {
  int i;
  figure lig;
  if(typ==1) 
   {
    for(i=get_x_min();i<=get_x_max();i++) f.allume(i,y,coul);
   }
  else if(typ==2) 
   {
    for(i=get_y_min();i<=get_y_max();i++) f.allume(x,i,coul);
   }
  else if(typ==5)
   {
    lig.set_droite(x,get_y_min(),coul,a,0); //horizontale du bas
    lig.dessiner(f); 
    lig.set_droite(x,get_y_max(),coul,a,0); //haut
    lig.dessiner(f);
    lig.set_droite(get_x_min(),y,coul,0,b); //gauche
    lig.dessiner(f);
    lig.set_droite(get_x_max(),y,coul,0,b); //droite
    lig.dessiner(f);
   }
 }

//2.5
void figure::deplacer(int dx,int dy) //je suppose f globale car elle n'est pas en argument
 {
  int coul_initiale;
  coul_initiale=coul;
  coul=f.get_couleur_fond(); 
  dessiner(f);
  x=x+dx;y=y+dy;
  coul=coul_initiale;
  dessiner(f);
 }

//2.6
int main(void)
 {
  fenetre f;
  int c=18; //couleur au pif
  figure tete,corps,brasd,brasg,jg,jd;

  f.ouvrir_graphique();

  tete.set_cercle(5,10,c,4);
  corps.set_rectangle(5,6,c,4,4);
  brasg.set_droite(2,6,c,2,2);
  brasd.set_droite(8,6,c,2,-2);
  jg.set_droite(3,2,c,4,0);
  jd.set_droite(5,2,c,4,0);

  tete.dessiner(f);
  corps.dessiner(f);
  brasg.dessiner(f);
  brasd.dessiner(f);
  jg.dessiner(f);
  jd.dessiner(f);
 
  f.fermer_graphique();
 }

//2.7
#define DIM 100
class dessin {
  figure f[DIM];
  int nb;
 public :
  void saisie(void);
  void dessiner(fenetre f);
  void ajouter(figure f); //rajoute f en plus de celles qu y sont deja 
  void deplacer(int dx,int dy);
 };

//2.8
void dessin::deplacer(int dx,int dy)
 {
  int i;
  for(i=0;i<nb;i++) f[i].deplacer(dx,dy);
 }

retour sujet

Patrick TRAU, ULP - IPST 31 mars 2006