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

2D Java Discussion :

zoom "tracker de souris"


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut zoom "tracker de souris"
    Bonjour à tous,

    je cherche à faire une appli permettant d'afficher, entre autres, une image raster sur laquelle on pourrait zoomer "en suivant la souris". Je m'explique :
    J'ai quelque part une BufferedImage qui contient mon image raster à sa taille d'origine. J'ai aussi, associé à cette BufferedImage, un Rectangle représentant le Viewport, c'est à dire ce qui sera affiché sur mon Canvas graphique. Lorsque je veux zoomer sur une partie de l'image, je définis mon viewport relativement à cette partie, et je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aBufferedImage.getSubImage(Viewport)
    (en gros)
    puis j'applique la transformation pour que cette sous-image s'adapte à la taille du Canvas ------> effet de zoom.

    Tout se passe bien lorsque mon viewport est placé en (0,0) (coordonnées BufferedImage), mais le problème est que j'aimerais que le zoom de l'image se fasse "autour de la souris", c'est à dire définir de nouvelles coordonnées BufferedImage au Viewport pour qu'il englobe la souris, et que pour l'utilisateur la souris soit exactement au même endroit que pour le précédent viewport ! C'est plus des maths que du Java2D, mais je me perds un pêu entre les coordonnées Canvas, BufferedImage, AncienViewport et NouveauViewport....
    Si quelqu'un à une idée ou connaît des sources, il sera le bienvenue

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut Problème résolu...
    Je ne sais pas si ça intéressera quelqu'un, mais le problème est désormais résolu :
    1:convertir les coordonnées du pointeur de la souris (coordonnées Canvas) en coordonnées Viewport
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        public Point2D.Double convertCanvasToViewportCoords(Point zoomPoint, int width, int height) {
            Point2D.Double aPoint=new Point2D.Double(0,0);
            aPoint.x=((float)zoomPoint.x)/((float)width);
            aPoint.y=((float)zoomPoint.y)/((float)height);
            return aPoint;
     
        }
    2:convertir le point obtenu en coordonnées Image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        public Point convertViewportToImageCoords(Point2D aPoint){
            Point aConvertedPoint=new Point(0,0);
            aConvertedPoint.x=(int) (aPoint.getX()*aViewport.width);
            aConvertedPoint.y=(int) (aPoint.getY()*aViewport.height);
     
            return aConvertedPoint;
        }
    3:calculer le nouveau viewport grâce à ce point, viewport centré sur la souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        private void computeNewViewport(Point point,Canvas2D canvas) {
     
            point.x+=aViewport.x;
            point.y+=aViewport.y;
            double zoomFactor=aLayerManager.getAZoomFactor();
            aViewport.width=(int) (((float)canvas.getWidth())/zoomFactor);
            aViewport.height=(int) (((float)canvas.getHeight())/zoomFactor);
            aViewport.x=point.x-(int)aViewport.width/2;
            aViewport.y=point.y-(int)aViewport.height/2;
     
        }
    et enfin
    4:translater le viewport pour que la souris soit au même endroit qu'avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        private void translateNewViewport(Double viewPoint) {
            Point2D.Double aVect=new Point2D.Double(viewPoint.x-0.5,viewPoint.y-0.5);
            Point aPoint=convertViewportToImageCoords(aVect);
            aViewport.x-=aPoint.x;
            aViewport.y-=aPoint.y;    
        }
    Pour info, l'appel à partir des coordonnées souris donne quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public void zoom(Point zoomPoint, Canvas2D canvas) {
            Point2D.Double aViewPoint =convertCanvasToViewportCoords(zoomPoint,canvas.getWidth(),canvas.getHeight());
            Point aPoint=convertViewportToImageCoords(aViewPoint);
            computeNewViewport(aPoint,canvas);
            translateNewViewport(aViewPoint);
        }
    Et voilà, lorsqu'on zoome, le zoom suit le pointeur de la souris . Il reste encore à s'arranger pour que les coordonnées du viewport ne dépasse pas celle de l'image----> je vais m'occuper de ça tout de suite !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Par défaut salut
    j'ai a peu pré le meme souci .

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

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