Enfaite quand je dis déformer c'est des valeurs ecris à l''envers, j'utilise la fonction
pour dessinerCode:dessin.drawString(String.valueOf(max), x, y);
Version imprimable
Enfaite quand je dis déformer c'est des valeurs ecris à l''envers, j'utilise la fonction
pour dessinerCode:dessin.drawString(String.valueOf(max), x, y);
ah, ok, à l'envers, ça commence à vouloir dire quelque chose... j'imagine que c'est la tête en bas... tu m'aurais dit des le départ, "les étiquettes de mes axes s'affichent la tête en bas", on aurait gagné 4 messages...et 70 minutes !
C'est à cause de ce truc : dessin.scale(1, -surfaceHistogramme/surfaceImage/3.7);Tu changes l'echelle veriticale, donc la transformée affine de l'ensemble du contexte graphique.
plusieurs solutions :
- Sauvegarder l'echelle au début, et la restituer après avoir dessiner l'histogramme et avant de tracer les axes. Problème toutefois : tout dépend où tu veux écrire ta valeur, mais ça peut être complexe. Version bourrine de cette solution : remettre l'echelle à la valeur de base (1,1) avant de dessiner le texte de l'étiquette ;
- Utiliser un contexte graphique différent pour l'histogramme. Au moins on garanti de ne pas refiler un contexte graphique pourri à Swing, donc on n'aura pas d'effet de bord. Mais pour le placement de l'étiquette, tu aura la même difficulté que pour la solution 1 ;
- Déterminer la transformée affine qui permet de renverser le texte, tout en plaçant là où on veut (donc un Y affecté par la scale) : le plus complexe (mathématiquement) assurément, et ça ne résout pas le problème du contexte graphique pourri ;
- Ne pas se servir de cette tranformée affine : tu traces des lignes verticales, c'est super simple de les afficher avec une echelle différente, (en fait c'est le même facteur, mais appliqué à chaque y dans la méthode drawLine()). Ainsi, ton contexte graphique n'est pas renversé, donc tu peux le restituer tel quel, et tu peux dessiner directement un texte à l'endroit (je veux dire pas à l'envers), tout en le plaçant avec la même facilité sur l'histogramme que tu traces les lignes (même application du même facteur sur le y de la baseline).
Je suis désolée pour ma mal expression, du coup
J'ai essayé avec
Mais franchement je n'obtiens rien.Code:dessin.setTransform(new AffineTransform());
Bah, ça, ça remet bien l'echelle à l'identité (pas forcément à la bonne, parce qu'on ne peut pas savoir qu'elle est l'echelle au moment où en entre dans le composant, même s'il y a de forte chance que ça soit l'identité).
Le mieux est de récupérer la transformée (avec Graphics2D.getTransform()) au début de la méthode , ou juste avant de la changer, pour la remettre ensuite. Ou alors de créer un context graphique spécifique pour le dessin avec une échelle différente :
Mais je pense encore que le plus simple est de ne pas utilise de transformée du tout et de tracer les lignes dans l'autre sens.Code:
1
2
3
4
5
6
7
8
9
10
11
12 Graphics2D g = ... Graphics2D gbis = (Graphics2D)g.create(); gbis.setTransform( ... ); // tout ce que tu dessines dans gbis est affectée par la transformée // tout ce que tu dessines dans g ne l'est pas }
Au lieu de faire g.drawLine(x, 0, x, y), tu fais g.drawLine(x, height, x, height-y) (ou height est la hauteur de l'image/composant) est ton histogramme est dans le bon sens. Et si tu veux appliquer un écrasement : g.drawLine(x, height, x, (height-y)*scaley). Ainsi, un drawString("str", 0, (height-y)*scaley) sera pas loin du haut de la ligne (à l'ascent près, et pas centré sur la ligne, mais pour ça, je t'ai déjà donné le code pour), sans se prendre la tête, et sera affiché dans le bon sens (pas la tête en bas).
Sinon, "je n'obtiens rien", c'est très vague...