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 :

Zoom et autres lieux découverts à marée basse


Sujet :

Qt

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2006
    Messages
    254
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 254
    Points : 138
    Points
    138
    Par défaut Zoom et autres lieux découverts à marée basse
    Bonjour,

    Je me (re)mets à Qt.
    J'ai défini un QGraphicsView et une QGraphicsScene sur laquelle je dessine un parcours sous forme de segments (les extrémités de ces segments sont des latitudes/longitudes).
    Je marque les extrémités de chacun de ces segments par un Pixmap

    Le zoom fonctionne parfaitement mais l'inconvénient c'est que les traits qui matérialisent les segments, ainsi que les Pixmaps qui matérialisent les extrémités grossissent (ou diminuent) en même temps que le zoom, alors que je voudrais qu'ils restent de taille constante (en pixels). Simplement, on doit pouvoir voir plus ou moins du parcours en fonction du zoom.
    En ce qui concerne les traits, il faudrait que leur longueur varie en fonction du zoom, mais que l'épaisseur du trait reste constante.

    Voila, vous avez toutes les données du problème et je remercie d'avance celles et ceux qui me liront et m'apporteront une idée, une piste.

    Pour les curieux(euses), il s'agit d'améliorer l'appréciation de mesure GPS de cibles au sols acquises (les mesures) avec un système RTK (qui permet d'avoir une précision quasi centimétrique en latitude/longitude).

    Kim

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Le comportement que tu observes est -- à mon sens -- malheureusement tout à fait normal, à partir du moment où tu travailles toujours sur la même scène, car, une fois celle-ci tracée, il est "logique" que la taille des éléments varient en fonction de la distance qui les séparent de la caméra

    La seule solution possible (mais sans doute désastreuse, en termes de performances, même s'il faudra la tester pour pouvoir l'affirmer) serait sans doute de pouvoir déterminer la position de chaque objet de ta scène par rapport au zoom appliqué, et de "recréer" ta scène à chaque fois que le zoom serait modifié.

    Mais pour cela, tu devra "découpler" les information de position des éléments des QGraphicsItems qui les représentent sur ta scène. Je m'explique:

    L'idéal serait de te retrouver avec un tableau qui pourrait ressembler à un tableau proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type |   x   |   y   |   z
    1    | xxx_1 | yyy_1 | zzz_1
    1    | xxx_2 | yyy_2 | zzz_2
    1    | xxx_1 | yyy_1 | zzz_1
    ...
    2    | xxx_n | yyy_n | zzz_n
     ...
    Z   | xxx_o | yyy_o | zzz_o
    dans lequel :
    • le type serait une valeur énumérée représentant le type d'élément que tu dois tracer
    • xxx_n représenterait la coordonnée de l'élément N (sur l'axe des X)
    • yyy_n représenterait la coordonnée de l'élément N (sur l'axe des Y)
    • yyy_n représenterait la coordonnée de l'élément N (sur l'axe des Z)

    Le tout, pour une valeur de zoom que tu choisirai plus ou moins arbitrairement (mais, idéalement, une valeur "moyenne").

    Tu veillerais à garder ce tableau "bien au chaud" dans un coin et à ne surtout pas pouvoir le modifier, car ce sera ton tableau "de référence".

    A chaque fois que l'utilisateur modifierait le zoom, tu commencerais par copier ce tableau afin de pouvoir calculer les nouvelles coordonnées par rapport au niveau de zoom demandé.

    Une fois que ce serait fait, tu pourrait alors créer une nouvelle scène sur base des coordonnées que tu viens de calculer, en choisissant la représentation des éléments grace au type indiqué.

    De cette manière, tes traits garderont toujours la même taille à l'affichage, vu qu'il ne subiront jamais l'effet néfaste du zoom (du moins, tant que tu ne provoquera pas l'émition d'un des signaux spécifique à la modiffication du zoom)

    Evidemment, cela signifie que la valeur du zoom que tu utilise ne doit en réalité rien à voir avec celle qui est manipulée au niveau de ta scène ou de ta vue Cela peut paraître surprenant, mais cela n'a rien d'insurmontable

    Enfin, il faut savoir que la solution que je te propose ici est parfaitement logique et cohérente du point de vue conceptuel, mais que le fait de recréer une scène à chaque fois risque de prendre énormément de temps si tu as beaucoup d'élément à tracer. Je te déconseille par exemple d'essayer de tracer tout le littoral atlantique d'un seul coup, d'autant plus que, en fonction du zoom appliqué, tu n'en affichera peut-être que ... quelques dizaines (centaine ) de mètres

    Si tu as assez de mémoire pour te le permettre, j'aurais tendance à te conseiller de travailler en permanence avec deux (ou trois ) scènes différentes:
    • La première, plus ou moins centrée sur la position du gps au moment de la modification du zoom qui s'étendrait "suffisamment" que pour trouver le meilleur compromis entre l'étendue de la scène (qui devrait être "aussi grande que possible") et un temps de création "le plus court possible".
    • et la deuxième, sur laquelle on commencerait à travailler (effectuer les calculs et le tracé) "bien avant" d'atteindre les limites de la première, de manière à ce que son tracé soit terminé lorsqu'il "sera temps" de l'afficher

    L'idée de base étant de "switcher" entre les deux à chaque fois que l'on atteint les limites de la scène (une sorte de "double buffering de la scène" (et non de la vue), en quelque sorte )
    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

Discussions similaires

  1. Réponses: 8
    Dernier message: 14/02/2018, 16h43
  2. Position de la QGraphicsView dans une QGraphicsScene
    Par Jeff504 dans le forum Débuter
    Réponses: 7
    Dernier message: 04/03/2010, 16h35
  3. Réponses: 2
    Dernier message: 22/05/2009, 16h14
  4. Réponses: 3
    Dernier message: 13/09/2008, 19h23
  5. Réponses: 1
    Dernier message: 09/07/2007, 16h06

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