2012-05-27 6 views
1

Я пытаюсь построить уравнение с двумя переменными в декартову плоскость. Вот моя проблема, в приведенном ниже коде, если я прокомментирую один из циклов и позволю еще один прогон, график графика (отрицательные или положительные стороны x) правильный, но если я запустил оба цикла, они, похоже, изменят каждый другой, и график выходит неправильно. Я пробовал каждую комбинацию для циклов, зацикливание вперед, назад, ничто, кажется, не решает проблему.Вычисление уравнения для декартовой плоскости

Я закомментировал где эти петли в конце класса «общественного класса DrawingComponent расширяет JComponent», где он говорит: «// Эти две петли работают нормально, если каждый из них работает независимо»

public class GraphingCalc extends JFrame { 

    private static final int FRAME_WIDTH = 450; 
    private static final int FRAME_HEIGHT = 400; 


    private static final double INITIAL_BALANCE = 1000; 

    private JLabel rateLabel; 
    private JTextField rateField; 
    public JButton button ; 
    private JLabel resultLabel; 

    private JPanel basePanel; 
    private JPanel topPanel; // will contain rateLabel, rateField, and buton 
    private JPanel bottomPanel; // will contain drawingComponent 


    JComponent drawingComponent; 

    Rectangle box; 
    ////////////////////////////// 
    Graph graphObj; 
    double xCoord; 
    int yCoord_size; 
    double xRate; 
    double[] yCoord; 
    ////////////////////////////// 

    public GraphingCalc() { 


     createTextField(); 


     drawingComponent = new DrawingComponent();  
     box = new Rectangle(100, 100, 20, 30); 
     graphObj = new Graph(); 
     xCoord = 0; 

     yCoord_size = 400; 
     xRate = 0.101; 

     yCoord = new double[yCoord_size]; 

     createButton(); 

     createPanel(); 

     setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    } 

    private void createTextField() { 

     rateLabel = new JLabel("Equation: "); 

     final int FIELD_WIDTH = 10; 
     rateField = new JTextField(FIELD_WIDTH); 

    } 



public void createButton() { 

     button = new JButton("Plot"); 

     class AddInterestListener implements ActionListener { 

      public void actionPerformed(ActionEvent event) { 

       if(event.getSource() == button) { 

        //System.out.println("Boo"); 
        graphObj.setEq(rateField.getText()); 

       } 
       else { 

       } 

       //yCoord = Arrays.copyOf(graphObj.setY(), 10); 
       yCoord = graphObj.getY(drawingComponent.getSize().width); 

       //for(int i=0; i<10; i++) 
        //System.out.println("yCoord: " + yCoord[i] +"\n"); 

       revalidate(); 
       repaint(); 


      } 
     } 
     ActionListener listener = new AddInterestListener(); 
     button.addActionListener(listener); 
    } 

public class DrawingComponent extends JComponent { 

    public void paintComponent(Graphics g) { 

      ////////////////////////// 
      // int scale 
      // multiply coord values by this 
      // scale 
      ///////////////////////// 
      Graphics2D g2 = (Graphics2D) g; 

      g2.setStroke(new BasicStroke(1f)); 
      //g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

      int drawArea_width = getSize().width; 
      int drawArea_height = getSize().height; 

      ///////////////////// 
      // x axis 
      g2.draw(new Line2D.Double(0, drawArea_height/2, drawArea_width ,drawArea_height/2)); 
      Font font = new Font("Times New Roman", Font.PLAIN, 10); 
      g2.setFont(font); 

      //positive x axis values 

      for(int i = 1; i < 20; i++) { 

       String num = Integer.toString(i); 
       if(i >= 10) { 
        g2.draw(new Line2D.Double((drawArea_width/2 -19) + i*12 , (drawArea_height/2) -2 , (drawArea_width/2 -19) + i*12 , (drawArea_height/2) + 2)); 
        g2.drawString(num, (drawArea_width/2 -22) + i*12 , (drawArea_height/2) + 15); 
       } 

       else { 
        g2.draw(new Line2D.Double((drawArea_width/2) + i*10 , (drawArea_height/2) -2 , (drawArea_width/2) + i*10 , (drawArea_height/2) + 2)); 
        g2.drawString(num, (drawArea_width/2 -1) + i*10 , (drawArea_height/2) + 15); 
       } 
      } 
      // 


      //negative x axis values 
      for(int i = 20; i > 0; i--) { 

       String num = Integer.toString(i); 
       if(i <= 9) { 

        g2.draw(new Line2D.Double((drawArea_width/2) - i*13 , (drawArea_height/2) -2 , (drawArea_width/2) - i*13 , (drawArea_height/2) + 2)); 
        g2.drawString("-" + num, (drawArea_width/2 - 4) - i*15 , (drawArea_height/2) + 15); 
       } 

       else { 

        g2.draw(new Line2D.Double((drawArea_width/2 + 16) - i*15 , (drawArea_height/2) -2 , (drawArea_width/2 + 16) - i*15 , (drawArea_height/2) + 2)); 
        g2.drawString("-" + num, (drawArea_width/2 + 16) - i*17 , (drawArea_height/2) + 15); 
       } 
      } 
      // 


      ////////////////////// 

      //y axis 
      g2.draw(new Line2D.Double(drawArea_width/2, 0, drawArea_width/2, drawArea_height)); 


      g2.setStroke(new BasicStroke(1.20f)); 



      // This two loops work fine if each one is run independently 

      xCoord = 0; 
      for(int i = 0; i < yCoord_size/2 ; i++) { 

       //g2.draw(new Line2D.Double((drawArea_width/2) + xCoord , yCoord[i] + (drawArea_height/2), (drawArea_width/2) + xCoord , yCoord[i] + (drawArea_height/2))); 
       g2.draw(new Ellipse2D.Double((drawArea_width/2) + xCoord , yCoord[i] + (drawArea_height/2), 1, 1)); 
       xCoord-= xRate; 
      } 

      /* 
      for(int i = yCoord_size/2; i < yCoord_size ; i++) { 

       //g2.draw(new Line2D.Double((drawArea_width/2) + xCoord , yCoord[i] + (drawArea_height/2), (drawArea_width/2) + xCoord , yCoord[i] + (drawArea_height/2))); 
       g2.draw(new Ellipse2D.Double((drawArea_width/2) + xCoord , yCoord[i] + (drawArea_height/2), 1, 1)); 
       xCoord+= xRate; 
      } 
      */ 

     }  
} 


