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

Affichage des résultats du sondage: Lequel des deux outils de reporting suivants s'intègre le mieux à NetBeans IDE?

Votants
0. Vous ne pouvez pas participer à ce sondage.
  • Birt

    0 0%
  • JasperReports

    0 0%
Graphisme Java Discussion :

Représenter le niveau d'un liquide


Sujet :

Graphisme Java

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Représenter le niveau d'un liquide
    Bonjour à tous,
    Je développe présentement une application de gestion de station service et je dois représenter le stock de carburant dans une cuve. J’aimerais créer une fonction qui prend en paramètres :
    capacite_cuve : volume max de la cuve ;
    volume_min : volume mini à partir de laquelle une alerte est générée ;
    volume_restant : niveau du produit ;
    nom_cuve : le nom de la cuve ;
    couleur_produit : couleur du produit
    puis affiche le stock. La figure ci-jointe représente exactement ce que je dois réaliser.
    A noter que : volume_min < volume_restant < capacite_cuve

    J'ai regardé du côté de l'api 2D, notamment avec la fonction Arc2D.CHORD mais rien n'y fait. Restant disponible pour toute information complémentaire.

    Merci d’avance.
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Si tu n'es pas bloqué sur l'apparence à obtenir, tu peux toujours te diriger sur ce projet: SteelSeries qui propose des jauges vachement bien foutues et qui plus est fort jolies à voir.

    Je subodore de plus qu'il doit être possible d'en customiser une ronde pour qu'elle affiche un niveau vertical

    Le blog du développeur de cette lib: http://harmoniccode.blogspot.com/
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Qu'est ce qui te pose problème dans le rendu de ton niveau ?

    Il s'agit juste de la hauteur du rectangle vert, ce qui est plutot facile à caculer compte tenu des paramètre fournis, avec une simple règle de 3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    largeur = diamètre;
    hauteur = diamètre * (volume actuel - volume min) / (volume max - volume min);
    Nom : réservoir.png
Affichages : 65
Taille : 19,4 Ko

    Ensuite ce même rectangle est clippé par un disque, et on dessine un cercle noir par dessus et voilà ! (après pour faire joli, on peut utiliser des gradients et des formes suplémentaires ).

    Après bien sur la couleur varie en fonction du volume actuel.

    Pour le rendu et le positionnement du label il y a toutes les méthodes qu'il faut pour calculer la position correct en fonction du texte dans la classe Font (getLineMetrics() et getStringBounds()). Après il faut se sounir que le point de référence lors de l'écriture d'un texte n'est pas le coin en haut à gauche mais la base ligne à gauche (dans le cas d'une écriture occidentale) avec l'ascent = la hauteur de caractère audessus de la base line et le descent = la hauteur de charactère sous la baseline pour les quelques lettres qui vont endessous (fgjpqyz).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    merci pour vos réponses.
    sinok:

    j'ai suivi les liens ci-dessus mais j'avoue vraiment que je ne m'y retrouve pas dedans. J'ai pas un niveau expert en graphisme java.

    bouye:

    Au fait, ce qui m'embête le plus c'est comment faire en sorte que les parties clippées comme le montre ton graphique ne soient pas du tout visibles.

    merci encore.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Euh..... c'est le principe du clip justement...
    le genre de truc qu'on peut faire avec graphics.setClip(Shape) par exemple !
    Bon après c'est pas forcément la meilleure méthode : les formes clippées ne sont pas anti-aliasées mais pour ce que tu cherches à faire c'est largement suffisant je pense.

    Donc :
    • sauvegarder le clip initial,
    • clipper le Graphics avec le cercle,
    • peindre le rectangle en vert,
    • restaurer le clip initial,
    • dessiner le cercle en noir.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Merci bouye, je vais essayer ça et te tiendrais au courant de mon avancement.

    A+

  7. #7
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    Salut,

    je pense aussi que tu peux travailler avec des objets Area et appliquer une Intersection entre le cercle et le rectangle .

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    En fait, il y a 3 solutions qui apparaissent rapidement (quand on connait Java2D) :
    • clip direct du Graphics (pas d'anti-aliasing). C'est la solution la plus rapide à mettre en place
    • utiliser Area (supporte l'anti-aliasing). Peut poser des problèmes de performance en cas de beaucoup d'opération (ce n'est pas le cas ici car on a que 2 formes).
    • utiliser AlphaComposite.SrcIn pour faire un rendu clippé soft (supporte l'anti-aliasing). Mais c'est plus facile à mettre en place sur des images offscreen que sur le Graphics de l'écran.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour à tous en merci pour vos réponses.
    Comme convenu voici ou j'en suis avec le code ci-dessous:

    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
     
    class MaCuve extends Component {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	public void paint(Graphics g) {
    	    Graphics g1 = (Graphics)g;
    	    Shape cercle= new Ellipse2D.Float(80.0f, 80.0f, 499.0f, 500.0f);//g1.getClip();
    	    g1.setClip(cercle);
    	    g1.setColor(Color.GREEN);
    	    g1.fillRect(80, 80, 500, 400);
    	    g1.setColor(Color.BLACK);
    	    g1.drawOval(80, 80, 499, 499);
    	  }
     
    }
    Le problème maintenant est que l'origine de mon rectangle se situe au coin supérieur gauche. J'ai essayé de faire une rotation de mon rectangle sans succès.
    Ci-joint ce que j'ai obtenu.
    A+
    Images attachées Images attachées  

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Salut!

    Je crois que le problème est entièrement résolu. La solution est la suivante :
    le bord inférieur de mon rectangle doit coïncider avec celui de mon ellipse. Cette translation d'origine est obtenue en ajoutant tout simplement à y la valeur de la différence entre la hauteur maximale et le niveau actuel du produit (à vérifier après) . Donc l'astuce était de commencer à partir du niveau même du produit:

    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
     
    lass MaCuve extends Component {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	public void paint(Graphics g) {
    	    Graphics g1 = (Graphics)g;
    	    Shape cercle= new Ellipse2D.Float(80.0f, 80.0f, 499.0f, 500.0f);//g1.getClip();
    	    g1.setClip(cercle);
    	    g1.setColor(Color.GREEN);
    	    g1.fillRect(80, 80+(499-400), 500, 400);
    	    g1.setColor(Color.BLACK);
    	    g1.drawOval(80, 80, 499, 499);
    	  }
     
    }
    Voici la figure finale.
    En tout cas merci infiniment à tout le monde.

    A bientôt.
    Images attachées Images attachées  

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Tu devrais (comme indiqué plus haut) sauvegarder le clip initial et le restaurer avant de dessiner le cercle. Cela permettrait à la bordure noire de s'afficher correctement entre autre quand tu active l'antialiasing dans le rendu (car le stroke dans Java2D est positionné au milieu du trait et s'affiche donc de part et d'autre de la limite définie par le disque).

    Ensuite, je pense qu'au lieu de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphics g1 = (Graphics)g;
    Tu voulais plutot faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphics2D g1 = (Graphics2D)g;
    Ce qui permet de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g1.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    Ce qui te permet aussi de dessiner directement avec des formes Rectangle2D et Ellipse2D plutot que de coder des valeurs en dur comme ça.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/12/2014, 21h15
  2. Représentation image en niveau de gris par Photoshop
    Par Space23 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 15/10/2013, 10h03
  3. Traitement d'image : mesure de niveau (liquide)
    Par zicos dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 18/11/2008, 21h04
  4. Creer un role au niveau server
    Par Mouse dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/05/2003, 15h56
  5. Elément de niveau supérieur dans un menu
    Par pascalT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/03/2003, 09h39

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