绘制方程到笛卡尔平面 [英] Plotting equation to cartesian plane

查看:26
本文介绍了绘制方程到笛卡尔平面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将一个二变量方程绘制到笛卡尔平面上.这是我的问题,在下面的代码中,如果我注释掉一个 for 循环并让另一个运行,则图的图(x 的负侧或正侧)是正确的,但是如果我同时运行两个 for 循环,它们似乎会改变每个其他和图表出来错误.我已经尝试了 for 循环的每一种组合,向前、向后循环,似乎都没有解决问题.

I am trying to plot a two variable equation to a Cartesian plane. Here is my problem, on the code below if I comment out one for loop and let another run, the plot of the graph (the negative or positive sides of x) is correct, but if I run both for loops they seem to alter each other and the graph comes out wrong. I've tried every combination of for loops, looping frontward, backward, nothing seems to solve it.

我注释掉了这些循环在public class DrawingComponent extends JComponent"类末尾的位置,它说//如果每个循环独立运行,这两个循环就可以正常工作"

I commented out the where these loops are at the end of the class "public class DrawingComponent extends JComponent" where it says "// This two loops work fine if each one is run independently"

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] +"
");

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

}

推荐答案

如果你注释掉一个循环,另一个循环总是以 xCoord = 0 开始;

if you comment out one loop the other loop always start with xCoord = 0;

如果你运行两个循环,第二个从当前的 xCoord.value 开始

if you run both loops the second starts with the current xCoord.value

看起来你必须设置xCoord = 0;"在第二个循环之前;

it looks like you have to set "xCoord = 0;" before the second loop;

这篇关于绘制方程到笛卡尔平面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