    private void createPanel() { 

     basePanel = new JPanel(); 
     topPanel = new JPanel(); 

     basePanel.setLayout(new BorderLayout()); 

     topPanel.add(rateLabel); 
     topPanel.add(rateField); 
     topPanel.add(button); 


     basePanel.add(topPanel, BorderLayout.NORTH); 
     basePanel.add(drawingComponent, BorderLayout.CENTER); 

     add(basePanel);  
    } 
} 




public class Graph { 

    int yCoord_size; 
    double xRate; 
    String equation; 
    double[] yCoord; 
    static double num; 

    public Graph() { 

     yCoord_size = 400; 
     xRate = 0.101; 

     equation = ""; 
     num = 0; 
     yCoord = new double[yCoord_size]; 

     for(int i=0; i <10; i++) 
      yCoord[i] = 0; 
    } 

    public void setEq(String eq) { 

     equation = eq; 

     //System.out.println("eq is: " + eq); 


    } 

    public double equationStrToVal(String eq, double inX){ 

     double total = 0.0; 
     double x = inX; 
     String[] tokens; 
     tokens = eq.split(" "); 

     for(int i=0; i<tokens.length; i++){ 

      if(tokens[i].equalsIgnoreCase("x")){ 

       total+= x; 
      } 

      //addition 
      else if(tokens[i].equals("+")){ 
       if(tokens[i+1].equalsIgnoreCase("x")) 
        total+= x; 
       else 
        total+= stringToDouble(tokens[i+1]); 
       i++; 
      } 

      //multiplication 
      else if(tokens[i].equals("*")){ 
       if(tokens[i+1].equalsIgnoreCase("x")) 
        total*= x; 
       else 
        total*=stringToDouble(tokens[i+1]); 
       i++; 
      } 

      //raised to a power 

     } 

     return total; 
     //System.out.println("The result is: " + total); 
    } 

    public double[] getY(int screen_width) { 

     double j = 0.0; 

     //for(int i=0 ; i < screen_width/2; i++, j-=0.05) 
     for(int i=0 ; i < yCoord_size/2; i++, j-=xRate) 
      yCoord[i] = -1 * equationStrToVal(equation, j); 

     j = 0; 

     //for(int i=screen_width/2 ; i<screen_width ; i++, j+=0.05) 
     for(int i= yCoord_size/2 ; i< yCoord_size ; i++, j+=xRate) 
      yCoord[i] = -1 * equationStrToVal(equation, j);  


     return yCoord; 
    } 

    static double stringToDouble(String num){ 


     return (Double.valueOf(num.trim()).doubleValue()); 

    } 

} 

public class GraphingCalcViewer { 

    public static void main(String[] args) { 

     JFrame frame = new GraphingCalc(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

} 

ответ

0

если вы прокомментируете один цикл, другой цикл всегда начинается с xCoord = 0;

если запустить обе петли второй начинается с текущей xCoord.value

, похоже, вы должны установить «xCoord = 0;» перед вторым циклом;

+0

Отлично, большое вам спасибо, сейчас это работает – user1420482

+0

@ user1420482 Я рад помочь, если смогу –

Смежные вопросы