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

Interfaces Graphiques en Java Discussion :

Optimisation d'un zoom sur un objet Graphics


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Optimisation d'un zoom sur un objet Graphics
    Bonjour à tous, je viens ici pour une question d'optimisation. En effet mon code fonctionne mais d'une manière qui ne me plait pas et je pense qu'il y a bien moyen d'optimiser cela, mais je ne trouve pas. Voila mon problème :

    Dans mon programme, j'ai un JPanel qui contient un objet d'une de mes classe. Cette classe hérite de MouseListener et MouseMotionListener, il contient donc toutes les méthodes associés en particulier PaintComponent. Les objets de cette classe me permettent ( entre autre ) de tracer des graphes éditable à la souris ( on peut déplacer les sommets, cliquer dessus pour effectuer des actions, ect ...).
    J'ai récemment voulu implémenter une fonction permettant de zoomer / dezoomer la vue des graphes. Pour cela j'ai donc créé un attribut "scale" j'ai donc dans la fonction PaintComponent(Graphics g ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g2.scale(scale, scale);
    Cela fonctionne donc bien pour l'affichage, mais pour qu'ensuite mes action à la souris soit bien interprété il a fallu que je remplace tout les
    par ( idem pour Y, me etant un objet de type MouseEvent ).

    Comme je l'ai dit en intro, cela fonctionne mais ne me plait pas vraiment ... si quelqu'un a une idée pour optimiser cela, je suis preneur de toutes les pistes de recherche !
    Sinon, si c'est le seul moyen, au niveau du temps d’exécution est il plus rapide de faire une division par 1 ou une comparaison avec 1 ( sachant que ce 1 ne sera pas codé en dur dans le code mais sera une variable) ? ( je n'ai jamais eu de cours de java, je ne sais pas vraiment comment il est compilé ensuite et les optimisation que fait le compilateur ).

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Le seul moyen j'en sais rien. Mais si tu le fait toi même je ne vois pas comment tu pourrais faire autrement qu'un recalcule des X,Y et prenant en compte le scale et d'éventuel translation. Donc de coder 2 fonction qui te transforme les coordonnée physique de la souris dans la panel en coordonée virtuelle dans le panel et vice versa.

    Dans le genre :

    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
    /*
    	 * Transforme la coordonée en bonne coordonnée (avec zoom et translation)
    	 */
    	public Point2D.Double convertViewXYtoRealXY(double X, double Y)
    	{
    		double x = X;
    		double y = Y;
     
     
    		if (BYPASS_ZOOMX == false)			x /= this.ZOOM_X;
    		if (BYPASS_ZOOMY == false)			y /= this.ZOOM_Y;
    		if (BYPASS_ZOOMX == false)			x /= this.FACTEUR_PRECISION;
    		if (BYPASS_ZOOMY == false)			y /= this.FACTEUR_PRECISION;
     
    		x -= this.TransX;
    		y -= this.TransY;
     
    		Point2D.Double p = new Point2D.Double(x, y);
     
    		return p;
    	}
     
    	/*
    	 * Transforme la coordonée en bonne coordonnée (avec zoom et translation)
    	 */
    	public Point2D.Double convertRealXYToViewXY(double X, double Y)
    	{
    		double x = X;
    		double y = Y;
     
    		// Facteur pour mettre le dessin centré 
    		x += this.TransX;
    		y += this.TransY;
     
    		if (BYPASS_ZOOMX == false)			x *= this.FACTEUR_PRECISION;
    		if (BYPASS_ZOOMY == false)			y *= this.FACTEUR_PRECISION;
    		if (BYPASS_ZOOMX == false)			x *= this.ZOOM_X;
    		if (BYPASS_ZOOMY == false)			y *= this.ZOOM_Y;
     
    		Point2D.Double p = new Point2D.Double(x, y);
    		return p;
    	}
    Après pour ton histoire de division par 1 et comparaison par 1 j'ai rien compris
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Blangel Voir le message
    Comme je l'ai dit en intro, cela fonctionne mais ne me plait pas vraiment ... si quelqu'un a une idée pour optimiser cela, je suis preneur de toutes les pistes de recherche !
    Sinon, si c'est le seul moyen, au niveau du temps d’exécution est il plus rapide de faire une division par 1 ou une comparaison avec 1 ( sachant que ce 1 ne sera pas codé en dur dans le code mais sera une variable) ? ( je n'ai jamais eu de cours de java, je ne sais pas vraiment comment il est compilé ensuite et les optimisation que fait le compilateur ).
    Salut,

    Tu peux utiliser la transformation affine inverse (de celle que tu utilises pour ton zoom) pour convertir les coordonnées de la souris, plutôt qu'une division. C'est un peu plus propre, mais, à moins que tu aies vraiment des graphes très complexes, les différences sur les performances ne devraient pas être très importantes.

    J’utilise dans mon application une bibliothèque de ZUI fondée sur ce principe, pour afficher un ensemble de près de 10000 nodes (avec des paths complexes et des images, et animation, etc...), à plusieurs niveaux (stack) de transformations affines (Certes la bibliothèque intègre quelques points d'optimisation, par clipping en particulier). Et ce n'est vraiment pas sur l'UI que j'ai besoin de travailler l'aspect performance.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    comme le dit joel, tu peux utiliser un AffineTransform pour faire le zoom et utiliser la matrice inverse pour calculer les x/y en fonction de la souris. Mais cela n'a d'intérêt que si tu effectue des opération plus complexes qu'un simple zoom: combinaison de translation, rotation, scale, ...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2014
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Ok, merci pour vos réponse. Donc pour l'instant je vais rester comme ça ( de toute façon je n'ai encore jamais vu mon application avoir besoins de réfléchir, mais je préfère partir sur une base propre )


    Citation Envoyé par wax78 Voir le message
    Après pour ton histoire de division par 1 et comparaison par 1 j'ai rien compris
    En fait je posais cette question car la plupart du temps mon facteur de zoom sera égal à 1, donc je voulais savoir si il valait mieux faire un test du genre "si scale différent de 1 je divise par scale, sinon je fais rien" ou alors tout le temps diviser par scale.

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Je comprends mieux, malheureusement je n'ai pas la réponse, il faudrait benchmarké ca
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu n'a pas non plus 10.000 évènements souris par seconde hein, donc non, cette division ne se verra pas.

Discussions similaires

  1. Utilisation d'un objet Graphics sur un autre
    Par Saltmm dans le forum 2D
    Réponses: 2
    Dernier message: 11/11/2013, 17h00
  2. Paindre des objets Graphics sur un JPanel, comment procéder ?
    Par natus dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 26/12/2011, 14h17
  3. objets graphics sur un datagridview
    Par HULK dans le forum Windows Forms
    Réponses: 0
    Dernier message: 15/12/2008, 12h34
  4. zoom sur image de formulaire
    Par bourvil dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/10/2003, 09h25
  5. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40

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