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 :

Questionnement sur les coordonnées ? [Graphics View]


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut Questionnement sur les coordonnées ?
    Bonjour,

    je suis en train de bosser sur QtGraphics (view, scene, item, etc...) et je me pose plusieurs questions.

    Tout d'abort à quoi correspond un viewport ? J'ai du mal à voir ce que cela apporte. Je me doute que son intérêt n'est pas négligeable vu que beaucoup de dev l'utilise mais je ne comprend pas son fonctionnement.

    Idem pour les fonctions maptoscene/mapfromscene. J'ai beau lire la doc je ne comprend pas bien.

    J'essaie de trouver une doc ou tuto en francais pour avoir des précisions sur le système de coordonnée mais j'ai du mal.


    Ensuite j'ai fait quelques tests :

    J'ai une vue de 600*200 qui affiche une scene de 5000*5000 dans laquelle je charge une image topographique. J'arrive à zoomer et déplacer la scene sans problème. En imaginant que je fasse un zoom et que je place la scene de façon à en voir une partie centrale (à peu près), un viewport de la vue me renvoie un QWidget dont les coordonnées sont en x/y : 1/1 et largeur/hauteur : 600*200. Du coup je ne comprend pas bien l'intérêt.

    Ensuite comment puis-je récupérer les coordonnées (x,y,largeur,hauteur) de la partie visible de l'image ou de la scene afin de pouvoir isoler une portion de mon image afin d'utiliser ensuite QImageReader et setClipRect.

    L'objectif est de créer un logiciel de découpage d'image automatique. Dans une vue je chargerais une image et je pourrais ensuite placer dessus des barres horizontales et verticales permettant de délimiter les zones à découper.

    Merci d'avance pou votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour psykoprof

    Tout d'abort à quoi correspond un viewport ? J'ai du mal à voir ce que cela apporte. Je me doute que son intérêt n'est pas négligeable vu que beaucoup de dev l'utilise mais je ne comprend pas son fonctionnement.
    Pour simplifier les explications, on peut faire une analogie :
    - ta scène, c'est "ton univers" : elle travaille en coordonnées réelles et contient tes items. En fait, on peut même dire qu'elle est indépendante de toute représentation visuelle (c'est un concept "monde" contenant des concepts "item") ; beaucoup de "fonctionnalités" de ce monde sont indépendante de la représentation visuelle : créer, détruire et déplacer des items.
    - ta vue (ou tes vues, tu peux en avoir plusieurs par scène) est une représentation graphique de ta scène. C'est ce qui apparaît à l'écran, donc elle travaille en coordonnées entières (en pixels). C'est également elle qui gère l'interaction avec l'utilisateur (clic souris, clavier, etc.) : elle récupère un évènement, regarde si elle le traite elle même (par exemple déplacer la vue ou faire un zoom) sinon elle transmet à la scène (par exemple pour sélectionner un item ou le déplacer)

    Idem pour les fonctions maptoscene/mapfromscene. J'ai beau lire la doc je ne comprend pas bien.
    Imagine donc un monde 2D (ta scène) avec plusieurs caméras par dessus (tes vues). Tu peux déplacer (en 2D) tes caméras (tes vues), faire des zooms, de rotations, etc. Donc les coordonnées du point de vue des caméras (en pixel, allant de (0,0) à (width,height) ) ne correspondent pas aux coordonnées du monde mais juste au coordonnées de l'endroit du monde sur lequel pointe ta caméra. En prenant en compte la rotation et le zoom de la caméra, on a donc une transformation (donc une projection d'un espace 2D dans un autre espace 2D, pour parler math, représentée par une matrice accessible par transform() )
    Comme Qt est sympa avec nous, plutôt que devoir utiliser cette matrice de transformation (et son inverse) pour passer des coordonnées d'un monde vers l'autre, on nous fournit les fonctions maptoscene/mapfromscene pour le faire directement.

    J'ai une vue de 600*200 qui affiche une scene de 5000*5000 dans laquelle je charge une image topographique. J'arrive à zoomer et déplacer la scene sans problème. En imaginant que je fasse un zoom et que je place la scene de façon à en voir une partie centrale (à peu près), un viewport de la vue me renvoie un QWidget dont les coordonnées sont en x/y : 1/1 et largeur/hauteur : 600*200. Du coup je ne comprend pas bien l'intérêt.
    Si tu n'appliques aucune transformation à ta vue (le point (100,100) de ta vue correspond au point (100.0, 100.0) de ta scène par exemple), alors effectivement, l'intérêt est moindre (mais pas nul, j'y reviendrai). Le framework scène/vue est très intéressant pour se "déplacer" dans un monde 2D sans avoir à gérer soit même la transformation monde<->vue.
    Un autre intérêt (qui est très important dans une image topographique) est la gestion des éléments invisibles : imagine que sur ta carte, tu dessines les routes, les fleuves, les maisons, les courbes d’altitudes, etc. (donc en bref, beaucoup d'objets). L'implémentation "naive", sans le framework scène/vue, serait de redessiner tous tes objets à chaque mise à jour. Ca serait très lourd. Et surtout, il est inutile de dessiner les objets qui sont en (2000.0, 2000.0) si ta vue est positionnée au point (100, 100). Une autre implémentation serait donc d'ajouter un système de "clip" et dessiner que les objets visibles à un moment donné.
    Là encore, Qt fournit directement cet outils pour ne pas avoir à le faire nous même (et bien d'autres choses encore : la mise en cache, l'utilisation de l'accélération matérielle dispo, etc.)

    PS : ta vue ne "revoit" pas un QWidget : c'est elle même un QWidget qui a une position et des dimensions.

    Ensuite comment puis-je récupérer les coordonnées (x,y,largeur,hauteur) de la partie visible de l'image ou de la scene afin de pouvoir isoler une portion de mon image afin d'utiliser ensuite QImageReader et setClipRect.
    Très simplement. Si tu as compris jusque maintenant, les coordonnées de la partie visible sont... dans la vue : les coordonnées vont de (0, 0) à (width, height) en coordonnées entières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QPoint left_top_view = QPoint(0, 0);
    QPoint right_bottom_view = QPoint(width(), height()); // appel de QPaintDevice::width() et QPaintDevice::height()
    ou :
    QSize size_view = size(); // appel de QWidget::size()
    ou
    QRect rect_view = geometry(); // appel de QWidget::geometry()
    Pour passer au coordonnées de la scène (en valeurs réelles), on utilise la fonction mapToScene (si tu comprends maintenant le principes des coordonnées, le nom de la fonction doit être claire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QPointF left_top_scene = mapToScene(left_top_view);
    QPointF right_bottom_scene = mapToScene(right_bottom_view);
    J'espère que c'est assez claire comme explications. N'hésite pas si tu as des points à préciser.

    Bonne continuation

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 41
    Par défaut
    Merci beaucoup pour les explications.

    J'avais déjà un peu compris le principe vue et scene. C'était surtout la notion de coordonnées vue/scène qui était floue et les méthodes qui vont avec (il y en a pas mal.....)

    Je pige mieux maintenant le truc.

    Merci pour ton aide. Je vais tester tout ça.

    Je reviendrais peut-être si j'ai d'autres questions plus poussées.

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

Discussions similaires

  1. Questionnement sur les INDEX
    Par boutade80 dans le forum SQL
    Réponses: 3
    Dernier message: 04/09/2009, 11h47
  2. Comment récupérer les coordonnées d’un clique sur une image ?
    Par da_sys dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/11/2006, 12h34
  3. Aficher les coordonneés sur bouton
    Par pod1978 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 27/04/2006, 16h35
  4. Réponses: 6
    Dernier message: 14/04/2006, 16h15
  5. Comment récupérer les coordonnées sur le bureau d'une form ?
    Par fma2112 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 22/02/2006, 23h43

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