Мне нужно построить график функции с учетом массива координат. Я нашел библиотеку , которая предоставляет множество инструментов для графических манипуляций, и я доволен ею ... поэтому я попытался использовать ее для создания необходимых мне методов.
Оба метода, перечисленных ниже, делают одно и то же: выведите функцию 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);
}