Forum de la communauté SFML

Aide => Général => Discussion démarrée par: yhu420 le Janvier 04, 2014, 01:58:28 pm

Titre: Problème de points avec convexShape
Posté par: yhu420 le Janvier 04, 2014, 01:58:28 pm
Bonjour tout le monde,
Je rencontre un problème avec ConvexShape, mais je suis quasiment certain que c'est de ma faute..
J'essaye de faire un rectangle arrondi mais le résulat ne suit pas  :-[ j'ai qulques points qui se trouvent a des endroits improbables( voir la piece jointe ) j'ai entouré, pour un coin, deux points qui ne sont meme pas listé dans ma shape et tracé en vert la forme qu'elle devrait normalement avoir.
Evidemment vous ne pourrez pas m’aider sans code:
C'est long, mais la moitié c'est du "debug"  ;)
RoundRect::RoundRect(const sf::Vector2f& position, const sf::Vector2f& dimensions,const float& borderRadius,  const int unsigned& pointCount)
{
        unsigned int i;
        m_shape.setPointCount(pointCount*4); // m_shape est un sf::conexshape
        for(i=0;i<pointCount;++i) //ANGLE 1
        {
                m_shape.setPoint(i, sf::Vector2f(position.x - borderRadius*std::sinf((i*PI)/((pointCount-1)*2)),position.y - borderRadius*std::cosf((i*PI)/((pointCount-1)*2))));
                std::cout << "PosX du point " << i << ": " << m_shape.getPoint(i).x << std::endl;
                std::cout << "PosY du point " << i << ": " << m_shape.getPoint(i).y << std::endl;
        }
        for(i=pointCount; i<pointCount*2; i++)
        {
                m_shape.setPoint(i, sf::Vector2f(position.x + dimensions.x + borderRadius - borderRadius*std::cosf((i*PI)/((pointCount-1)*2)),position.y - borderRadius*std::sinf((i*PI)/((pointCount-1)*2))));
                std::cout << "PosX du point " << i << ": " << m_shape.getPoint(i).x << std::endl;
                std::cout << "PosY du point " << i << ": " << m_shape.getPoint(i).y << std::endl;
        }
        for(i=pointCount*2; i<pointCount*3; i++)
        {
                m_shape.setPoint(i, sf::Vector2f(position.x + dimensions.x - borderRadius*std::sinf((i*PI)/((pointCount-1)*2)),position.y + dimensions.y - borderRadius + borderRadius*std::sinf((i*PI)/((pointCount-1)*2))));
                std::cout << "PosX du point " << i << ": " << m_shape.getPoint(i).x << std::endl;
                std::cout << "PosY du point " << i << ": " << m_shape.getPoint(i).y << std::endl;
        }
        for(i=pointCount*3; i<pointCount*4; i++)
        {
                m_shape.setPoint(i, sf::Vector2f(position.x + borderRadius - borderRadius*std::sinf((i*PI)/((pointCount-1)*2)), position.y + dimensions.y - borderRadius*std::sinf((i*PI)/((pointCount-1)*2))));
                std::cout << "PosX du point " << i << ": " << m_shape.getPoint(i).x << std::endl;
                std::cout << "PosY du point " << i << ": " << m_shape.getPoint(i).y << std::endl;
        }
        update();
}
 
