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

Discussion :

Échelle de coordonnées 2D [2D/3D]

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut Échelle de coordonnées 2D
    salut a tous

    j'ai une QGraphicsView qui affiche un QGraphicsscene qui contient un plan 2D de pièces mecaniques (lignes-points-rectangles-cercles-arcs ...)

    ma QGraphicsView contient un Zoom et le DragMode :ScrollHandDrag et tout marche bien

    j'aimerais bien ajouter un repère d'axes gradué 2D (axe-X en haut et axe-Y a gauche) qui affiche les coordonnées et qui change automatiquement avec la fonction zoom

    est ce que quelqu'un a un connait un code qui fait ça ou une idée pour commencer?

    merci d'avance

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ben, en gros, il "suffit" de rajouter une ligne graduée, qui utilise la même unité que tes pièces à ta scene.

    Lorsque tu modifieras le zoom pour tes pièces, le zoom sera automatiquement appliqué à la ligne graduée itou

    Après, au lieu de lui indiquer une position fixe, tu n'aura "qu'à" calculer une position en fonction des éventuels scrollbars pour qu'elle soit systématiquement affichée.

    il faudra, bien sur, que tu aies recours aux événements ou aux signaux émis par les scrollbars pour provoquer le calcul de la nouvelle position
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    j'ai fait quelques recherches et ça serait plus simple avec QWT. j'ai installé la labrairie et elle offre la possibilité d'ajouté un repere avec QWTPLOT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <QApplication>
    #include <qwt_plot.h>
     
    int main(int argc, char** argv)
    {
        QApplication app(argc,argv);
        QwtPlot myPlot;
        myPlot.show();
        return app.exec();
    }
    mais le probleme maintenant comment ajouter ce repere dans ma QGraphicsview ou QGraphicsscene?

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Seulement, si tu en viens à ajouter une dépendances vis à vis d'un projet totalement externe à Qt (bien qu'il soit basé sur Qt), alors que tu n'as besoin que d'une seule des capacités qu'il offre tu ne t'en sortira très rapidement plus.

    C'est d'autant plus idiot que tu dispose finalement de tout ce dont tu peux avoir besoin pour y arriver:

    Tu as le QGraphicsLineItem qui te permet de tracer une ligne et qui hérite de QGraphicsItem.

    QGraphicsItem fournit, entre autres, la fonction setScale que tu utilises sans doute déjà pour tes opérations de zoom.

    Pour ce qui est du positionnement, je te conseillerais d'aller voir du coté du viewport (en fait du rectangle que l'on peut récupérer à partir de lui), des fonctions mapToScene et de l'événement viewportEvent de QGraphicsView.

    Une fois que tu as décidé de la position à laquelle doit se trouver ton indication d'échelle, il est sommes toutes assez facile de faire en sorte qu'elle se trouve systématiquement au bon endroit, en fonction des scrollbars
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Par défaut
    il parait que ton idée est juste et que je fait une fausse piste avec QWT.
    j'ai recommencé avec QGraphicsLineItem et j'ai dessiné 2 lignes comme repère et j'ai les ajouté a ma scène. Mais il y a 2 problèmes:

    -Comment faire pour afficher deux lignes graduées avec les unités?

    -Lors d'un zoom le repère se déplace et ce n'est pas l'objectif de tout?

    je vais que le repère soit fixe et seules les graduations changent lors d'un zoom.

    une idée?

    merci d'avance

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    En fait, tu crées un nouveau type qui hérite de QGraphicsItemGroup et tu dessines toi même ta règle:

    Tu lui donne une longueur et une hauteur qui te conviennent, et tu trace une ligne horizontale en son milieu.

    Puis tu trace, sur toute la hauteur (ou, selon le cas, sur la moitié de la hauteur ou sur le quart de la hauteur en partant d'u point adéquat) des lignes verticales au début et à la fin de cette ligne et, le cas échéant, à intervales réguliers.

    Tu obtiendras donc quelque chose qui pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    |                   |                   |
    |         |         |         |         |
    |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
    | | | | | | | | | | | | | | | | | | | | |
    |         |         |         |         |
    |                   |                   |
    (en beaucoup mieux quand meme, vu qu'ici, c'est de l'ASCII art )

    Et c'est cet objet que tu t'amuses à placer à l'endroit qui t'intéresse sur ton graphique

    En terme d'implémentation, on pourrait envisager quelque chose comme
    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
    class Ruler : public QGraphicsItemGroup {
        public:
            Ruler( QGraphicsItem * parent, 
                  int graduationCount, // le nombre de graduations à afficher
                  int dubbleEvery, // une "double" graduation toutes les
                  int quadraEvery): // une "quadruple" graduation toutes les (généralement, 
                                    // au moins au début et à la fin et multiple de dubbleEvery)
           QGraphicsItemGroup (parent), count_(graduationCount), dubble_(dubbleEvery),quadra_(quadraEvery){
               QRectF * bounding=boundingRect(); // le rectangle dont on dispose
               QReal height=bounding->height(); // la hauteur totale
               QReal quart= height/4; // le "demi" hauteur
               QReal alfQuart= quart/ 2; // le "quart" hauteur
               QReal width = bounding->width(); // la largeur totale
               QReal distance= width/ count_; // la distance qui sépare deux graduations
               addToGroup(new QGraphicsLineItem(0,half,width, half)); //on rajoute une ligne horizontale au mileu du rectangle
               addToGroup(new QGraphicsLineItem(0,0,0,height) );// on rajoute une verticale au début du rectangle
               addToGroup(new QGraphicsLineItem(width,0,width,height) );// et une autre à la fin
               for(int i=1;i<count_;++i){
                   QReal realDistance= distance* i;
                   if(i% dubble_ == 0 &&
                      i%quadra!=0){// quand il faut une "double" hauteur
                       addToGroup(new QGraphicsLineItem(realDistance,quart, realDistance, height-quart);
                     }else if (i%quadra==0){quand il faut une "quadruple" hauteur
                       addToGroup(new QGraphicsLineItem(realDistance,0, realDistance, height);
                     }else{ // et quand il faut une hauteur "simple"
                       addToGroup(new QGraphicsLineItem(realDistance,quart+halfQuart, realDistance, height-(quart+halfQuart));
                     }
                 }
     
            }
    private:
        int count_;
        int dubble_;
        int quadra_;
    };
    Je n'ai absolument pas testé ce code, ni meme tenté de le compiler, mais, l'idée est là: le QGraphicsItemGroup permet de travailler avec un ensemble d'éléments exactement comme s'il s'agissait d'un élément unique, et c'est cette capacité qui nous intéresse

    EDIT: si tu veux que ton repère soit fixe, cela te facilitera énormément la tache, car tu n'auras qu'à t'inquiéter de sa mise à l'échelle
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transformation de coordonnées
    Par Dranor dans le forum DirectX
    Réponses: 3
    Dernier message: 04/04/2009, 14h11
  2. syntaxe coordonné souris
    Par gaut dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 20h28
  3. [Impression] Probleme d'échelle/résolution
    Par Dajon dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/05/2003, 15h56
  4. Récuperer les coordonnées d'un vecteur
    Par kerzut dans le forum OpenGL
    Réponses: 5
    Dernier message: 15/04/2003, 12h51
  5. Coordonnées du curseur ???
    Par LE CHAKAL dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/08/2002, 18h28

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