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 :

Tracé de Fonction


Sujet :

Java

  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 31
    Par défaut Tracé de Fonction
    Bonjour a tous,

    Afin tester un peu ce que j'ai appris en Java cette année j'ai décidé de me lancer dans un petit projet. Ce projet requiert que je trace (et donc puisse lire) des fonctions mathématique. J'ai donc créer un analyseur syntaxique qui marche plus ou moins bien et qui a partir d'une String me renvoie un occurence de la classe Expression qui peut être évaluer pour tout x apartenant a R. J'ai aussi créer une classe Calcul qui me permet de trouver le max et le min de la fonction sur un certain intervalle(qui marche tant qu'il n'y a pas d'asymptote infinie sur l'intervalle) Jusque la tout vas bien !

    Mon problême viens du fait que je veux pouvoir tracer le graph des expressions. J'ai donc créer la sous classe JGraphPanel suivante :

    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
    package GUI;
    import java.awt.*;
    import javax.swing.*;
    import analyseur.*;
     
    public class JGraphPanel extends JPanel {
     
    	private double a, b, min, max;
    	private Expression E, loi;
     
    	public JGraphPanel(){}
     
    	public JGraphPanel(Expression E, double a, double b){
    		this.E=E;
    		Calcul C = new Calcul(E);
    		this.a=a;
    		this.b=b;
    		this.min=C.min(a, b);
    		this.max=C.max(a, b);		
    	}
     
    	public JGraphPanel(Expression E, Expression loi, double a, double b){
    		this.E=E;
    		this.loi=loi;
    		Calcul C1 = new Calcul(E);
    		Calcul C2 = new Calcul(loi);
    		this.a=a;
    		this.b=b;
    		this.min=Math.min(C1.min(a,b), C2.min(a, b));
    		this.max=Math.max(C1.max(a, b), C2.max(a, b));
    	}
     
    	public void paintComponent(Graphics g) {
     
    		setBackground(Color.white);
    		Graphics2D g2 = (Graphics2D) g;
            super.paintComponent(g2);
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setRenderingHint(RenderingHints.KEY_RENDERING, 
                    RenderingHints.VALUE_RENDER_QUALITY);
            Dimension d=getSize();
            g2.setColor(Color.red);                
            g2.setStroke(new BasicStroke(3f, BasicStroke.CAP_SQUARE,
                    BasicStroke.JOIN_MITER, 10.0f)); 
     
        	g2.drawLine(0,(int)(((-max)*(-d.height))/(max-min)),(int)(((b-a)*d.width)/(b-a)),(int)(((-max)*(-d.height))/(max-min)));
        	g2.drawLine((int)(((-a)*d.width)/(b-a)),0,(int)(((-a)*d.width)/(b-a)),d.height);
        	g2.drawString(""+max, d.width/2,10);
        	g2.drawString(""+min, d.width/2, d.height);
        	g2.drawString(""+a, 0, d.height/2);
        	g2.drawString(""+b, d.width-20, d.height/2);
        	g2.setColor(Color.green);                
            g2.setStroke(new BasicStroke(2f, BasicStroke.CAP_SQUARE,
                    BasicStroke.JOIN_MITER, 10.0f)); 
     
        	double i=a;
        	int pas=10000;
        	int[]tx1= new int[pas+1];
        	int[]ty1= new int[pas+1];
        	int[]tx2= new int[pas+1];
        	int[]ty2= new int[pas+1];
        	int cmpt=0;
        	while(i<b)
            {
            	tx1[cmpt]=(int)(((i-a)*d.width)/(b-a));
            	ty1[cmpt]=(int)(((E.valeur(i)-max)*(-d.height))/(max-min));
            	if(loi!=null)
            	{
            		tx2[cmpt]=(int)(((i-a)*d.width)/(b-a));
                	ty2[cmpt]=(int)(((loi.valeur(i)-max)*(-d.height))/(max-min));
            	}
            	cmpt++;
        		i+=(b-a)/pas;
            }
        	g2.drawPolyline(tx1, ty1, 10000);
        	g2.setColor(Color.blue);
        	g2.drawPolyline(tx2, ty2, 10000);
    	}
    }
    Cela marche assez bien sauf dans le cas ou le domaine pour lequel je veux tracer la fonction ne correspond pas au domaine de définition de la fonction que je veux tracer ou qu'il y a des asymptote infinie par exemple pour les fonction ln(x) ou 1/x.

    Je voulais savoir si quelqu'un avait une idée pour gérer ce problème parce que la je bloque totalement.


    Merci d'avance


    Ortholle

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu devrais enrichir ta classe Expression afin qu'elle puisse renvoyer NaN ou infinity. Les constantes sont disponibles dans la classe java.lang.Float.
    Ensuite, dans ton application de dessin, il te suffit de tester l'image d'une valeur à travers l'expression pour savoir si elle existe ou si elle n'est pas affichable (infinity ou NaN).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 31
    Par défaut
    Cool je vais tenter sa mais le problême c'est que ma classe qui calcul le maximum de l'expression le fait par balayage : elle parcours toute l'expression pas a pas (le pas étant fixé a l'avance) donc le NaN vas fonctionné pour la ou elle n'est pas définie mais comment faire pour les assymptote ? En effet ma fonction ne reconnait soit pas que c'est un extremum (il n'y a pas de x tq
    f(x)>f(x+pas) et f(x)>f(x-pas) (resp < ) ) soit elle me renvoit comme extremum un nombre du style 10^15 ce qui rend l'affichage totalement impossible.

    Merci pour l'astuce du NaN en tout cas je vais essayer sa tout de suite !


    Ortholle

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Du coup je ne comprend pas le code :
    Il te renvoie bien l'image de la valeur "i" ? Ce que je t'es suggéré, c'est de faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    E.compute( i );
    if( E.isValidNumber() )
    {
      //on peut utiliser la valeur E.getImage();
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 31
    Par défaut
    Hey,

    désolé pour le temps de réponse quelques petits problèmes avec mon internet !
    J'avais pas penser a sa et effectivement sa marche super bien ... merci beaucoup. Vais continuer a réfléchir a une échelle correcte pour afficher mes assymptotes ;D

    Encore Merci


    Ortholle

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

Discussions similaires

  1. [Débutant] Tracé de fonction
    Par nini94 dans le forum MATLAB
    Réponses: 2
    Dernier message: 17/06/2008, 10h50
  2. [Débutante] Tracé de fonction et coefficients de Fourier
    Par jalila chenoufi dans le forum MATLAB
    Réponses: 1
    Dernier message: 24/02/2008, 12h08
  3. débutant : tracé de fonction
    Par alphanet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/12/2007, 15h49
  4. [gnuplot] tracé en fonction de 3 variables
    Par Manou26 dans le forum Imagerie
    Réponses: 1
    Dernier message: 05/12/2007, 15h15
  5. Tracé en fonction de la résolution
    Par sidjunvik dans le forum OpenGL
    Réponses: 8
    Dernier message: 22/01/2007, 11h00

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