QRectF transition::boundingRect() const{ /*---------------------- * Exactement le meme calcule que pour getP1 et getP2 * Mais le const ne permet pas l'utilisation de * Fonctions internes à la classe -----------------------*/ QPointF T1(n1->getX()+(n1->getWidth()/2),n1->getY()); //centre du T du noeud1 QPointF R1(n1->getX()+n1->getWidth(),n1->getY()+(n1->getHeight()/2)); QPointF B1(n1->getX()+(n1->getWidth()/2),n1->getY()+n1->getHeight()); QPointF L1(n1->getX(),n1->getY()+(n1->getHeight()/2)); QPointF T2(n2->getX()+(n2->getWidth()/2),n2->getY()); //centre du T du noeud1 QPointF R2(n2->getX()+n2->getWidth(),n2->getY()+(n2->getHeight()/2)); QPointF B2(n2->getX()+(n2->getWidth()/2),n2->getY()+n2->getHeight()); QPointF L2(n2->getX(),n2->getY()+(n2->getHeight()/2)); QPointF middleN1(n1->getX()+n1->getWidth()/2,n1->getY()+n1->getHeight()/2); //centre du noeud1 QPointF middleN2(n2->getX()+n2->getWidth()/2,n2->getY()+n2->getHeight()/2); //centre du noeud2 QPointF p1; QPointF p2; //si n1 est en dessou de n2 if( middleN1.y() > middleN2.y() ){ //si n1 est plus a gauche if( middleN1.x() < n2->getX()){ p1 = L1; } //si n1 est plus a droite else if(middleN1.x() > n2->getX()+n2->getWidth()){ p1 = R1; } //si non il est a peut pres au milieu else{ p1 = B1; } } //si n1 est au dessus de n2 else if( middleN1.y() < middleN2.y() ){ //si n1 est plus a gauche if( middleN1.x() < n2->getX()){ p1 = L1; } //si n1 est plus a droite else if(middleN1.x() > n2->getX()+n2->getWidth()){ p1 = R1; } //si non il est a peut pres au milieu else{ p1 = T1; } } //si les noeuds sont alignés horizontalement else if(middleN1.y() == middleN2.y()){ //si n1 est plus a gauche if( middleN1.x() < n2->getX()){ p1 = L1; } //si n1 est plus a droite else if(middleN1.x() > n2->getX()+n2->getWidth()){ p1 = R1; } } //si les noeud sont alignés verticalement else if(middleN1.x() == middleN2.x()){ //si n1 est au dessus de n2 if(middleN1.y() < n2->getY()){ p1 = T1; } //si n1 est en dessous de n2 else if(middleN1.y() > n2->getY()+n2->getHeight()){ p1 = B1; } } //si n1 est en dessou de n2 if( middleN2.y() > middleN1.y() ){ //si n1 est plus a gauche if( middleN2.x() < n1->getX()){ p2 = L2; } //si n1 est plus a droite else if(middleN2.x() > n1->getX()+n1->getWidth()){ p2 = R2; } //si non il est a peut pres au milieu else{ p2 = B2; } } //si n1 est au dessus de n2 else if( middleN2.y() < middleN1.y() ){ //si n1 est plus a gauche if( middleN2.x() < n1->getX()){ p2 = L2; } //si n1 est plus a droite else if(middleN2.x() > n1->getX()+n1->getWidth()){ p2 = R2; } //si non il est a peut pres au milieu else{ p2 = T2; } } //si les noeuds sont alignés horizontalement else if(middleN2.y() == middleN1.y()){ //si n1 est plus a gauche if( middleN2.x() < n1->getX()){ p2 = L2; } //si n1 est plus a droite else if(middleN2.x() > n1->getX()+n1->getWidth()){ p2 = R2; } } //si les noeud sont alignés verticalement else if(middleN2.x() == middleN1.x()){ //si n1 est au dessus de n2 if(middleN2.y() < n1->getY()){ p2 = T2; } //si n1 est en dessous de n2 else if(middleN2.y() > n1->getY()+n1->getHeight()){ p2 = B2; } } /*---------------------------- * Pour des noeud circulaires *--------------------------*/ /* int xCenterNode1 = n1->getX()+n1->getWidth()/2; int yCenterNode1 = n1->getY()+n1->getHeight()/2; int xCenterNode2 = n2->getX()+n2->getWidth()/2; int yCenterNode2 = n2->getY()+n2->getHeight()/2; //determine les coordonés sur le cercle du 2e cercle int longueur_vecteur = sqrt(pow(xCenterNode2-xCenterNode1,2)+pow(yCenterNode2-yCenterNode1,2)); int longueur_rayon = n2->getWidth()/2; int ratio = longueur_vecteur/longueur_rayon; int x1_2 = xCenterNode1-xCenterNode2; //corrdonée du grand vecteur p1->p2 int y1_2 = yCenterNode1-yCenterNode2; //divise enssuite les coordonée du vecteur par le ratio int nx1_2 = x1_2/ratio; int ny1_2 = y1_2/ratio; int px2 = xCenterNode2+nx1_2; int py2 = yCenterNode2+ny1_2; //determine les coodronés sur le cercle du 1er crecle int px1 = nx1_2-xCenterNode1; int py1 = ny1_2-yCenterNode1; px1 = (-1)*px1; py1 = (-1)*py1; QPointF tmp_p1(px1,py1); QPointF tmp_p2(px2,py2); */ QRectF rect(p1,p2); return rect; }
// Default constructor triple() : first(T1()), second(T2()), third(T3()) {}
constexpr auto operator() (T t_) const{ return T1()(t_)*T2()(t_); }
QList<char> start(QVector<double> params) { return r1.productionRules({params[0] + 3,0 }) + r2.productionRules({params[0] + 2,0}) + r3.productionRules({params[0] + 3, 0}) + T1().symbol({0,0}) + T2().symbol({0,0}); }
//solution exercice 1 constexpr int sum_ops() const { return T1().sum_ops()+T2().sum_ops(); }
constexpr int mult_ops() const { return T1().mult_ops()+T2().mult_ops()+1; }
std::string to_string() const { return std::string("(") + T1().to_string() + " * " + T2().to_string() + std::string(")") ; }
namespace wrapper { template <class T0, class T1> auto logaddexp2(T0 const &t0, T1 const &t1) -> decltype(nt2::log2(nt2::pow(T0(2), t0) + nt2::pow(T1(2), t1))); }
quadruple() : first(T1()), second(T2()), third(T3()), fourth(T4()) {}
pair() : first(T1()), second(T2()) {}
//constructor Translator::Translator(std::ifstream& in) { TranslationTable<std::string, int> T1(in); TranslationTable<int, std::string> T2(in); }