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. */publicclassPlanCartesienextends JPanel {privatestaticfinallong serialVersionUID =1L;privatefinaldouble DEFAUT_X_MIN =-5;privatefinaldouble DEFAUT_X_MAX =5;privatefinaldouble DEFAUT_Y_MIN =-5;privatefinaldouble DEFAUT_Y_MAX =5;privatedouble xMin = DEFAUT_X_MIN;privatedouble xMax = DEFAUT_X_MAX;privatedouble yMin = DEFAUT_Y_MIN;privatedouble yMax = DEFAUT_Y_MAX;privateint nbSegmentsPourApproximer =80;private Path2D.Doubleaxes, ligneBrisee, taquetsX, taquetsY;privatedouble a =2.4;privatedouble b =1.1;privatedouble c =0.8;privateint nbRectangles =10;/*** Constructeur qui crée le composant et définit la couleur d'arrière-plan*/publicPlanCartesien(){setBackground(Color.white);}/*** dessine la fonction* @param g Le contexte graphique*/publicvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphics2Dg2d =(Graphics2D) g;//redimensionner les pixels afin qu'ils soivent visiblesdouble 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 */privatevoidcreerApproxCourbe(){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 */privatedoubleevalFonction(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 */publicvoidsetNbSegmentsPourApproximer(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
*/publicvoidrecadrer(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 */publicvoidrecadrerDroite(){for(int i=(int)xMin+1; i<1000; i++){recadrer(xMin+i, xMax+i, yMin+i, yMax+i);}repaint();}