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