Est-ce que quelqu'un sait d'où ca vient  :o
Merci
Titre: Re : Problème de points avec conexShape
Posté par: Nexus le Janvier 04, 2014, 02:35:17 pm
J'ai implementé cela dans Thor, peut-être la fonction roundedRect() (http://www.bromeon.ch/libraries/thor/v2.0/doc/namespacethor_1_1_shapes.html#aea2630f9feca60c36025573c4b956175) peut t'aider? :)
Titre: Re : Problème de points avec conexShape
Posté par: yhu420 le Janvier 04, 2014, 04:44:22 pm
J'ai implementé cela dans Thor, peut-être la fonction roundedRect() (http://www.bromeon.ch/libraries/thor/v2.0/doc/namespacethor_1_1_shapes.html#aea2630f9feca60c36025573c4b956175) peut t'aider? :)
Ouais ca pourrait m'aider, mais le truc c'est que je suis pas super fort en programmation et tout et si j'espere faire un programme complet un jour je préfererai tout faire moi meme et pouvoir dire "c'est moi qui l'ai fait" plutot que "j'ai tout trouvé sur internet" et aussi (surtout) j'ai pas la foi d'installer des tonnes de librairies..
Merci tout de meme pour la suggestion  :D
Titre: Re : Problème de points avec conexShape
Posté par: Nexus le Janvier 04, 2014, 04:54:59 pm
Tu ne peux jamais dire que c'est toi qui a tout fait, car tu utilises beaucoup de téchnologie existante (SFML, C++, ...) ;)

Thor est open-source, alors tu peux regarder son code et le comparer avec le tien. Il ne faut pas installer la bibliothèque pour ça.
Titre: Re : Problème de points avec convexShape
Posté par: yhu420 le Janvier 05, 2014, 12:27:26 pm
Trop tard j'ai trouvé  ;D si quelqu'un est interressé par une classe RoundRect, ajoutez vous meme les couleurs!
RoundRect::RoundRect(const sf::Vector2f& position, const sf::Vector2f& dimensions,const float& borderRadius,  const int unsigned& pointCount)
{
        unsigned int i;
        m_shape.setPointCount(pointCount*4);
        for(i=0;i<pointCount;++i) //ANGLE 1
        {
                m_shape.setPoint(i, sf::Vector2f(position.x +borderRadius - borderRadius*std::cosf((i*PI)/((pointCount-1)*2)),position.y +borderRadius - borderRadius*std::sinf((i*PI)/((pointCount-1)*2))));
                //std::cout << "PosX of point " << i << ": " << m_shape.getPoint(i).x << std::endl;
                //std::cout << "PosY of point " << i << ": " << m_shape.getPoint(i).y << std::endl;
        }
        for(i=0;i<pointCount;++i)
        {
                m_shape.setPoint(i+pointCount, sf::Vector2f(position.x -borderRadius+ dimensions.x + borderRadius*std::sinf((i*PI)/((pointCount-1)*2)),position.y +borderRadius- borderRadius*std::cosf((i*PI)/((pointCount-1)*2))));
                //std::cout << "PosX of point " << i+pointCount << ": " << m_shape.getPoint(i+pointCount).x << std::endl;
                //std::cout << "PosY of point " << i+pointCount << ": " << m_shape.getPoint(i+pointCount).y << std::endl;
        }
        for(i=0;i<pointCount;++i)
        {//was with sin sin
                m_shape.setPoint(i+pointCount*2, sf::Vector2f(position.x + dimensions.x -borderRadius+ borderRadius*std::cosf((i*PI)/((pointCount-1)*2)),position.y + dimensions.y - borderRadius + borderRadius*std::sinf((i*PI)/((pointCount-1)*2))));//Both cos used to be sin
                //std::cout << "PosX of point " << i+pointCount*2 << ": " << m_shape.getPoint(i+pointCount*2).x << std::endl;
                //std::cout << "PosY of point " << i+pointCount*2 << ": " << m_shape.getPoint(i+pointCount*2).y << std::endl;
        }
        for(i=0;i<pointCount;++i)
        {
                m_shape.setPoint(i+pointCount*3, sf::Vector2f(position.x + borderRadius - borderRadius*std::sinf((i*PI)/((pointCount-1)*2)), position.y -borderRadius+ dimensions.y + borderRadius*std::cosf((i*PI)/((pointCount-1)*2))));
                //std::cout << "PosX of point " << i+pointCount*3 << ": " << m_shape.getPoint(i+pointCount*3).x << std::endl;
                //std::cout << "PosY of point " << i+pointCount*3 << ": " << m_shape.getPoint(i+pointCount*3).y << std::endl;
        }
        update();
}