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

 Java Discussion :

Regler l'echelle d'un graphique


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut Regler l'echelle d'un graphique
    Bonjour,
    Voila j'ai un probleme d'echelle pour l'affichage de mon graphe, je precise:
    J'ai un fichier avec des coordonnees de points (des reels) j'ai lu quelque part que avec java on ne pouvais representer que des entiers, donc en recuperant tous mes points je les multiplie par 1000 ou 10000 pour avoir plus de precision. Mais quand je trace mes points ils ne sont pas tous representes car la plus part sont en dehors de la fenetre.

    Merci Par avance.
    Cordialement deccan

    PS: Je vous joint mon code.
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    package graphe2;
    import java.awt.Polygon;
    import java.io.*;
     
    public class CourbeMath {
    	public Polygon MesPolygones[];
     
     
    	public CourbeMath()
    	{
     
    	CalculPoints();
    	}
    public int NbPoly(){ //retourne le nombre de triangles dans le fichier
    	String chaine="";
     
    	String fich ="/home/makarov/four.msh";
    	File fichier = new File(fich);
    	//lecture du fichier texte	
    	try{
    		InputStream ips=new FileInputStream(fichier); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		BufferedReader br=new BufferedReader(ipsr);
    		String ligne;
    		ligne=br.readLine();
     
    			chaine+=ligne;
     
    		br.close(); 
    	}		
    	catch (Exception e){
    		System.out.println(e.toString());
    	}
    	String delims = "[ ]+";
    	String[] tokens = chaine.split(delims);
    	int aInt = Integer.parseInt(tokens[1]);
     
    	return aInt;
    }
     
     
    	private void CalculPoints()
    	{
     
    	MesPolygones = new Polygon[this.NbPoly()];
     
    	String fich ="/home/makarov/plot";
    	File fichier = new File(fich);
    	int N=this.NbPoly();
    	try{
    		InputStream ips=new FileInputStream(fichier); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		BufferedReader br=new BufferedReader(ipsr);
     
    		int k=0;	
    	for(int i = 0 ; i < 6*N ; i=i+6)
    	{
    		int x[] = new int[3];
    		int y[]= new int[3];
     
    		for(int j=0; j<3;j++){
    		String ligne;
    		String chaine="";
    		ligne=br.readLine();
    		chaine+=ligne;
     
    		String delims = "[ ]+";
    		String[] tokens = chaine.split(delims);
    		double xInt = Double.parseDouble(tokens[0]);
    		double yInt = Double.parseDouble(tokens[1]);
     
    		xInt=xInt*1000;
    		yInt=yInt*1000;
    		x[j]=(int)xInt;
    		y[j]=(int)yInt;
    		System.out.println("coordonnees"+x[j]+","+y[j]);
     
    	}
    		br.readLine();
    		br.readLine();
    		br.readLine();
    		MesPolygones[i-k*5]=new Polygon(x,y,3);
    		k++;
    	}
    	br.close(); 
    	}
    	catch (Exception e){
    		System.out.println(e.toString());
    	}
    	}
    }
    Classe main:
    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
    package graphe2;
     
    import java.awt.Graphics;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class principal extends JPanel{
    	private CourbeMath C;
    	public principal() {C= new CourbeMath();} 
     
    	public void paint(Graphics g){
     
    		for(int i=0;i<C.NbPoly();i++){
    			g.drawPolygon(C.MesPolygones[i]);
    		}
    	}
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    	JFrame frame = new JFrame();
    	frame.getContentPane().add(new principal());
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	frame.setSize(10000, 10000);
    	frame.pack();
    	frame.setVisible(true);
     
    	}
     
    }

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 916
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par deccan Voir le message
    Bonjour,
    j'ai lu quelque part que avec java on ne pouvais representer que des entiers,
    Je me demande bien quel est l'imbécile qui a été écrire un truc pareil... Encore un prof probablement.
    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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut
    Merci de la reponse.
    Enfait j'ai oublie de preciser que les points que je voulais representer forment des triangles, je les stocke donc dans des polygones (classe Polygon) donc je dois quand meme utiliser des entiers si je comprend bien

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 916
    Billets dans le blog
    54
    Par défaut
    Hum;, hum... il existe d'autres classes qui prennent autre chose que des entiers pour des coordonnées (des floats et des doubles), va voir dans le package java.awt.geom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Graphics2D g2d = (Graphics2D)g;
    Shape s = ...........
    g2d.setPaint(Color.BLACK);
    g2d.draw(s);
    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

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 916
    Billets dans le blog
    54
    Par défaut
    Dans ton cas je te conseilles d'aller voir du coté de Path2D, Path2D.Double, Path2D.Float et GeneralPath.
    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 Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par bouye Voir le message
    Je me demande bien quel est l'imbécile qui a été écrire un truc pareil... Encore un prof probablement.
    <troll>
    intéressant d'où vient cet amer commentaire?
    </troll>

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut
    Merci de ta reponse,

    J'ai essaye en utilisant des Graphics2D, mais maintenant le shemas est trop petit (encore un probleme d'echelle)
    Si vous avez des idees merci par avance.


    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    package graphe2;
    import java.awt.Polygon;
    import java.io.*;
     
    public class CourbeMath {
    	public double MesX[][];
    	public double MesY[][];
     
     
    	public CourbeMath()
    	{
     
    	CalculPoints();
    	}
    public int NbPoly(){ //retourne le nombre de triangles dans le fichier
    	String chaine="";
     
    	String fich ="/home/makarov/four.msh";
    	File fichier = new File(fich);
    	//lecture du fichier texte	
    	try{
    		InputStream ips=new FileInputStream(fichier); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		BufferedReader br=new BufferedReader(ipsr);
    		String ligne;
    		ligne=br.readLine();
     
    			chaine+=ligne;
     
    		br.close(); 
    	}		
    	catch (Exception e){
    		System.out.println(e.toString());
    	}
    	String delims = "[ ]+";
    	String[] tokens = chaine.split(delims);
    	int aInt = Integer.parseInt(tokens[1]);
     
    	return aInt;
    }
     
     
    	private void CalculPoints()
    	{
     
    	MesX = new double[this.NbPoly()][4];
    	MesY = new double[this.NbPoly()][4];
    	String fich ="/home/makarov/plot";
    	File fichier = new File(fich);
    	int N=this.NbPoly();
    	try{
    		InputStream ips=new FileInputStream(fichier); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		BufferedReader br=new BufferedReader(ipsr);
     
    		int k=0;	
    	for(int i = 0 ; i < 6*N ; i=i+6)
    	{
    		//int x[] = new int[3];
    		//int y[]= new int[3];
     
    		for(int j=0; j<4;j++){
    		String ligne;
    		String chaine="";
    		ligne=br.readLine();
    		chaine+=ligne;
     
    		String delims = "[ ]+";
    		String[] tokens = chaine.split(delims);
    		double xInt = Double.parseDouble(tokens[0]);
    		double yInt = Double.parseDouble(tokens[1]);
     
    		xInt=xInt*100;
    		yInt=yInt*100;
    		/*x[j]=(int)xInt;
    		y[j]=(int)yInt;*/
    		MesX[i-k*5][j]=xInt;
    		MesY[i-k*5][j]=yInt;
    		//System.out.println("coordonnees"+x[j]+","+y[j]);
     
    	}
    		br.readLine();
    		br.readLine();
    		//MesPolygones[i-k*5]=new Polygon(x,y,3);
    		k++;
    	}
    	br.close(); 
    	}
    	catch (Exception e){
    		System.out.println(e.toString());
    	}
    	}
    }
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    package graphe2;
     
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.GeneralPath;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class principal extends JPanel{
     
    	private CourbeMath C;
    	public principal() {C= new CourbeMath();} 
     
    	public void paint(Graphics g){
    		/*Graphics2D g2 = (Graphics2D) g;
     
    		int x2Points[] = {50, 0,100};
    		int y2Points[] = {25, 50,50};
    		GeneralPath polyline = 
    			new GeneralPath(GeneralPath.WIND_EVEN_ODD, x2Points.length);
     
    		polyline.moveTo (x2Points[0], y2Points[0]);
     
    		for (int index = 1; index < x2Points.length; index++) {
    		 	 polyline.lineTo(x2Points[index], y2Points[index]);
    		};
     
    		g2.draw(polyline);*/
     
    		Graphics2D g2 = (Graphics2D) g;
     
    		for(int i=0;i<C.NbPoly();i++){
     
     
    		System.out.println("Coordonnees="+C.MesX[i][0]+","+C.MesY[i][0]);
     
    		GeneralPath polyline = 
    			new GeneralPath(GeneralPath.WIND_EVEN_ODD, C.MesX[i].length);
     
    		polyline.moveTo (C.MesX[i][0], C.MesY[i][0]);
     
    		for (int index = 1; index < C.MesX[i].length; index++) {
    		 	 polyline.lineTo(C.MesX[i][index], C.MesY[i][index]);
    		};
     
    		g2.draw(polyline);
    		}
     
     
     
     
     
     
     
    	}
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    	JFrame frame = new JFrame();
    	frame.getContentPane().add(new principal());
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	frame.setSize(100, 100);
    	frame.setVisible(true);
     
    	}
     
    }

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 916
    Billets dans le blog
    54
    Par défaut
    L'expérience personnelle bien sur plus le fait que mes deux parents, mon grand-père maternel et mes deux soeurs soient profs ou enseignants. Or des fois chez certains de leurs collègues ou même chez mes anciens profs d'info (même deux de la fac) ça ne volait pas bien haut. Ah oui pis je bosse avec des scientifiques à longueur de journée : verdict ? Même combat...

    Parfait . Désormais te faut aller voir du coté des transformations affines plus précisément soit du coté de la primite scale() de la classe Graphics(2D?) soit du coté de AffineTransform.getScaleInstance() histoire de faire un zoom pour y voir de plus près.

    Hum faudrait penser à activer l'antialising aussi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    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
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut
    Voila j'ai unpeu regle le probleme, il y avait enfait un probleme de coordonnees, dans un JPanel l'origine est en haut a gauche, il faut donc faire une translation.
    Mais maintenant je voudrais que quand je redimensionne ma fenetre le graphe suive aussi alors que la ce n'est pas le cas.
    Merci d'avance pour vos idees.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    package graphe2;
    import java.awt.Polygon;
    import java.io.*;
     
    public class CourbeMath {
        public double MesX[][];
        public double MesY[][];
     
     
        public CourbeMath()
        {
     
        CalculPoints();
        }
    public int NbPoly(){ //retourne le nombre de triangles dans le fichier
        String chaine="";
     
        String fich ="/home/makarov/four.msh";
        File fichier = new File(fich);
        //lecture du fichier texte    
        try{
            InputStream ips=new FileInputStream(fichier); 
            InputStreamReader ipsr=new InputStreamReader(ips);
            BufferedReader br=new BufferedReader(ipsr);
            String ligne;
            ligne=br.readLine();
     
                chaine+=ligne;
     
            br.close(); 
        }        
        catch (Exception e){
            System.out.println(e.toString());
        }
        String delims = "[ ]+";
        String[] tokens = chaine.split(delims);
        int aInt = Integer.parseInt(tokens[1]);
     
        return aInt;
    }
     
     
        private void CalculPoints()
        {
     
        MesX = new double[this.NbPoly()][4];
        MesY = new double[this.NbPoly()][4];
        String fich ="/home/makarov/plot";
        File fichier = new File(fich);
        int N=this.NbPoly();
        try{
            InputStream ips=new FileInputStream(fichier); 
            InputStreamReader ipsr=new InputStreamReader(ips);
            BufferedReader br=new BufferedReader(ipsr);
     
            int k=0;    
        for(int i = 0 ; i < 6*N ; i=i+6)
        {
            //int x[] = new int[3];
            //int y[]= new int[3];
     
            for(int j=0; j<4;j++){
            String ligne;
            String chaine="";
            ligne=br.readLine();
            chaine+=ligne;
     
            String delims = "[ ]+";
            String[] tokens = chaine.split(delims);
            double xInt = Double.parseDouble(tokens[0]);
            double yInt = Double.parseDouble(tokens[1]);
     
            xInt=xInt*100;
            yInt=yInt*100;
            /*x[j]=(int)xInt;
            y[j]=(int)yInt;*/
            MesX[i-k*5][j]=xInt;
            MesY[i-k*5][j]=yInt;
            //System.out.println("coordonnees"+x[j]+","+y[j]);
     
        }
            br.readLine();
            br.readLine();
            //MesPolygones[i-k*5]=new Polygon(x,y,3);
            k++;
        }
        br.close(); 
        }
        catch (Exception e){
            System.out.println(e.toString());
        }
        }
    }
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    package graphe2;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.geom.GeneralPath;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class principal extends JPanel{
     
        private CourbeMath C;
        private int Height,Length;
        public principal(int Height,int Length) {C= new CourbeMath();this.Height=Height;this.Length=Length;} 
     
        public void paint(Graphics g){
            /*Graphics2D g2 = (Graphics2D) g;
     
            int x2Points[] = {-50,50};
            int y2Points[] = {50,-50};
            GeneralPath polyline = 
                new GeneralPath(GeneralPath.WIND_EVEN_ODD, x2Points.length);
     
            polyline.moveTo (Length/2+x2Points[0], Height/2-y2Points[0]);
     
            for (int index = 1; index < x2Points.length; index++) {
                  polyline.lineTo(Length/2+x2Points[index], Height/2-y2Points[index]);
            };
                
            g2.draw(polyline);*/
     
            Graphics2D g2 = (Graphics2D) g;
            g2.scale(2., 2.);
            g2.setColor(Color.red);
            for(int i=0;i<C.NbPoly();i++){
     
     
            System.out.println("Coordonnees="+C.MesX[i][0]+","+C.MesY[i][0]);
     
            GeneralPath polyline = 
                new GeneralPath(GeneralPath.WIND_EVEN_ODD, C.MesX[i].length);
     
            polyline.moveTo (Length/2+C.MesX[i][0],Height/2- C.MesY[i][0]);
     
            for (int index = 1; index < C.MesX[i].length; index++) {
                  polyline.lineTo(Length/2+C.MesX[i][index],Height/2- C.MesY[i][index]);
            };
            //g2.scale(1.5, 1.5);
            //g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.draw(polyline);
            //g2.scale(2., 2.);
            }
     
     
     
            //g2.translate(10, 10);
     
     
     
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
        JFrame frame = new JFrame();
        frame.getContentPane().add(new principal(200,200));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setVisible(true);
     
        }
     
    }

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 916
    Billets dans le blog
    54
    Par défaut
    1) essai de ne pas oublier la balise code quand tu met du code.
    2) met en place ta GUI avec SwinUtilities.invokeLater dans ton main().
    3) surcharge paintComponent() pas paint().
    4) calcule ton path une seule fois, pas à chaque affichage. En plus tu sembles encore utiliser pas mal de coords entières (y compris des divisions par 2 au lieu de 2f ou 2.0).
    5) calcule ton facteur de zoom en fonction de la plus petite dimension exploitable du panel (largeur ou hauteur) et adapte ton stroke à ce facteur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g2d.setStoke(new BasicStroke(1f/(float)scaleFactor));
    6) met un ComponentListener sur le panel et quand ses dimensions changent, recalcule le facteur de zoom et demande un repaint().
    7) pense à annuler ton scale (g2d.scale(1f/scaleFactor, 1f/scaleFactor);) une fois le dessin terminé, sinon tu auras peut-être des soucis de rendu par la suite.
    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

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Par défaut
    Bonjour,

    Voila j'ai tester plein de truc pendant le weekend et finalement ca marche:

    (1) Je n'y suis pas arrive avec la methode scale car elle augmente l'echelle de tout le JPanel et le dessin se decale de plus en plus quand on augmente le facteur.
    (Ceci dit peut etre que je m'y prenais mal)

    (2)J'ai pris des facteurs de zoom en fonction des coordonnees maximales et minimales que je lisais dans le fichier source, mon facteur est alors Fx=taille_fenetre/(Xmax-Xmin) et Fy=taille_fenetre/(Ymax-Ymin).
    N.B. Il faut faire attention car la taille reele de la fenetre differe legerement de la taille qu'on lui impose, donc il faut recuperer la taille avec les methodes getHight() et getWidth().

    (3)Mon programme final utilisait du code C++ pour generer le fichier des coordonnees, et quand je programais mon Java sous eclipse il y avait un probleme de communication entre les deux, car mon package Java etait dans un repertoire different du C++ etc.
    (C'est surement une question de maladresse mais ca marche beaucoup mieux en compilant a la main).

    Je poste le code qui marche:
    Classe CourbeMath:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    import java.awt.Polygon;
    import java.io.*;
     
    public class CourbeMath {
    	public double MesX[][];
    	public double MesY[][];
    	public double extremaux[];
    	public CourbeMath()
    	{
     
    	CalculPoints();
    	}
    public int NbPoly(){ //retourne le nombre de triangles dans le fichier
    	String chaine="";
    	try{
    		InputStream ips=new FileInputStream("/home/makarov/java/affichage.txt"); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		BufferedReader br=new BufferedReader(ipsr);
    		String ligne;
    		ligne=br.readLine();
     
    			chaine+=ligne;
     
    		br.close(); 
    	}		
    	catch (Exception e){
     
    		System.out.println(e.toString());
    	}
     
    	String fich =chaine;
    	File fichier = new File(fich);
     
    	try{
    		InputStream ips=new FileInputStream(fichier); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		BufferedReader br=new BufferedReader(ipsr);
    		String ligne;
    		ligne=br.readLine();
     
    			chaine+=ligne;
     
    		br.close(); 
    	}		
    	catch (Exception e){
     
    		System.out.println(e.toString());
    	}
    	String delims = "[ ]+";
    	String[] tokens = chaine.split(delims);
    	int aInt = Integer.parseInt(tokens[1]);
     
    	return aInt;
    }
     
     
    	private void CalculPoints()
    	{
     
    	MesX = new double[this.NbPoly()][4];
    	MesY = new double[this.NbPoly()][4];
    	extremaux= new double[4];
    	String fich ="/home/makarov/java/affichage";
    	File fichier = new File(fich);
    	int N=this.NbPoly();
    	try{
    		InputStream ips=new FileInputStream(fichier); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		BufferedReader br=new BufferedReader(ipsr);
     
    		int k=0;	
    	for(int i = 0 ; i < 6*N ; i=i+6)
    	{
     
     
     
    		for(int j=0; j<4;j++){
    		String ligne;
     
    		String chaine="";
    		ligne=br.readLine();
    		System.out.println(ligne);
    		chaine+=ligne;
     
    		String delims = "[ ]+";
    		String[] tokens = chaine.split(delims);
    		double xInt = Double.parseDouble(tokens[0]);
    		double yInt = Double.parseDouble(tokens[1]);
    		if(xInt>extremaux[0]) extremaux[0]=xInt;
    		if(xInt<extremaux[1]) extremaux[1]=xInt;
    		if(yInt>extremaux[2]) extremaux[2]=yInt;
    		if(yInt<extremaux[3]) extremaux[3]=yInt;
     
     
     
     
    		MesX[i-k*5][j]=xInt;
    		MesY[i-k*5][j]=yInt;
     
     
    	}
    		br.readLine();
    		br.readLine();
     
    		k++;
    	}
    	br.close(); 
    	}
    	catch (Exception e){
     
    		System.out.println(e.toString());
    	}
    	}
    }
    Classe principal:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridLayout;
    import java.awt.RenderingHints;
    import java.awt.geom.GeneralPath;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.border.Border;
    import javax.swing.plaf.basic.BasicBorders;
     
     
    public class principal extends JPanel{
     
    	private CourbeMath C;
    	private int Height,Length;
    	public principal(int Height,int Length) {C= new CourbeMath();this.Height=Height;this.Length=Length;} 
     
    	public void paintComponent(Graphics g){
     
    		double H=this.getHeight();
    		double L=this.getWidth();
    		double difx=C.extremaux[0]-C.extremaux[1];
    		double dify=C.extremaux[2]-C.extremaux[3];
    		double sfx = L/difx;
    		double sfy = H/dify;
     
    		Graphics2D g2 = (Graphics2D) g;
     
    		g2.setColor(Color.red);
     
    		for(int i=0;i<C.NbPoly();i++){
    			GeneralPath polyline = 
    				new GeneralPath(GeneralPath.WIND_EVEN_ODD, C.MesX[i].length);
     
     
     
     
    		polyline.moveTo (L/2f+sfx*C.MesX[i][0],H/2f- sfy*C.MesY[i][0]);
     
    		for (int index = 1; index < C.MesX[i].length; index++) {
    		 	 polyline.lineTo(L/2f+sfx*C.MesX[i][index],H/2f- sfy*C.MesY[i][index]);
    		};
     
     
    		g2.draw(polyline);
     
    		}
     
     
     
     
     
     
     
    	}
     
     
     
    }
    Classe gui:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    import java.io.*;
    import java.awt.BorderLayout;
    import java.awt.Button;
    import java.awt.Dialog;
    import java.awt.FileDialog;
    import java.awt.FlowLayout;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.Label;
    import java.awt.TextField;
    import java.awt.event.*;
     
    import javax.swing.JFrame;
     
    public class gui extends Dialog implements MouseListener
    {
        String dfname = "project.txt", gridname = "project.txt" ;
        int offset = 80, hmax =380 , vmax =180, downoffset = 40 + offset;
        Button loadtriau, runjob;
        boolean mesh=false;
        TextField textfield0,textfield1,textfield2,textfield3,textfield4;
        Label Q, US,UN,K1,K2 ;
        String Q1="25000", US1="100", UN1="50",K11="1",K21="10";
        //Checkbox checkbox0, checkbox1;
        //CheckboxGroup pbcheckboxes;
    	int dwhat0=1;
     
    public  gui(Frame parent) {
            super(parent, "Project Data Input Interface", false);
            this.setSize(hmax+2*offset, vmax+4*offset);
    }
     
    public class  getfilename extends Frame{ 
      FileDialog fd;
      public String fname;
        public getfilename() { }
        public String getthename(){   
            fd = new FileDialog(this, "Choose a mesh",FileDialog.LOAD);
            fd.setVisible(true);
            fname = fd.getFile();
            return fname;
    	}
    }
     
    public void myinterface(){
     
            this.setLayout(new FlowLayout());        
            loadtriau = new Button("Loadmesh");this.add(loadtriau);
            runjob = new Button("Run Job");  	this.add(runjob);
            Q = new Label("q =");
            textfield0 = new TextField(Q1,20) ;
            this.add(Q);  					this.add(textfield0);
            US = new Label("us =");
            textfield3 = new TextField(US1,20) ;
            this.add(US); 			this.add(textfield3);
     
    	UN = new Label("us =");
            textfield2 = new TextField(UN1,20) ;
            this.add(UN); 			this.add(textfield3);
    	K1 = new Label("K1 =");
    	textfield1 = new TextField(K11,20);
    	this.add(K1);    this.add(textfield1);
    	K2 = new Label("K2 =");
    	textfield4 = new TextField(K21,20);
    	this.add(K2);    this.add(textfield4);
            //pbcheckboxes = new CheckboxGroup();
            //checkbox0 = new Checkbox("Explicite",pbcheckboxes,dwhat0==1);
            //checkbox1 = new Checkbox("Implicit",pbcheckboxes,dwhat0==0);
    	//	this.add(checkbox0);				
    	//	this.add(checkbox1);
            this.pack();        
            Graphics g = this.getGraphics();    
            loadtriau.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){  
    	            getfilename ff = new getfilename();
    	            gridname = ff.getthename();
    	            mesh = true;
    	            try{
    	            FileOutputStream filename= 
    	                new FileOutputStream("/home/makarov/java/affichage.txt");
    	            PrintStream ffile = new PrintStream(filename);
    	            String cc= "/home/makarov/java/"+gridname;
    	            ffile.println(cc);
     
    	            }
    	            catch(IOException Ex){
    	            	System.out.println("0-CA A FOIRE");
    	            }
    	            Runtime rt = Runtime.getRuntime();
    	            try{
    	            	String line;
    	            Process  ax = rt.exec("/home/makarov/java/affichage.sh");
    	            System.out.println("APRES L'EXECUTION");
    	            try{InputStream ao = ax.getInputStream() ;
    			    BufferedReader br = new BufferedReader(new InputStreamReader(ao));
    			      while (( line= br.readLine()) != null) {
    			        System.out.println(line);
    			      }
    	            }
    	            catch(IOException ex){
    	            	System.out.println("1-CA A FOIRE");
    	            }
    	            }
    	            catch(IOException Ex){
    	            	System.out.println("CA A FOIRE");
    	            }
    	            afficheMesh();
     
     
    	            }
     
                //principal P = new principal(400,400);
     
            });  
    	    runjob.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){ 
    	   	    savemyparam();
    		    String line;
    		    Runtime rt = Runtime.getRuntime();
                        try{ 
    		    System.out.println("exec : on lance la partie C++");
    		    Process  ax = rt.exec("./exemple.sh");
    		    InputStream ao = ax.getInputStream() ;
    		    BufferedReader br = new BufferedReader(new InputStreamReader(ao));
    		      while (( line= br.readLine()) != null) {
    		        System.out.println(line);
    		      }
    		    } 
                            catch (IOException Ex){ 
    				System.out.println("catch execption exec ");
                                    System.out.println(Ex.getMessage());
    				System.exit(1);             
    			    } 
    				System.out.println(" Exit normal  ");
                		System.exit(0);             
                  }
            }); 
            this.addMouseListener(this);
            addMouseListener(this);
    }
    public void afficheMesh(){
    	JFrame JF = new JFrame();
    	JF.setLayout(new BorderLayout());
    	principal P = new principal(300,300);
    	JF.setSize(300,300);
    	JF.add(P);
    	JF.setVisible(true);
    	//this.add(JF);
    }
    public void savemyparam() 
        {   String rhsval = textfield0.getText();
            String temperval = textfield3.getText();
            try{
                FileOutputStream filename= 
                new FileOutputStream(dfname);
                PrintStream ffile = new PrintStream(filename);
    	    ffile.println(K11);
    	    ffile.println(K21);
     
                ffile.println(UN1);
    	    ffile.println(US1);
    	    ffile.println(Q1);
                //if(checkbox0.getState()) ffile.println("0");
    	    //  else ffile.println("1");
                if(mesh) ffile.println(gridname);
             }
            catch (IOException Ex)
            {
            	System.out.println("2-CA A FOIRE");
                System.out.println(Ex.getMessage());
            }
        }   
     
    public void paint( Graphics g ) {;}           
    public void mousePressed(MouseEvent e) {;}
    public void mouseReleased(MouseEvent e){;}          
    public void mouseEntered(MouseEvent e) {;}
    public void mouseClicked(MouseEvent e) {;}
    public void mouseExited(MouseEvent e)  {;}
     
    public static void main(String[] args){
            Frame f = new Frame("Java Project Interface");
            gui b = new gui(f);
            b.myinterface();
            b.setSize(840,300);
            b.setVisible(true);
     
        }
    }
    Voila ce que ca donne:


    Vous m'avez bien aide,mon probleme est resolu, je vous en remercie.

    Un seul petit detail me turlupine encore: Je voudrais que le dessin s'affiche dans la meme fenetre que les parametres or quand je change le code en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void afficheMesh(){
        /*JFrame JF = new JFrame();
    	JF.setLayout(new BorderLayout());
    	principal P = new principal(300,300);
    	JF.setSize(300,300);
    	JF.add(P);
    	JF.setVisible(true);*/
    principal P = new principal(300,300);
    this.add(P);
    this.repaint();
     
    }
    J'obtiens ca:


    Merci encore
    Cordialement
    Deccan

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 916
    Billets dans le blog
    54
    Par défaut
    2 problèmes assez rapides à comprendre :
    1) le layout utilisé.

    2) la taille du panel (en fait le passage de la dimension dans le constructeur du panel ne semble rien faire du tout).

    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
     
    private JPanel controlPanel = new JPanel();
    private JPanel graphPanel = new JPanel();
     
    public void myinterface(){
        controlPanel.setLayout(new FlowLayout());        
        [...]
        controlPanel.add(Q);  					
        controlPanel.add(textfield0);
        [...]
        graphPanel.setLayout(new BorderLayout());        
        this.setLayout(new BorderLayout());        
        this.add(controlPanel, BorderLayout.NORTH);
        this.add(graphPanel , BorderLayout.CENTER);
    }
     
    public void afficheMesh(){
       graphPanel.removeAll();
       principal P = new principal(300,300);
       graphPanel.add(P, BorderLayout.CENTER);
       graphPanel.revalidate();
       repaint();
    }
    Bon je crois qu'il est temps de parler du reste :

    [*]L'accesseur par defaut (quand on écrit rien) est celui du package. Cela veut dire que toutes les classes du package on accès au membres et aux métodes. Ne pas hésiter à spécifier private quand cela est nécessaire.[*]On ne manipule jamais au grand jamais le Graphics retourné par la méthode getGraphics().[/list]

    Sinon :
    • Le décallage c'est comme le stroke (voir plus haut) : il est affecté par le facteur de zoom. on peut donc l'annuler de la même manière, généralement en faisant un translate() avec les valeurs appropriées.
    • De manière générale il faut penser à annuler ses transformations affine une fois le dessin terminé. Une autre méthode qui marche mieux est de travailler sur une copie du Graphics (car annuler des transformations peut accumuler des erreurs d'arrondit et faire qu'à la fin en annulant trop de transformations on ne revient pas vraiment à l'état initial) :

      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
       
      /**
       * {@inheritDoc}
       */
      @Override
      protected void paintComponent(Graphics g) {
        Dimension size = getSize();
        Insets insets = getSize(); // La taille de la bordure optionnelle mise avec setBorder() = (0, 0, 0, 0) si aucune bordure.
        int widht = size.width - (insets.left + insets.right);
        int height = size.height - (insets.top + insets.bottom);
        Graphics2D g2d =(Graphics2D)g.create(insets.left, insets.top, width, height);
        try {
          [...]
          // Comme g2d est une copie de la vue pas besoin d'annuler les transfos à la fin.
        }
        finally {
          g2d.dispose();
        }
      }
    • Travailler avec des entier peut être une bonne source d'optimisation (taille de données plus petites et calculs plus rapides) mais de manière générale si on le fait mal cela peut mener à des problèmes d'acculumation d'arrondits qui font que à la fin le dessin peut représenter des décallage de plusieurs pixels entre ce qu'on voit à l'écran ce à quoi on s'attendait.
    • Travailler avec des float peut être une bonne source d'optimisation (taille de données plus petites) et donne généralement un résultat satisfaisant (sauf si on utiliser des données avec une très grande précision puisque leur précision est vite limitée).
    • Travailler avec des double donne le meilleur résult visuel mais en contrepartie est bien plus lent (car les opération sur les doubles sont les plus lentes) et demande 2 fois plus de mémoire.
    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

Discussions similaires

  1. [XL-2000] Echelles dans un graphique
    Par Ach29 dans le forum Excel
    Réponses: 4
    Dernier message: 14/05/2009, 18h47
  2. LIFETEST: Changer les echelles d'un graphique
    Par fafabzh6 dans le forum SAS STAT
    Réponses: 0
    Dernier message: 13/06/2008, 10h51
  3. ajustement automatique des echelles d'un graphique
    Par riri2938 dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/12/2007, 21h58
  4. pb echelle auto sur graphique
    Par lbar012001 dans le forum Excel
    Réponses: 1
    Dernier message: 29/11/2007, 12h48
  5. (vba excel) echelle horaire pour graphique
    Par DirtyA:ex dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 27/06/2006, 15h00

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