retour au sujet

Master Ingénierie et Technologies

Correction second contrôle continu

Génie informatique 2006

#include <iostream.h>
#include <math.h>
class matrice; //pour pouvoir l'utiliser dans point

class point
 {
  float x,y;
 public:
  float get_x(void);
  float get_y(void);
  void set(float dx,float dy);
  void saisie(void); //hors sujet
  void affiche(void); //hors sujet
  void bouger(matrice m);
 };

class matrice
 {
  public :
  matrice * suiv; //en prevision de la question 5
  float a,b,c,d,e,f;
  void set(float da,float db,float dc,float dd,float de,float df);
  void set_rotation(float t);
  void set_rot_gene(float t,point p);
  void set_translation(float dx,float dy);
  void set_identite(void);
  void affiche(void); //pour question  6
  void produit(matrice A,matrice B);
 };

//les méthodes du point
float point::get_x(void)
 {return x;}
float point::get_y(void)
 {return y;} 
void point::set(float dx,float dy)
 {x=dx;y=dy;}
void point::saisie(void) //hors sujet
 {
  cout<<"coordonnées du point ? ";
  cin>>x;
  cin>>y;
 }
void point::affiche(void) //hors sujet
 {cout<<"["<<x<<","<<y<<",1]";}
void point::bouger(matrice m)
 {
  float rx,ry; //attention, ne pas changer x avant de s'en servir !
  rx=m.a*x+m.b*y+m.c;
  ry=m.d*x+m.e*y+m.f;
  x=rx;
  y=ry;
 }


// les méthodes de la matrice
void matrice::set(float da,float db,float dc,float dd,float de,float df)
   {a=da;b=db;c=dc;d=dd;e=de;f=df;}
void matrice::set_rotation(float t)
   {a=cos(t);b=sin(t);c=0;d=-sin(t);e=cos(t);f=0;}
void matrice::set_translation(float dx,float dy)
   {a=1;b=0;c=dx,d=0;e=1;f=dy;}
void matrice::set_identite(void)
   {a=e=1;b=c=d=f=0;}
void matrice::produit(matrice A,matrice B)
   {
    a=A.a*B.a+A.b*B.d;
    b=A.a*B.b+A.b*B.e;
    c=A.a*B.c+A.b*B.f+A.c;
    d=A.d*B.a+A.e*B.d;
    e=A.d*B.b+A.e*B.e;
    f=A.d*B.f+A.e*B.f+A.f;
   }
void matrice::set_rot_gene(float t,point p)
 {
  matrice trans,rot,tmp;
  trans.set_translation(p.get_x(),p.get_y());
  rot.set_rotation(t);
  tmp.produit(trans,rot);
  trans.set_translation(-p.get_x(),-p.get_y());
  produit(tmp,trans);
 }
void matrice::affiche(void) 
 {cout<<"["<<a<<","<<b<<","<<c<<"|"<<d<<","<<e<<","<<f<<"]";}

typedef matrice * ptr;
class chaine
 {
  ptr prem;
  public:
  void creation(void);
  void affiche(void); 
 };
void chaine::affiche(void)
 {
  ptr actu;
  actu=prem;
  while(actu!=NULL)
   {
    actu->affiche();cout<<"\n";
    actu=actu->suiv;
   }
 }
 
void chaine::creation(void)
 {
  ptr tmp,tmp2;
  int i;
  prem=new matrice;
  prem->set_rotation(3.14159265358979);
  tmp=new matrice;
  prem->suiv=tmp;
  tmp->set_translation(2,2);
  for (i=0;i<3;i++)
   {
    tmp2=new matrice;
    tmp2->set_identite();
    tmp->suiv=tmp2;
    tmp=tmp2;
   }
  tmp->suiv=NULL;
 }

int main(void) //hors sujet, juste pour les tests
 { 
  chaine c;
  matrice m;
  point p;
  p.set(1,2);
  m.set_identite();
  m.affiche();
  cout<<"\n";
  m.set_rot_gene(3.1416926,p);
  m.affiche();
  cout<<"\n";
  p.set(1,0);
  p.bouger(m);
  p.affiche();
  cout<<"\n";
  c.creation();
  c.affiche();
 }


retour au sujet Patrick TRAU, ULP - IPST fev 06