Построение графика функций с помощью Java - PullRequest
0 голосов
/ 12 октября 2019

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

Оба метода, перечисленных ниже, делают одно и то же: выведите функцию sin (x) + sin (4x) между 0 и Math.PI. Первый делает это с double[][], хранящим массив пар типа (x, y = f (x)), второй принимает в качестве входных данных саму функцию f и вычисляет массив необходимых координат.

Второй метод работает отлично. Первых нет, и, похоже, проблема с масштабированием изображения. Может кто-нибудь сказать мне, что я делаю не так?

    /** Draws the graphic of a function given a set of points of type (x,y).
     * 
     * @param coordinates A {@code double[][]} such that the {@code i}-th {@code double[]} stores 
     * the pair (x<sub>i</sub>, y<sub>i</sub>).
     */
    public static void drawGraphOfFunction(double[][] coordinates) {
        // Rescales the coordinate system
        int i;
        double minX = Double.MAX_VALUE, minY = Double.MAX_VALUE, maxX = Double.MIN_VALUE, maxY = Double.MIN_VALUE;
        for(i=0 ; i<coordinates.length ; i++)
            {
            minX = coordinates[i][0] < minX ? coordinates[i][0] : minX;
            minY = coordinates[i][1] < minY ? coordinates[i][1] : minY;
            maxX = coordinates[i][0] > maxX ? coordinates[i][0] : maxX;
            maxY = coordinates[i][1] > maxY ? coordinates[i][1] : maxY;
            }
        StdDraw.setYscale(minX, maxX);
        StdDraw.setXscale(minY, maxY);

        // Draw
        for(i=0 ; i<coordinates.length-1 ; i++)         
            StdDraw.line(coordinates[i][0], coordinates[i][1],  coordinates[i+1][0], coordinates[i+1][1]);

    }

    public static void drawGraphOfFunction(Function<Double,Double> f, 
            double minX, double maxX, double minY, double maxY, int n) {
        double[] x = new double[n+1],   y = new double[n+1];
        double xInterval = maxX - minX;

        for(int i=0 ; i<=n ; i++)
            {
            x[i] = minX + xInterval*i/(n+1);
            y[i] = f.apply(x[i]);
            }
        // Rescales the coordinate system
        StdDraw.setXscale(minX, maxX);
        StdDraw.setYscale(minY, maxY);

        // Draw
        for(int i=0 ; i<n ; i++)            
            StdDraw.line(x[i], y[i], x[i+1], y[i+1]);
    }

    public static void main(String[] args) {

        // number of line segments to plot
        int n = 200;
        Function<Double, Double> f = (Double x) -> {        return Math.sin(4*x) + Math.sin(20*x);  };

        double[][] coordinates = new double[n+1][2];
        for(int i=0 ; i<coordinates.length ; i++)
            {
            coordinates[i][0] = Math.PI * i/n;
            coordinates[i][1] = f.apply(Math.PI * i/n);
            }
      drawGraphOfFunction(coordinates, 0, Math.PI, -2, 2);



        drawGraphOfFunction( f,  0, Math.PI,   -2, 2,   n);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...