/**
     * @Inherit
     */
    inline virtual void draw(SimViewer::SimViewer& viewer,
                             const Vector2D& posRoot, scalar angleRoot,
                             const Vector2D& posLeaf, scalar angleLeaf,
                             scalar value)
    {
        // Joint::draw(viewer, posRoot, angleRoot,
        //             posLeaf, angleLeaf, value);




        Vector2D pos_j = posRoot + Vector2D::rotate(
            Joint::getPosRoot(), angleRoot);

        viewer.drawJoint(pos_j.x(), pos_j.y(),
                         (Joint::getAngleRoot()+angleRoot)*180.0/M_PI,
                         (value)*180.0/M_PI);

        Vector2D pos = posLeaf + Vector2D::rotate(
            Joint::getPosLeaf(), angleLeaf);

        viewer.drawSegmentByEnd(posRoot.x(),posRoot.y(), pos_j.x(),pos_j.y() ,0.05,sf::Color(0,200,0,100));

        // viewer.drawJoint(pos.x(), pos.y(),
        //     (Joint::getAngleRoot()+angleRoot)*180.0/M_PI,
        //     (value)*180.0/M_PI);


        double ori=(Joint::getAngleLeaf()+angleLeaf);

        Vector2D rot;

        //Draw the cam
        Vector2D pos_r=pos;
        Vector2D pos_l=pos;
        double x=0.0;
        double y=0.0;

        Leph::Symbolic::Bounder bounder;
        SymbolPtr xs = Symbol::create("x");


        for(int i=0;i<100;i++)
        {
            x+=.3/100.0;
            xs->reset();
            bounder.setValue(xs,x);
            // y=F(x);
            y=_F(xs)->evaluate(bounder);



            rot=Vector2D::rotate(Vector2D(x,y),ori+M_PI);

            viewer.drawSegmentByEnd(pos_r.x(),pos_r.y(), pos.x()+rot.x(),pos.y()+rot.y() ,0.01,sf::Color(200,200,200,100));
            pos_r=Vector2D(pos.x()+rot.x(), pos.y()+rot.y());
            xs->reset();
            bounder.setValue(xs,-x);
            y=_F(xs)->evaluate(bounder);
            // y=F(-x);
            rot=Vector2D::rotate(Vector2D(-x,y),ori+M_PI);

            viewer.drawSegmentByEnd(pos_l.x(),pos_l.y(), pos.x()+rot.x(),pos.y()+rot.y() ,0.01,sf::Color(200,200,200,100));
            pos_l=Vector2D(pos.x()+rot.x(), pos.y()+rot.y());


        }



        viewer.drawSegment(pos.x(),pos.y(),_sH*2.0,(Joint::getAngleLeaf()+angleLeaf-M_PI/2.0)*180.0/M_PI,0.05,sf::Color(255,255,255,100));


        viewer.drawSegment(pos_j.x(),pos_j.y(),_sH,((Joint::getAngleRoot()+angleRoot)+M_PI/2.0-_sphi)*180.0/M_PI,0.01,sf::Color(255,0,255,100));

        viewer.drawCircle(pos_j.x()+_sH*cos((Joint::getAngleRoot()+angleRoot)+M_PI/2.0-_sphi),pos_j.y()+_sH*sin((Joint::getAngleRoot()+angleRoot)+M_PI/2.0-_sphi),0.03,sf::Color(255,0,255,100));

        viewer.drawCircle(pos.x(),pos.y(),0.03,sf::Color(255,255,255,255));


        //Draw spring
        Vector2D pos1 = posRoot + Vector2D::rotate(
            Joint::getPosRoot(), angleRoot);
        Vector2D pos2 = posLeaf + Vector2D::rotate(
            Joint::getPosLeaf(), angleLeaf);

        double zval=Vector2D::dist(pos1,pos2);

        scalar tmp=zval/10.0;
        scalar sig=1.0;
        Vector2D tmppos=pos1;
        scalar angle=atan2(pos2.y()-pos1.y(),pos2.x()-pos1.x());

        Vector2D tmpnew=tmppos+Vector2D::rotate(Vector2D(0.1*sig,tmp), angle+M_PI/2.0+M_PI);

        viewer.drawSegmentByEnd(tmppos.x(),tmppos.y(), tmpnew.x(),tmpnew.y(),0.01,sf::Color(200,200,200,100));

        tmppos=tmpnew;
        sig*=-1.0;

        tmp=zval/5.0;


        for(int i=1;i<5;i++)
        {
            tmpnew=tmppos+Vector2D::rotate(Vector2D(0.2*sig,tmp), angle+M_PI/2.0+M_PI);

            viewer.drawSegmentByEnd(tmppos.x(),tmppos.y(), tmpnew.x(),tmpnew.y(),0.01,sf::Color(200,200,200,100));

            tmppos=tmpnew;
            sig*=-1.0;

        }
        tmp=zval/10.0;

        tmpnew=tmppos+Vector2D::rotate(Vector2D(0.1*sig,tmp), angle+M_PI/2.0+M_PI);
        viewer.drawSegmentByEnd(tmppos.x(),tmppos.y(), tmpnew.x(),tmpnew.y(),0.01,sf::Color(200,200,200,100));

    }
