IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Dessiner une flèche dans un QCanvas ?


Sujet :

Qt

  1. #21
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    as tu compris mon shemat???

  2. #22
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    ben non ...

    d correspond à quoi ???
    dans les formules , il y a des vecteurs (L et N) ... mais comment je fais ça en C++??

  3. #23
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Oui, je comprends, c'est pas compliqué non plus. Par contre, si je te donnais un angle varaible ce n'est pas pour rien, car sinon ta pointe va sans cesse pointer dans le même sens.

    mon explication avec el calcul, te donne le calcul des coordonées du point lineStart, ce qui ce voit d'ailleurs.

    il te suffit d'imaginer les triangles rectangles là où il faut et appliquer des sinus et des cosinus.
    Encore plus simple si l'idée de faire de la trigo te pique les yeux : prends un angle (noté alpha sur mon schema) entre les lignes de la pointe et la ligne de la fleche egal a 45 degres, du coup, plus de sinus ni cosinus puisque tu te retrouves avec des lignes horizontales ou verticales :





    là tu vois bien qu'en connaissant la position de la pointe, la position des autres points se déduit bêtement en ajoutant/soustrayant la longeur des lignes des pointes.

    Après cela, je ne pourrais rien faire de plus pour toi.
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  4. #24
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Kestufou Voir le message
    là tu vois bien qu'en connaissant la position de la pointe, la position des autres points se déduit bêtement en ajoutant/soustrayant la longeur des lignes des pointes.
    Ben non justement , je ne vois pas ...
    SI je demande c'est que je ne sais pas comment faire...
    Comment je fais pour calculer les coordonnées des points "left" et "right" sachant que je connais la ligne qui va du point "LineStart" au point "LineStop" (point TOP sur le dernier dessin) ????????

    Merci

  5. #25
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par nouncyr Voir le message
    ben non ...

    d correspond à quoi ???
    dans les formules , il y a des vecteurs (L et N) ... mais comment je fais ça en C++??
    d est la demi longueur en pixel de la base de ta flèche
    h est la hauteur en pixel de ta flèche (je l'avais oublié)
    L =B-A que tu normalise
    Pour N, pose Nx =1 et resoud Lx+Ny*Ly =0 =>Ny =-Lx/Ly; puis tu la normalise.

    Ceci te permet d'obtenir deux points :
    N1 = B - h*L + d*N
    N2 = B - h*L - d*N
    Sert toi du dessin pour comprendre

  6. #26
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Y as un exemple pour dessiner une horloge avec les QPainter :
    http://qt.developpez.com/doc/3.3/aclock-example/
    et exemple sur les cancas
    http://qt.developpez.com/doc/3.3/canvas-example/

  7. #27
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    sérieusement, tu vois vraiment pas ?

    on est bien d'accord qu'un point possède une abscisse x et une ordonnée y.

    sur mon schema, Left est à la même ordonnée que Top, donc la composante y de Left est la même que Top, son abscisse, elle, est un peu en retrait, de la longeur de la ligne qui relie Top et Left. On a donc abscisse de Left = abscisse de Top - longeur de la ligne.

    Imagine que ton point Top est situé en (500; 600) et que la longueur de la ligne est de 15 points, on aura les coordonnées de Left qui sont les suivantes (500-15; 600).

    Pour le point right, tu remplaces tu raisonnes pareil en transposant sur l'axe vertical :

    Right est à la même abscisse que top, et en dessous de lui d'une distance égale à la longueur de la ligne qui les sépare. on a donc Right (500;600+15)
    Pourquoi j'ai mis +15 et pas -15 pour l'ordonnée ? car comme je t'ai dis, le coin haut gauche de ton écran est le coin (0;0), donc les ordonnées augmentent vers le bas !!
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  8. #28
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Oui j'avais compris mais ça c'est pour ton exemple de flèche...
    Moi , il faudrait que ma flèche puisse s'orienter dans tout les sens donc ton exemple ne fonctionnera pas...

  9. #29
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    L =B-A que tu normalise
    Oui d'accord mais comment je fais pour normaliser ???

    Pour N, pose Nx =1 et resoud Lx+Ny*Ly =0 =>Ny =-Lx/Ly; puis tu la normalise.
    Pas compris

  10. #30
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Si tu regarde l'exemple de la clock,
    c'est moins compliqué.

    Tu peut utiliser rotate, translate,.... sur le QPainter qui va dessiner ta flêche.

  11. #31
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    voici un exemple.
    C'est fait avec le support de QT3 dans Qt4, Il faut donc que tu adapte le nom des class Qt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    #include <Qt3Support>
    #include <QtGui>
    class myItem : public Q3CanvasLine
    {
    public :
        myItem(Q3Canvas * canvas ) :Q3CanvasLine(canvas)
        {
        }
        void drawShape  ( QPainter & painter )
        {
            //dessine la ligne avec Q3CanvasLine::drawShape
            Q3CanvasLine::drawShape(painter);
     
            //Calcul le vecteur B-A
            QPoint L = endPoint()-startPoint ();
            //distance
            double distance = sqrt((double)L.x()*L.x() +L.y()*L.y());
            //sauvegarde l'etat du painter
            painter.save();
                //initialise le pen
                painter.setPen(pen());
     
                //position le painter pour que (0,0) correspond au point A
                painter.translate(startPoint());
     
                //oriente la direction du painter
                painter.rotate(180./3.14159265*atan2((double)L.y(),(double)L.x()));
     
                //dessine la fleche
                painter.drawLine(distance,0,distance-10,10);
                painter.drawLine(distance,0,distance-10,-10);
            //restore l'etat du painter
            painter.restore();
        }
    };
     
    int main(int argc,char ** argv)
    {
    	QApplication app(argc,argv);
     
    	Q3CanvasView w(new Q3Canvas(800,600));
     
     
        myItem *item = new myItem(w.canvas());
        item->setPoints (10,10,100,200);
        item->setZ(1);
        item->show();
     
        item = new myItem(w.canvas());
        item->setPoints (100,200,0,200);
        item->setZ(1);
        item->show();
        w.show();
        return app.exec();
    }

  12. #32
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup Mongaulois !

    C'est exactement ce que je cherchais ...
    Je te remercie énormément !

    @ bientot

  13. #33
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par nouncyr Voir le message
    C'est exactement ce que je cherchais ...
    As tu compris le code?

  14. #34
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Pas tout à fait ...

    Je n'ai pas trop compris le translate et le rotate ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Swing][Graphics2D] dessiner une flèche
    Par Galima dans le forum 2D
    Réponses: 13
    Dernier message: 03/12/2011, 23h31
  2. Dessiner une parabole dans un repère cartésien
    Par guynono dans le forum Graphisme
    Réponses: 4
    Dernier message: 06/07/2006, 11h33
  3. Réponses: 5
    Dernier message: 21/07/2005, 19h20
  4. Comment dessiner une ligne dans un Chart ?
    Par libititi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2005, 14h56
  5. Dessiner une ligne dans un cube transparent ?
    Par Muetdhiver dans le forum OpenGL
    Réponses: 4
    Dernier message: 04/05/2004, 11h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo