J'ai une fonction avec quatre boutons (les 4 flèches). A l'aide de ces 4 boutons : un déplacement va faire varier la partie visible de gauche à droite et de bas en haut, 1 unité à la fois (j'utilise la méthode "recadrer"). Le composant d'affichage de la courbe doit toujours rester carré et de la même taille, et ne présenter aucune distorsion.
L'apparence de l'application est visible sur l'image :
Ma méthode de recadrerDroite() ne fonctionne pas, y a-t-il un moyen que quelqu'un puisse m'aider, s'il vous plaît ?
/**
* Dessine une fonction en segments avec une forme Path2D
* Il est possible de recadrer la partie visible de la fonction.
*/
public class PlanCartesien extends JPanel {
private static final long serialVersionUID = 1L;
private final double DEFAUT_X_MIN = -5;
private final double DEFAUT_X_MAX = 5;
private final double DEFAUT_Y_MIN = -5;
private final double DEFAUT_Y_MAX = 5;
private double xMin = DEFAUT_X_MIN;
private double xMax = DEFAUT_X_MAX;
private double yMin = DEFAUT_Y_MIN;
private double yMax = DEFAUT_Y_MAX;
private int nbSegmentsPourApproximer = 80;
private Path2D.Double axes, ligneBrisee, taquetsX, taquetsY;
private double a = 2.4;
private double b = 1.1;
private double c = 0.8;
private int nbRectangles = 10;
/**
* Constructeur qui crée le composant et définit la couleur d'arrière-plan
*/
public PlanCartesien() {
setBackground(Color.white);
}
/**
* dessine la fonction
* @param g Le contexte graphique
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
//redimensionner les pixels afin qu'ils soivent visibles
double pixelsParUniteX = getWidth()/(xMax-xMin);
double pixelsParUniteY = getHeight()/(yMax-yMin);
creerAxes();
grilleRepere();
nombresReperes(g2d);
creerApproxCourbe();
}// fin paintComponent
/**
* Creation de l'approximation de la courbe sous la forme d'un Path2D
*/
private void creerApproxCourbe() {
double x, y;
ligneBrisee = new Path2D.Double();
x = xMin;
y = evalFonction(x);
ligneBrisee.moveTo(x, y);
for (int k = 1; k < nbSegmentsPourApproximer + 1; k++) {
x = xMin + k * (xMax - xMin) / nbSegmentsPourApproximer; // on calcule le nouveau x, un peu plus loin,
// où on évaluera la fonction de nouveau
y = evalFonction(x);
ligneBrisee.lineTo(x, y);
} // fin for
}//fin creerApproxCourbe
/**
* Evaluation de la valeur de la fonction en vigueur pour un x donné
*
* @param x Valeur de x
* @return Valeur de la fonction pour ce x, en fonction de la fonction en vigueur
*/
private double evalFonction(double x) {
double y = 0;
y = a*(Math.cos(x)) + b*(Math.sin(x)) + c;
return y;
}//fin evalFonction
/**
* Modifie le nombre de petits segments de droite qui formeront la courbe (nombre
* d'echantillonages)
*
* @param nbSegmentsPourApproximer Le nombre de segments voulus
*/
public void setNbSegmentsPourApproximer(int nbSegmentsPourApproximer) {
this.nbSegmentsPourApproximer = nbSegmentsPourApproximer;
repaint(); //refaire la courbe!
}//fin nbsegement
**
* Permet de modifier les limites entre lesquelles la fonction sera tracée
*
* @param xMin Abcisse minimale visible
* @param xMax Abcisse maximale visible
* @param yMin Ordonnee minimale visible
* @param yMax Ordonnee maximale visible
*/
public void recadrer(double xMin, double xMax, double yMin, double yMax) {
this.xMin = xMin;
this.xMax = xMax;
this.yMin = yMin;
this.yMax = yMax;
repaint();
}
/**
* Permet de modifier les limites entre lesquelles la fonction sera visible lorsqu'elle est déplacée vers la droite
*
* @param xMin Abcisse minimale visible
* @param xMax Abcisse maximale visible
* @param yMin Ordonnee minimale visible
* @param yMax Ordonnee maximale visible
*/
public void recadrerDroite() {
for (int i=(int)xMin+1; i<1000; i++) {
recadrer(xMin+i, xMax+i, yMin+i, yMax+i);
}
repaint();
}