2016-05-08 4 views
0

Je crée une calculatrice dérivée dans laquelle l'utilisateur entre le degré de son polynôme et entre ensuite les coefficients de chaque terme. La calculatrice affiche la dérivée résultante sur une fenêtre d'applet ainsi qu'un graphique de la fonction d'origine.Java - JApplet ne dessine pas de graphique - Peut être lié aux pixels et à la mise à l'échelle

Voici la classe graphique.

package beta; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 
import java.awt.geom.Point2D; 
import java.util.List; 

import javax.swing.JApplet; 

public class GraphingCalc extends JApplet 
{ 
    public void drawAxes(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D)g; 

     Line2D.Double yaxis = new Line2D.Double(200, 400, 200, 0); 
     Line2D.Double xaxis = new Line2D.Double(0, 200, 400, 200); 
     g2.draw(yaxis); 
     g2.draw(xaxis); 

     for (int i = 0; i<=20; i++) 
     { 
      Line2D.Double ytick = new Line2D.Double(197, 400 - i * 20, 203, 400 - i * 20); 
      Line2D.Double xtick = new Line2D.Double(400 - i * 20, 203, 400 - i * 20, 197); 
      g2.draw(ytick); 
      g2.draw(xtick); 
     } 
    } 

    public void drawFunction(Graphics g, List<Double> l) 
    { 
     Graphics2D g2 = (Graphics2D)g; 

     double x1 = 0; 
     double y1 = 0; 
     double x2 = 0; 
     double y2 = 0; 
     int size = l.size(); 

     for (double x = -10; x <= 10; x += 0.2) 
     { 
      x1 = x; 
      for (int d = size-1; d>=0; d--) 
      { 
       y1 += l.get(d) * Math.pow(x1, d); 
      } 
      Point2D.Double first = new Point2D.Double(20 * x1 + 200, -20 * y1 + 200); 

      x2 = x1 + 0.2; 
      for (int d = size-1; d>=0; d--) 
      { 
       y2 += l.get(d) * Math.pow(x2, d); 
      } 
      Point2D.Double second = new Point2D.Double(20 * x2 + 200, -20 * y2 + 200); 

      Line2D.Double line = new Line2D.Double(first, second); 
      g2.draw(line); 
     } 
    } 
} 

Voici la classe de calcul de dérivée. La seule partie pertinente est quand je reçois la liste des coefficients de l'utilisateur coeffList

package beta; 

import java.math.RoundingMode; 
import java.text.DecimalFormat; 
import java.util.ArrayList; 
import java.util.List; 

public class DerivativeCalculator 
{ 
    public DerivativeCalculator() 
    { 
     String d = JOptionPane.showInputDialog("Enter the degree of your polynomial: "); 
     String v = JOptionPane.showInputDialog("Enter the x value " 
       + "at which you want to take the derivative: "); 

     degree = Integer.parseInt(d); 
     value = Double.parseDouble(v); 

     coeffList = new ArrayList<Double>(); 
     for (int i = 0; i <= degree; i++) 
     { 
      String console = JOptionPane.showInputDialog("Enter the coefficient of the " 
        + "x^" + i + " term."); 
      Double coeff = Double.parseDouble(console); 

      coeffList.add(coeff); 
     } 

    } 
    public double calc() 
    { 
     double dx = 0.00001; 

     double x1 = value; 
     double y1 = 0; 
     for (int d = degree; d >= 0; d--) 
     { 
      y1 += coeffList.get(d) * Math.pow(x1, d); 
     } 

     double x2 = x1 + dx; 
     double y2 = 0; 
     for (int d = degree; d >= 0; d--) 
     { 
      y2 += coeffList.get(d) * Math.pow(x2, d); 
     } 

     double slope = (y2 - y1)/ (x2 - x1); 

     DecimalFormat round = new DecimalFormat("##.##"); 
     round.setRoundingMode(RoundingMode.DOWN); 

     return Double.valueOf(round.format(slope)); 
    } 

