Нарисовать график функции по точкам
Как мне нарисовать график функции по точкам, которые берутся из файла? Проблема в том, что точек две тысячи, и каждый раз, когда я отрисоваю n-ое кол-во точек, то paintComponent() просто перерисовывает JPanel, может быть как-то можно зарисовать какой-то холст, а после сохранить его в виде картинки?
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
public class Field extends JPanel {
Frame frame;
public Field(Frame frame) {
this.frame = frame;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
int i = 0;
while (true) {
if (i == 2001)
i = 0;
int x = frame.coordX.get(i).intValue();
int y = frame.coordY.get(i).intValue();
paintPoint(g, x, y);
i++;
}
}
void paintPoint(Graphics g, int x, int y) {
g.setColor(Color.WHITE);
g.drawOval(x, y, 2, 2);
}
}
public class Frame extends JFrame {
List<Double> coordX = new ArrayList<>();
List<Double> coordY = new ArrayList<>();
private Field field = new Field(this);
public Frame() {
initialFrame();
initialArray();
}
public static void main(String[] args) {
new Frame();
}
private void initialFrame() {
setTitle("Graphics");
setSize(800, 800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(false);
field.setBackground(Color.GRAY);
add(field);
setVisible(true);
}
private void initialArray() {
File file = Path.of("src", "2022-12-14_1A_008_obzor_s_vrsh_10-110_1-8-1.txt").toFile();
try (BufferedReader fileReader = new BufferedReader(new FileReader(file))) {
while (fileReader.ready()) {
String string = fileReader.readLine();
String[] arStrings = string.split(" ");
coordX.add(Double.parseDouble(arStrings[0]) * 10);
coordY.add(Double.parseDouble(arStrings[arStrings.length - 1]) / 10);
}
// String collect = fileReader.lines()
// .collect(Collectors.joining("\n"));
// System.out.println(collect);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Ответы (1 шт):
Автор решения: Waden
→ Ссылка
Необходимо было просто в методе paintPoint() использовать цикл, а не в paintComponent(g)
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
paintPoint(g);
}
void paintPoint(Graphics g) {
g.setColor(Color.WHITE);
for (int i = 0; i < 2001; i++) {
int x = frame.coordX.get(i).intValue();
int y = frame.coordY.get(i).intValue();
g.drawOval(x, y, 2,2);
}
}