我试图将两个变量方程绘制成笛卡尔平面。这是我的问题,在下面的代码中,如果我注释掉一个for循环并让另一个运行,图形的图形(x的负面或正面)是正确的,但如果我同时运行两个循环它们似乎改变每个其他和图表出错了。我已经尝试了for循环的每个组合,向前循环,向后循环,似乎没有解决它。
我注释掉这些循环在类末尾的位置“public class DrawingComponent extends 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 :(得分:0)
如果你注释掉一个循环,那么另一个循环总是以xCoord = 0开始;
如果你运行两个循环,则第二个以当前的xCoord.value
开始看起来你必须设置“xCoord = 0;”在第二个循环之前;