ça y est mon programme fonctionne mais il reste quelques détails dans l'ombre.
je précise le contexte :
Ce programme me trace une courbe d'alcolémie en utilisant des hypothèses simplifiée avec des fonctions affines ou linéaires pour des élèves de seconde.
J'indique au maximum 4 heures d'absorption d'alcool avec à côté la quantité en centigrammes d'alcool ingérée.
Exemple :
heure 0 , 30 cg ( heure de début )
heure 15, 25 cg ( 15 minutes après le début )
heure 30, 40 cg ( 30 minutes après le début)
heure 45, 40 cg ( 45 minutes après le début)
J'entre les données et simultanément la courbe se trace.
Je regarde combien de temps il faut attendre pour avoir un taux qui redescend au dessous de 0,5g.
Voila mon PanelTrace :
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class PanelTrace extends JPanel {
private double a;
private double b;
private double c;
private double d;
private double aa;
private double bb;
private double cc;
private double dd;
private double coeff= 0.1;
public PanelTrace(){
super();
}
public void dessiner(double a, double b, double c,double d,double aa, double bb, double cc, double dd){
this.a=a;
this.b=b;
this.c=c;
this.d=d;
this.aa=aa;
this.bb=bb;
this.cc=cc;
this.dd=dd;
repaint();
}
public int indicatrice(double min, double max, double x){
int res =0;
if(x>=min && x<max){
res=1;
}
return res;
}
//La formule de ta courbe :
double h1(double x) {return 2*(a/100)*(x-aa/60)*indicatrice(aa/60,aa/60+0.5,x); }
double g1(double x) {return (-coeff*(x-aa/60-0.5)+a/100)*indicatrice(aa/60+0.5,aa/60+0.5+(a/100)/coeff,x)*(a/a); }
double f1(double x) {return 400-100*h1(x/50-1)-100*g1(x/50-1); }
double k1(double x) {return (a/100)*indicatrice(aa/60+0.5,20,x); }
double h2(double x) {return 2*(b/100)*(x-bb/60)*indicatrice(bb/60,bb/60+0.5,x); }
double g2(double x) {return (-coeff*(x-bb/60-0.5)+b/100)*indicatrice(bb/60+0.5,bb/60+0.5+(b/100)/coeff,x)*(b/b); }
double f2(double x) {return 400-100*h2(x/50-1)-100*g2(x/50-1); }
double k2(double x) {return (b/100)*indicatrice(bb/60+0.5,20,x); }
double h3(double x) {return 2*(c/100)*(x-cc/60)*indicatrice(cc/60,cc/60+0.5,x); }
double g3(double x) {return (-coeff*(x-cc/60-0.5)+c/100)*indicatrice(cc/60+0.5,cc/60+0.5+(c/100)/coeff,x)*(c/c); }
double f3(double x) {return 400-100*h3(x/50-1)-100*g3(x/50-1); }
double k3(double x) {return (c/100)*indicatrice(cc/60+0.5,20,x); }
double h4(double x) {return 2*(d/100)*(x-dd/60)*indicatrice(dd/60,dd/60+0.5,x); }
double g4(double x) {return (-coeff*(x-dd/60-0.5)+d/100)*indicatrice(dd/60+0.5,dd/60+0.5+(d/100)/coeff,x)*(d/d); }
double f4(double x) {return 400-100*h4(x/50-1)-100*g4(x/50-1); }
double k4(double x) {return (d/100)*indicatrice(dd/60+0.5,20,x); }
double g(double x) {return (-coeff*(x-aa/60-0.5)*indicatrice(aa/60+0.5,20,x)*(a/a)); }
double h(double x) {return h1(x)+h2(x)+h3(x)+h4(x)+k1(x)+k2(x)+k3(x)+k4(x)+g(x);}
double f(double x) {return 400-100*(h1(x/50-1)+h2(x/50-1)+h3(x/50-1)+h4(x/50-1)+k1(x/50-1)+k2(x/50-1)+k3(x/50-1)+k4(x/50-1)+g(x/50-1)); }
@Override
public void paintComponent(Graphics g){
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.BLACK);
//g.drawString(a+"x^2 + "+b+"x + "+c, 10, 40);
g.drawLine(0,400,600,400);
for (int x = 1; x < 15; x++) {g.drawLine(50*x, 398, 50*x, 402);g.drawString(x+" ", 50*x+45, 420); }
g.drawLine(50,0,50,500);
for (int x = 0; x < 4; x++) {g.drawLine(48,100*x, 52, 100*x);g.drawString(x+" ", 40, 405-100*x);}
g.drawLine(50,350, getSize().width, 350);g.drawString("0,5", 30, 350);
//for (int x = 0; x < getSize().width; x++) {g.drawLine(x, (int) f1(x), x + 1, (int) f1((x+1)));}
//for (int x = 0; x < getSize().width; x++) {g.drawLine(x, (int) f2(x), x + 1, (int) f2((x+1)));}
//for (int x = 0; x < getSize().width; x++) {g.drawLine(x, (int) f3(x), x + 1, (int) f3((x+1)));}
//for (int x = 0; x < getSize().width; x++) {g.drawLine(x, (int) f4(x), x + 1, (int) f4((x+1)));}
for (int x = 0; x < getSize().width; x++) {
if (h(x/50-1)>=0) {g.drawLine(x, (int) f(x), x + 1, (int) f((x+1)));};
}
//for (int x = 0; x < getSize().width; x++) {g.drawLine(x, (int) g1(x), x + 1, (int) g1((x+1)));}
}
}
Pas de problème ici, c'est un peu long avec beaucoup de fonctions mais cela m'a servi à tester beaucoup de choses. Il restera à simplifier.
Voici mon PanelPrincipal :
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
public class PanelPrincipal extends JPanel implements CaretListener {
private JTextField a;
private JTextField b;
private JTextField c;
private JTextField d;
private JTextField aa;
private JTextField bb;
private JTextField cc;
private JTextField dd;
private PanelTrace panelTrace;
public PanelPrincipal(){
a = new JTextField("0");
a.addCaretListener(this);
a.setPreferredSize(new Dimension(40, 20));
b = new JTextField("0");
b.addCaretListener(this);
b.setPreferredSize(new Dimension(40, 20));
c = new JTextField("0");
c.addCaretListener(this);
c.setPreferredSize(new Dimension(40, 20));
d = new JTextField("0");
d.addCaretListener(this);
d.setPreferredSize(new Dimension(40, 20));
aa = new JTextField("0");
aa.addCaretListener(this);
aa.setPreferredSize(new Dimension(40, 20));
bb = new JTextField("0");
bb.addCaretListener(this);
bb.setPreferredSize(new Dimension(40, 20));
cc = new JTextField("0");
cc.addCaretListener(this);
cc.setPreferredSize(new Dimension(40, 20));
dd = new JTextField("0");
dd.addCaretListener(this);
dd.setPreferredSize(new Dimension(40, 20));
setLayout(new BorderLayout());
JPanel panelNord= new JPanel();
//setLayout(new GridLayout(2,2));
//JPanel panelNord = new JPanel(new GridLayout(2,1));
panelNord.add(new JLabel("heure (minutes)"));
panelNord.add(aa);
panelNord.add(new JLabel("centigrammes"));
panelNord.add(a);
panelNord.add(new JLabel("heure (minutes)"));
panelNord.add(bb);
panelNord.add(new JLabel("centigrammes"));
panelNord.add(b);
add(panelNord, BorderLayout.NORTH);
panelTrace = new PanelTrace();
panelTrace.setBorder(BorderFactory.createEtchedBorder());
add(panelTrace, BorderLayout.CENTER);
JPanel panelSud = new JPanel();
panelSud.add(new JLabel("heure (minutes)"));
panelSud.add(cc);
panelSud.add(new JLabel("centigrammes"));
panelSud.add(c);
panelSud.add(new JLabel("heure (minutes)"));
panelSud.add(dd);
panelSud.add(new JLabel("centigrammes"));
panelSud.add(d);
add(panelSud, BorderLayout.SOUTH);
//JPanel panelOuest = new JPanel();
//panelOuest.setLayout(new GridLayout(2,1)); //2 lignes, 1 col
//panelOuest.add(new JLabel("heure"));
//panelOuest.add(d);
//panelOuest.add(new JLabel("heure"));
//panelOuest.add(dd);
//add(panelOuest, BorderLayout.WEST);
}
public void caretUpdate(CaretEvent arg0) {
if(a.getText().length()>0 && b.getText().length()>0 && c.getText().length()>0){
panelTrace.dessiner(
Integer.parseInt(a.getText()),
Integer.parseInt(b.getText()),
Integer.parseInt(c.getText()),
Integer.parseInt(d.getText()),
Integer.parseInt(aa.getText()),
Integer.parseInt(bb.getText()),
Integer.parseInt(cc.getText()),
Integer.parseInt(dd.getText())
);
repaint();
}
}
}
Là je rencontre deux problèmes :
Premier problème :
j'ai essayé de définir les variable au format double pour entrer les quantités d'alcool en grammes (0,25g au lieu de 25 cg ) mais la commande "Integer.parseInt(a.getText())" me bloque en entier.
Deuxième problème :
Je ne peux pas écrire sur deux lignes dans la panel Nord.
J'ai bien essayé
JPanel panelNord = new JPanel(new GridLayout(2,1));
ou
JPanel panelNord= new JPanel();
setLayout(new GridLayout(2,2));
mais ces deux commandes m'amènent une erreur de compilation.
Je voudrait aussi pouvoir mettre 3 lignes avec deux colonnes dans le panel ouest mais je n'y arrive pas.
Comment peut-on faire ?
Je commence à comprendre un peu le java mais j'ai un peu de difficultés car les exemples que je trouve sur internet ne fonctionne pas la plupart du temps. J'ai trouvé superbe ton aide car je n'ai eu aucun problème pour l'utiliser et cela m'a aidé à démarrer.