2016-05-08 2 views
0

私は、ユーザが多項式の次数を入力して各項の係数を入力する微分計算機を作成しています。計算機は、結果の微分をアプレットウィンドウに表示し、元の関数のグラフも表示します。Java - JAppletはグラフを描画しません - ピクセルとスケーリングと関連している可能性があります

ここにグラフクラスがあります。

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

ここに派生計算クラスがあります。私は、ユーザー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; 

} 

最後から係数のリストを取得する場合にのみ関連する部分は、これは以前の2つのクラスを組み込んだテストクラスです。

package beta; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JApplet; 
import javax.swing.JOptionPane; 

public class DerivativeCalculatorTest extends JApplet 
{ 
    public void paint(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D)g; 
     setSize(800,800); 

     DerivativeCalculator myDerivCalc = new DerivativeCalculator(); 
     g2.drawString(String.valueOf(myDerivCalc.calc()), 10, 100); 
     g2.drawString(myDerivCalc.getEquation(), 10, 40); 
     g2.drawString(myDerivCalc.getValue(), 10, 70); 

     GraphingCalc myGrapher = new GraphingCalc(); 
     myGrapher.drawAxes(g2); 
     myGrapher.drawFunction(g2, myDerivCalc.getCoeff()); 
    } 

} 

アプレットが実行され、すべての派生情報が正しく表示されますが、関数グラフは正しく描画されません。たとえば、x + 5を入力すると、アプレットは一連の個々の直線を描画しますが、放物線の形でクラスター化されています。

私はグラフを描く方法と関係があるとすぐに思っています。私は実際に長さ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); 
      } 

何が問題ですか?助言がありますか?

+1

1)すぐに役立つようにするには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 2)なぜアプレットをコーディングするのですか?教師がそれを指定している場合は、[CS教師が** Javaアプレットを教えるのを止めるべき理由](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-teaching-java-applets /)を使用します。 3)[Java Plugin support deprecated](http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/)および[プラグインフリーWebへの移動]を参照してください( https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free)。 –

答えて

4

いくつかのポイント:あなたには、いくつかのLine2Dオブジェクトを作成し、それらを描画する必要はありませんラインを描画するための

あなたGraphingCalcクラスべきではないextendsJAppletとも。

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

この方法で、あなたのプログラムは、両方の軸を示し、ダニ:あなたは、単にdrawLineメソッドを呼び出すことができます。また、次数1の多項式の場合は線を描きますが、どういうわけか、多項式を正しく描いていないことが分かります。おそらく、いくつかの計算を修正したいと思うかもしれません。あなたが見ることができるように、これらの係数を持つ次数1の単純な多項式は、次のようにはなりません。

enter image description here 幸運。

関連する問題