    public String getEquation() 
    { 
     String equation = ""; 
     for (int d = degree; d >= 1; d--) 
     { 
      equation = equation + String.valueOf(coeffList.get(d)) + "x^" + String.valueOf(d) + " + "; 
     } 
     equation = equation + String.valueOf(coeffList.get(0)) + "x^" + String.valueOf(0); 
     return equation; 
    } 

    public String getValue() 
    { 
     return String.valueOf(value); 
    } 

    public List<Double> getCoeff() 
    { 
     return coeffList; 
    } 
    private int degree; 
    private double value; 
    private List<Double> coeffList; 

} 

Enfin, c'est la classe de test qui intègre les deux classes précédentes. L'applet s'exécute, affiche correctement toutes les informations de dérivation, mais le graphique de fonction ne dessine pas correctement. Par exemple, lorsque j'indique x + 5, l'applet dessine un ensemble de lignes droites individuelles, mais elles sont regroupées sous la forme d'une parabole.

Je suspecte immédiatement que cela a à voir avec la façon dont je dessine le graphique. En fait, je fais un tas de lignes courtes avec une longueur de 0,2.

for (double x = -10; x <= 10; x += 0.2) 
      { 
       x1 = x; 
       for (int d = size-1; d>=0; d--) 
       { 
        y1 += l.get(d) * Math.pow(x1, d); 
       } 
       Point2D.Double first = new Point2D.Double(20 * x1 + 200, -20 * y1 + 200); 

       x2 = x1 + 0.2; 
       for (int d = size-1; d>=0; d--) 
       { 
        y2 += l.get(d) * Math.pow(x2, d); 
       } 
       Point2D.Double second = new Point2D.Double(20 * x2 + 200, -20 * y2 + 200); 

       Line2D.Double line = new Line2D.Double(first, second); 
       g2.draw(line); 
      } 

Quel est le problème? Aucune suggestion?

+1

1) Pour une meilleure aide plus rapidement, postez un [MCVE] ou [Short, Self Contained, Example correct] (http://www.sscce.org/). 2) Pourquoi coder une applet? Si cela est dû à l'enseignant qui le spécifie, veuillez les référer à [Pourquoi les enseignants du CS devraient ** arrêter ** d'enseigner les applets Java] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-teaching-java-applets /). 3) Voir [Java Plugin support obsolète] (http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/) et [Déplacement vers un site Web sans plug-in] (https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free). –

Répondre

4

Quelques Points:

Votre classe GraphingCalc ne devrait pas extends la JApplet et aussi pour les lignes de dessin que vous n'avez pas besoin de créer des objets Line2D puis les dessiner. Vous pouvez simplement appeler drawLine méthode:

package beta; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.util.List; 

public class GraphingCalc 
{ 
    public void drawAxes(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D)g; 

     g2.drawLine(200, 400, 200, 0); 
     g2.drawLine(0, 200, 400, 200); 

     for (int i = 0; i<=20; i++) 
     { 
      g2.drawLine(197, 400 - i * 20, 203, 400 - i * 20); 
      g2.drawLine(400 - i * 20, 203, 400 - i * 20, 197); 
     } 
    } 

    public void drawFunction(Graphics g, List<Double> l) 
    { 
     Graphics2D g2 = (Graphics2D)g; 

     double x1 = 0; 
     double y1 = 0; 
     double x2 = 0; 
     double y2 = 0; 
     int size = l.size(); 

     for (double x = -10; x <= 10; x += 0.2) 
     { 
      x1 = x; 
      for (int d = size-1; d>=0; d--) 
      { 
       y1 += l.get(d) * Math.pow(x1, d); 
      } 

      x2 = x1 + 0.2; 
      for (int d = size-1; d>=0; d--) 
      { 
       y2 += l.get(d) * Math.pow(x2, d); 
      } 

      g2.drawLine((int)x1, (int)y1, (int)x2, (int)y2); 
     } 
    } 
} 

De cette façon, votre programme montre les deux axes et les tiques. Aussi pour un polynôme de degré 1, il dessine une ligne, mais de toute façon je peux dire qu'il ne dessine pas le polynôme correctement. Peut-être que vous voulez corriger certains calculs. Comme vous pouvez le voir un polynôme simple degré un avec ces coefficients ne doivent pas être ressembler à ceci:

enter image description here Bonne chance.