Hallo,
Ich stelle einen Graph wie folgt dar:
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):
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?
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;
}
}
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);
}