Mathématique

bernardg49 - 9 sept. 2012 à 12:56
 bernardg49 - 29 sept. 2012 à 20:19
Bonjour

je suis nouveau sur le forum et totalement ignare en java.
J'ai beaucoup programmé en turbo pascal au siècle dernier.

Je suis professeur de mathématiques et je voudrai montrer à quelques élèves de première S comment programmer en langage java !

Je voudrais débuter en créant un programme qui demande les valeurs des 3 nombres a, b et c dans une fenêtre puis qui trace la courbe représentative de la parabole d'équation y = ax^2+bx+c dans une seconde fenêtre.

Je travaille avec netbeans que j'ai découvert ce matin !

Merci d'avance à ceux qui voudront bien m'aider

16 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
9 sept. 2012 à 14:23
Salut,

Normalement, je te dirais d'utiliser JFreeChart, mais j'imagine que tu veux tracer ca dans un JPanel...

LA difficulté vient du fait que l'origine de repère est situé en haut à gauche de l'écran.

Je fais rechercher dans mes sources, il me semble que j'avais fait un truc qui traçait les fonctions, si je le retrouve, ca pourra t'aider.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
9 sept. 2012 à 14:27
Voilà, c'est ici : http://www.javafr.com/codes/REPRESENTATION-GRAPHIQUE-FONCTIONS-OBJETS-GEOMETRIQUES_54053.aspx

En fait, c'est beaucoup plus complet que dans mon souvenir. Tu peux oublier le package parseurmaths qui permet de parser une expression arithmétique.

Par contre, tu peux regarder les classes Outils : http://files.codes-sources.com/fichier.aspx?id=54053&f=src%2ffr%2fjulien%2fgraphique%2fOutils.java

Graphique : http://files.codes-sources.com/fichier.aspx?id=54053&f=src%2ffr%2fjulien%2fgraphique%2fGraphique.java

Et fonction : http://files.codes-sources.com/fichier.aspx?id=54053&f=src%2ffr%2fjulien%2fgraphique%2felement%2ffonction%2fFonction.java

Dans ton cas, tu n'auras pas besoin du parsing, mais sur le principe, c'est pareil sauf que tu as une étape en moins.

Bon courage.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
9 sept. 2012 à 14:29
Ha oui, une dernière remarque : ce code a été développé avec une vraie conception orientée objet, ce n'est pas ce que tu recherches il me semble.

Tu peux tout faire dans un JPanel, pas besoin de toutes ces classes.

Dans mon code l'objet graphique accepte aussi bien les fonctions que les formes, que le quadrillage, etc. Toi, tu ne veux pas en faire autant.
0
j'avais déjà récupéré ton zip mais le problème c'est que je ne sais pas comment l'utiliser avec Eclipe ou Netbeans.
Je voudrais que l'applet ouvre une fenêtre et me demande les valeurs de a, b et c.
puis ensuite qu'il dessine la parabole d'équation f(x)=ax^2+bx+2.

La gestion de la fenêtre n'est pas un problème, je peux m'en débrouiller.
Ce qui me gène c'est la gestion des entrées sorties.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
11 sept. 2012 à 09:24
Tu peux utiliser Des JTextField. Attends, je te fais un code, je te le donne dans un moment.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
11 sept. 2012 à 10:31
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 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));
setLayout(new BorderLayout());
JPanel panelNord = new JPanel();
panelNord.add(a);
panelNord.add(new JLabel("x^2 + "));
panelNord.add(b);
panelNord.add(new JLabel("x + "));
panelNord.add(c);
panelNord.add(new JLabel(" = 0"));
add(panelNord, BorderLayout.NORTH);
panelTrace = new PanelTrace();
panelTrace.setBorder(BorderFactory.createEtchedBorder());
add(panelTrace, BorderLayout.CENTER);
JPanel panelSud = new JPanel();
add(panelSud, BorderLayout.SOUTH);
}

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())
);
repaint();
}
}



}


import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;


public class PanelTrace extends JPanel {

private int a;
private int b;
private int c;

public PanelTrace(){
super();
}

public void dessiner(int a, int b, int c){
this.a=a;
this.b=b;
this.c=c;
repaint();
}

@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);
}

}


Voilà, si tu fais un mix de ca et du code que tu as récupéré, tu devrais t'en sortir.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
11 sept. 2012 à 10:51
Et pour tester :