Esempio n. 2
0
        /**
         * @Inherit
         */
        inline virtual void draw(SimViewer::SimViewer& viewer,
            const Vector2D& posRoot, scalar angleRoot,
            const Vector2D& posLeaf, scalar angleLeaf,
            scalar value)
        {
            Joint::draw(viewer, posRoot, angleRoot,
                posLeaf, angleLeaf, value);

            // Vector2D pos = posRoot + Vector2D::rotate(
            //     Joint::getPosRoot(), angleRoot);

            Vector2D pos = posLeaf + Vector2D::rotate(
                Joint::getPosLeaf(), angleLeaf);

            viewer.drawJoint(pos.x(), pos.y(),
                (Joint::getAngleRoot()+angleRoot)*180.0/M_PI,
                (value)*180.0/M_PI);

            pos = posRoot + Vector2D::rotate(
                Joint::getPosRoot(), angleRoot);

            double ori=(Joint::getAngleRoot()+angleRoot);

            Vector2D rot;

                //Draw the cam
            Vector2D pos_r=pos;
            Vector2D pos_l=pos;
            double x=0.0;
            double y=0.0;

            Leph::Symbolic::Bounder bounder;
            SymbolPtr xs = Symbol::create("x");

            for(int i=0;i<100;i++)
            {

                x+=.3/100.0;
                xs->reset();
                bounder.setValue(xs,x);
                // y=F(x);
                y=_F(xs)->evaluate(bounder);

                // std::cout<<"x: "<<x<<" "<<xs->evaluate(bounder)<<" y: "<<y<<std::endl;


                rot=Vector2D::rotate(Vector2D(x,y),ori);

                viewer.drawSegmentByEnd(pos_r.x(),pos_r.y(), pos.x()+rot.x(),pos.y()+rot.y() ,0.01,sf::Color(200,200,200,100));
                pos_r=Vector2D(pos.x()+rot.x(), pos.y()+rot.y());

                xs->reset();
                bounder.setValue(xs,-x);
                y=_F(xs)->evaluate(bounder);
                // y=F(-x);
                rot=Vector2D::rotate(Vector2D(-x,y),ori);

                viewer.drawSegmentByEnd(pos_l.x(),pos_l.y(), pos.x()+rot.x(),pos.y()+rot.y() ,0.01,sf::Color(200,200,200,100));
                pos_l=Vector2D(pos.x()+rot.x(), pos.y()+rot.y());


            }

            viewer.drawSegment(pos.x(),pos.y(),_sH*2.0,((Joint::getAngleRoot()+angleRoot)+M_PI/2.0)*180.0/M_PI,0.05,sf::Color(255,255,255,100));

                //Draw the lever
            viewer.drawSegment(posLeaf.x(),posLeaf.y(),_sH,(angleLeaf-M_PI/2.0)*180.0/M_PI,0.01,sf::Color(255,0,255,100));
            viewer.drawCircle(posLeaf.x()+_sH*cos(angleLeaf-M_PI/2.0),posLeaf.y()+_sH*sin(angleLeaf-M_PI/2.0),0.03,sf::Color(255,0,255,100));
            viewer.drawCircle(pos.x(),pos.y(),0.03,sf::Color(255,255,255,255));

        }