#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(); }
Patrick
TRAU, ULP - IPST
fev 06