Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern

CptK

Bekanntes Mitglied
Hallo,
Ich stelle einen Graph wie folgt dar:
Java:
public void draw(Graphics g, String functionX, String functionY) {
        g.setColor(color);

        if (points.size() < 2)
            return;

        Point2D p = mapPoint(functionX, functionY, points.get(0));

        for (int i = 1; i < points.size(); i++) {
            Point2D q = mapPoint(functionX, functionY, points.get(i));
            g.drawLine(p.x, p.y, q.x, q.y);
            p = q;
       }
}
Damit das Ganze jetzt auch aussieht wie eine Kurve, berechne ich die Y-Werte für x = 0.05, 0.1, 0.15, usw. Dadurch sind das beim Zeichnen viele Berechnungen und das repainten dauert sehr lange, wenn ich zum Beispiel die Achsenskalierung ändere oder wenn ich ein Fadenkreuz benutze (dazu gleich mehr). Gibt es eine Möglichkeit so einen Funktionsgraphen mit weniger Punkten zu zeichnen, sodass es immer noch nach einer schönen Kurve aussieht?

Zudem habe ich folgendes Fadenkreuz (was die meisten Probleme verursacht):
Java:
private Point2D mousePos, mouseDraggedPos;
....
addMouseListener(new MouseAdapter() {
    @Override
    public void mouseReleased(MouseEvent e) {
        mouseDraggedPos = null;
        repaint();
    }
});

addMouseMotionListener(new MouseAdapter() {
    @Override
    public void mouseMoved(MouseEvent e) {
        mousePos = new Point2D(e.getX(), e.getY());
        repaint();
    }

    public void mouseDragged(MouseEvent e) {
        mouseDraggedPos = new Point2D(e.getX(), e.getY());
        repaint();
    }
});
....
super.paintComponent(g);
if (mousePos != null) {
    g.setColor(Color.LIGHT_GRAY);
    g.drawLine(0, mousePos.y, getWidth(), mousePos.y);
    g.drawLine(mousePos.x, 0, mousePos.x, getHeight());
}
if (mouseDraggedPos != null) {
    Graphics2D g1 = (Graphics2D) g;
    g1.setColor(Color.GRAY);
    g1.setStroke(new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[] { 4 }, 0));
    g1.drawLine(mousePos.x, mousePos.y, mouseDraggedPos.x, mouseDraggedPos.y);
    g.drawString(Double.toString(distTwoPoints(mousePos, mouseDraggedPos)), mousePos.x + 10, mousePos.y - 10);
}
Das funktioniert auch wunderbar, solange nicht gleichzeitig noch Graphen auf dem JPanel gezeichnet werden. Also die Frage: Kann ich nur diese paar Linien von dem Fadenkreuz repainten, wenn sie sich verändern, ohne das ganze JPanel repainten zu müssen?
 
Mach das fadenkreuz doch einfach als transparentes Panel welches du auf das andere Panel drauf legst. Dann Must du den Graph gar nicht neu zeichnen Und einfach nur das Panel mit der Maus verschieben

was den Graphen angeht könntest du einfach eine Bezier Kurve zeichnen. Dann brauchst du viel Weniger Punkte berechnen
 
Hättest du ne kurze Erklärung oder nen Link, wie man das mit 2 JPanels übereinander macht?

EDIT: habs schon
 
Zuletzt bearbeitet:

Zurück
Oben