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;
}
Beispiel #2
0
 // Default constructor
 triple() : first(T1()), second(T2()), third(T3()) {}
 constexpr auto  operator() (T t_) const{
     return T1()(t_)*T2()(t_);
 }
Beispiel #4
0
 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(")") ;
 }
Beispiel #8
0
 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)));
 }
Beispiel #9
0
 quadruple() : first(T1()), second(T2()), third(T3()), fourth(T4()) {}
Beispiel #10
0
 pair() : first(T1()), second(T2()) {}
//constructor
Translator::Translator(std::ifstream& in) {

    TranslationTable<std::string, int> T1(in);
    TranslationTable<int, std::string> T2(in);
}