import javax.swing.JFrame;


public class Lanceur {

/**
 * @param args
 */
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.setLocationRelativeTo(null);
f.add(new PanelPrincipal());
f.setVisible(true);
}

}
0
Superbe, c'est exactement ce que j'attendais.
Il ne me reste plus qu'à modifier ce projet pour l'adapter aux exercices que je compte faire.
Il fonctionne parfaitement avec Eclipse, seulement lorsque je veux créer un exécutable .jar, il m'annonce des erreurs mais crée tout de même l'exécutable qui fonctionne.

Avec NetBeans, l'exécution me donne un message d'erreur que je ne comprends pas
: " one or more projects were compiled with errors. application you are running may end un expectedly".

L'éxécution se déroule ensuite correctement.

Merci pour cette réponse rapide
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
13 sept. 2012 à 08:36
Tu as essayé de lancer manuellement ton programme pour voir si tu ne récupérais pas une trace ?

java -jar C:\monProgramme.jar
0
j'ai lancé le programme manuellement et il fonctionne correctement.

Une autre question que je me pose, c'est comment définir et tracer une fonction affine par morceaux.
Avec d'autres langages (calculatrice ou Xcas ) j'utilise les booléen par exemple :

f(x) = (2x+3)(0<x<2)+(3x-2)(x>2)

peux-t-on faire une telle chose en java ?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
18 sept. 2012 à 09:12
Salut,

Alors, je ne sais pas comment tu traces ta courbe, mais je pense que tu n'as pas besoin de faire de test :
for(int i=0; i2
}
0
Cette méthode ne me convient pas car je veux tracer plusieurs fonctions affines par morceaux puis calculer leur somme.
Je connais les bornes des intervalle pour chacune des fonctions mais pas les bornes pour la somme. Voilà ce que je fais avec Xcas :

alcool():={
coef:=-0.15;
a:=0.18;
b:=0.2;
A(x):=piecewise(x<0,0,x<1,a*x,x<1-a/coef,coef*(x-1)+a,0);
B(x):=piecewise(x<0.5,0,x<1.5,b*(x-0.5),x<1.5-b/coef,coef*(x-1.5)+b,0);
s(x):=A(x)+B(x);
plotfunc(A(x),x=0..10,couleur=bleu);
plotfunc(B(x),x=0..10,couleur=rouge);
plotfunc(s(x),x=0..10,couleur=noir);
}:;
Pour les fonctions A et B je connais les bornes des intervalles. Pour la somme S, je ne connais pas.

L'exemple que tu m'as donné, je l'ai modifié de la manière suivante :

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;


public class PanelTrace extends JPanel {

private int a;
private int b;
private int c;

public PanelTrace(){
super();
}

public void dessiner(int a, int b, int c){
this.a=a;
this.b=b;
this.c=c;
repaint();
}

//Les formules des fonctions :
double h(double x) {return 200-(a*x*x); }
double g(double x) {return 200-(b*x+c); }
double f(double x) {return h(x)+g(x); }
@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,150,400,150);g.drawLine(0,0,0,300);
for (int x = 0; x < getSize().width; x++)
{g.drawLine(x, (int) f(x), x + 1, (int) f(x + 1));}
for (int x = 0; x < getSize().width; x++)
{g.drawLine(x, (int) g(x), x + 1, (int) g(x + 1));}
}

}

}

je peux donc calculer une somme de fonctions et la faire représenter. mais il me manque cette définition par intervalles.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
18 sept. 2012 à 16:20
Dans ce cas, tu peux définir une indicatrice de la manière suivante :

public int indicatrice(double min, double max, double x){
   int res =0;
   if(x>=min && x<max){
      res=1;
   }
   return res;
}


ta fonction devient alors :
f(x) = (2x+3)*indicatrice(0, 2, x)+(3x-2)indicatrice(2, 1000, x)
0
Parfait cette indicatrice résout mon problème. Il ne me reste plus qu'à définir correctement mon paramétrage de fenêtre pour avoir les axes au bon endroit ainsi que les courbes.
Je t'en reparle dans quelques jours.

Grand merci pour ce coup de main.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 sept. 2012 à 08:48
Ok,

a+
0
ç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.
0
Rejoignez-nous