#include "matr9d.h" template< class T1, class T2> class Opfois{ public: inline Opfois(T1 op1, T2 op2):p1(op1),p2(op2){} inline Opfois(){} T1 p1; T2 p2; inline decltype(p1.eval()*p2.eval()) eval(){return p1.eval()*p2.eval();} }; template< class T1, class T2> class Opplus{ public: inline Opplus(T1 op1, T2 op2):p1(op1),p2(op2){} inline Opplus(){} T1 p1; T2 p2; inline decltype(p1.eval()+p2.eval()) eval(){return p1.eval()+p2.eval();} }; template< class T1, class T2> class Opmoins{ public: inline Opmoins(T1 op1, T2 op2):p1(op1),p2(op2){} inline Opmoins(){} T1 p1; T2 p2; inline decltype(p1.eval()-p2.eval()) eval(){return p1.eval()-p2.eval();} }; template< class T1, class T2> class Opvectorielle{ public: inline Opvectorielle(){} inline Opvectorielle(T1 op1, T2 op2):p1(op1),p2(op2){} T1 p1; T2 p2; inline decltype(p1.eval()^p2.eval()) eval(){return p1.eval()^p2.eval();} }; template inline decltype(derive(T1())-derive(T2())) derive(Opmoins const&a){return derive(a.p1)-derive(a.p2);} template inline decltype(derive(T1())+derive(T2())) derive(Opplus const&a){return derive(a.p1)+derive(a.p2);} template inline decltype(derive(T1())*T2()+T1()*derive(T2())) derive(Opfois const&a){return derive(a.p1)*a.p2+a.p1*derive(a.p2);} template< class T1, class T2> inline decltype((derive(T1())^T2())+(T1()^derive(T2()))) derive(Opvectorielle const&a){return (derive(a.p1)^a.p2)+(a.p1^derive(a.p2));} template inline Opplus operator+(T1 const&a,T2 const&b){return Opplus(a,b);} template inline Opmoins operator-(T1 const&a,T2 const&b){return Opmoins(a,b);} template inline Opfois operator*(T1 const&a,T2 const&b){return Opfois(a,b);} template inline Opvectorielle operator^(T1 const&a,T2 const&b){return Opvectorielle(a,b);} class Solide; class Dw2{ public: Solide *a; inline Dw2(Solide &b){a=&b;} inline Dw2(){} inline Vect3d eval(); }; class Dw{ public: Solide *a; inline Dw(){} inline Dw(Solide &b){a=&b;} inline Vect3d eval(); }; class DMatr9d{ public: Solide *a; inline DMatr9d(){} inline DMatr9d(Solide &b){a=&b;} inline Matr9d eval(); }; class Dacc{ public: Solide *a; inline Dacc(){} inline Dacc(Solide &b){a=&b;} inline Vect3d eval(); }; class Dvit{ public: Solide *a; inline Dvit(){} inline Dvit(Solide &b){a=&b;} inline Vect3d eval(); }; class Dpos{ public: Solide *a; inline Dpos(){} inline Dpos(Solide &b){a=&b;} inline Vect3d eval(); }; inline Dvit derive(Dpos const&s){return Dvit(*s.a);} inline Dacc derive(Dvit const&s){return Dacc(*s.a);} inline Opvectorielle derive(DMatr9d const&s){return Opvectorielle(Dw(*s.a),s);} inline Dw2 derive(Dw const&s){return Dw2(*s.a);} class Solide{ public: Matr9d rot; Vect3d w; Vect3d w2; Vect3d pos; Vect3d vit; Vect3d acc; }; inline Matr9d DMatr9d::eval(){return (*a).rot;} inline Vect3d Dw::eval(){return (*a).w;} inline Vect3d Dw2::eval(){return (*a).w2;} inline Vect3d Dpos::eval(){return (*a).pos;} inline Vect3d Dvit::eval(){return (*a).vit;} inline Vect3d Dacc::eval(){return (*a).acc;}