Ошибка обновления графика - JMathPlot - PullRequest
2 голосов
/ 09 февраля 2012

Я использую библиотеку JMathPlot для создания простого графика, в данном случае это 3D, который обновляется для каждой итерации в цикле for. Тем не менее, скорость, с которой он зацикливается, я получаю:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

и

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException

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

import javax.swing.*;
import org.math.plot.*;
import static java.lang.Math.*;
import static org.math.array.DoubleArray.*;

public class GridPlotsExample {

public static void main(String[] args) throws InterruptedException {

    JFrame frame = new JFrame("a plot panel");
    frame.setSize(600, 600);
    frame.setVisible(true);

    // create your PlotPanel (you can use it as a JPanel) with a legend
    // at SOUTH
    Plot3DPanel plot = new Plot3DPanel("SOUTH");

    frame.setContentPane(plot);

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

        // define your data
        double[] x = increment(0.0, 0.1, i); // x = 0.0:0.1:1.0
        double[] y = increment(0.0, 0.05, i);// y = 0.0:0.05:1.0
        double[][] z1 = f1(x, y);
        double[][] z2 = f2(x, y);

        // add grid plot to the PlotPanel
        plot.addGridPlot("z=cos(PI*x)*sin(PI*y)", x, y, z1);
        plot.addGridPlot("z=sin(PI*x)*cos(PI*y)", x, y, z2);

    }

}

// function definition: z=cos(PI*x)*sin(PI*y)
public static double f1(double x, double y) {
    double z = cos(x * PI) * sin(y * PI);
    return z;
}

// grid version of the function
public static double[][] f1(double[] x, double[] y) {
    double[][] z = new double[y.length][x.length];
    for (int i = 0; i < x.length; i++)
        for (int j = 0; j < y.length; j++)
            z[j][i] = f1(x[i], y[j]);
    return z;
}

// another function definition: z=sin(PI*x)*cos(PI*y)
public static double f2(double x, double y) {
    double z = sin(x * PI) * cos(y * PI);
    return z;
}

// grid version of the function
public static double[][] f2(double[] x, double[] y) {
    double[][] z = new double[y.length][x.length];
    for (int i = 0; i < x.length; i++)
        for (int j = 0; j < y.length; j++)
            z[j][i] = f2(x[i], y[j]);
    return z;
}
}

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Если вам нужно просматривать результат после каждого взаимодействия, приостановите поток, пока он находится в конце, для построения другого результата:

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

    // define your data
    double[] x = increment(0.0, 0.1, i); // x = 0.0:0.1:1.0
    double[] y = increment(0.0, 0.05, i);// y = 0.0:0.05:1.0
    double[][] z1 = f1(x, y);
    double[][] z2 = f2(x, y);

    // add grid plot to the PlotPanel
    plot.addGridPlot("z=cos(PI*x)*sin(PI*y)", x, y, z1);
    plot.addGridPlot("z=sin(PI*x)*cos(PI*y)", x, y, z2);

    try {
      // Pause 1 ms
       Thread.sleep(1000);        
    } catch (InterruptedException e) {
      // TODO: handle exception
    }

}
0 голосов
/ 09 февраля 2012

Вы можете переместить 2 оператора кода в цикл for и попробовать его:

for (int i = 1; i < 10; i++) {
    Plot3DPanel plot = new Plot3DPanel("SOUTH");
    frame.setContentPane(plot);

    // define your data
    double[] x = increment(0.0, 0.1, i); // x = 0.0:0.1:1.0
    double[] y = increment(0.0, 0.05, i);// y = 0.0:0.05:1.0
    double[][] z1 = f1(x, y);
    double[][] z2 = f2(x, y);

    // add grid plot to the PlotPanel
    plot.addGridPlot("z=cos(PI*x)*sin(PI*y)", x, y, z1);
    plot.addGridPlot("z=sin(PI*x)*cos(PI*y)", x, y, z2);

}

РЕДАКТИРОВАТЬ: при использовании одного и того же кадра, вы должны использовать стандартный способ обновления его содержимого (аннулировать и проверить).

...