Darstellung einer Kurve im Koordinatensystem

Status
Nicht offen für weitere Antworten.
H

HolGore

Gast
Hi Leute,

Ich muss ein kleines Darstellungsprogramm für erfasste Messwerte schreiben. Die Messwerte stammen aus Aufnahmen mit mehreren Kanälen. Die einzelnen Dateien mit den Messwerten können aber recht groß(mehrere MB) sein, sodaß meine bisherige Implementierung da einfach zu lahm ist, sobald man etwas darin rumscrollen und zoomen will. Hier mal meine Klasse für das Panel, das das ganze darstellt und meine Bitte um Tips, wie ich die Performance verbessern könnte (ich schätze mal, man kann vielleicht die paintComponent-Methode etwas modifizieren?).

Code:
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JPanel;


public class DarstellungsPanel extends JPanel {
	
	private short[] Daten;
	private int MaxAuspraegung;
	private int StartXwertXachse;
	private int EndeXwertXachse;
	private int YwertXachse;
	private int XwertYachse;
	private int StartYwertYachse;
	private int EndeYwertYachse;
	private int XwertRandbereich;
	private int YwertRandbereich;
	private double ZoomFaktorX;
	private double ZoomFaktorY;
	private RandPanel randPanel;
	private ZeilenPanel zeilenPanel;
	private int Breite;
	private int Hoehe;
	
	public DarstellungsPanel(ZeilenPanel zp, short[] daten, int min, int max, RandPanel randpanel, int breite, int hoehe)
	{
		this.Daten = daten;
		this.setXwertRandbereich();
		this.setYwertRandbereich();
		this.setMaxAuspraegung(min, max);
		this.randPanel = randpanel;
		this.setZoomFaktorX((double)(breite-40)/(double)daten.length);
		this.setZoomFaktorY((double)(hoehe-40)/(double)this.MaxAuspraegung);
		this.randPanel.setZoomfaktorY(this.ZoomFaktorY);
		this.zeilenPanel = zp;
		init();
	}
		
	public void init ()
	{
		this.setZoomFaktorY(this.randPanel.getZoomfaktorY());
		this.Breite = (int)(this.ZoomFaktorX * this.Daten.length) + 45;
		this.Hoehe = (int)(this.MaxAuspraegung*2*this.ZoomFaktorY) + 45;
		this.setPreferredSize(new Dimension(this.Breite, this.Hoehe));
		this.setStartXwertXachse();
		this.setEndeXwertXachse();
		this.setYwertXachse();
		this.setXwertYachse();
		this.setStartYwertYachse();
		this.setEndeYwertYachse();
		this.repaint();
	}
	
	public void paintComponent (Graphics gra)
	{
		gra.clearRect(0, 0, this.getWidth(), this.getHeight());
		
		int sxx = this.StartXwertXachse;
		int exx = this.EndeXwertXachse;
		int yx = this.YwertXachse;
		int xy = this.XwertYachse;
		int syy = this.StartYwertYachse;
		int eyy = this.EndeYwertYachse;
		double zx = this.ZoomFaktorX;
		double zy = this.ZoomFaktorY;
		
		gra.setColor(java.awt.Color.BLACK);
		gra.drawLine(sxx, yx, exx, yx);
		gra.drawLine(xy, syy, xy, eyy);
		
		gra.setColor(java.awt.Color.RED);
 
		for(int i = 0; i < this.Daten.length - 1; i++){
			gra.setColor(java.awt.Color.RED);
			gra.drawLine((int)(sxx+i*zx), (int)(yx-this.Daten[i]*zy), (int)(sxx+(i+1)*zx), (int)(yx-this.Daten[i+1]*zy));
		}
	}
	
	private void setMaxAuspraegung(int min, int max)
	  {
		  if (min < 0)
		  {
			  min = min * (-1); 
		  }
		  if (max < 0)
		  {
			  max = max * (-1); 
		  }
		  if (min > max)
		  {
			  this.MaxAuspraegung = min;
		  }
		  else
		  {
			  this.MaxAuspraegung = max;
		  }
	  }
	
	private void setXwertRandbereich()
	{
		this.XwertRandbereich = 20;
	}
	
	private void setYwertRandbereich()
	{
		this.YwertRandbereich = 20;
	}
	
	private void setStartXwertXachse()
	  {
		  this.StartXwertXachse = this.XwertRandbereich;
	  }
	  
	  private void setEndeXwertXachse()
	  {
		  this.EndeXwertXachse = this.Breite - this.XwertRandbereich;
	  }
	  
	  private void setYwertXachse()
	  {
		  this.YwertXachse = this.Hoehe/2;
	  }
	  
	  private void setXwertYachse()
	  {
		  this.XwertYachse = this.StartXwertXachse;
	  }
	  
	  private void setStartYwertYachse()
	  {
		  this.StartYwertYachse = this.YwertRandbereich;
	  }
	  
	  private void setEndeYwertYachse()
	  {
		  this.EndeYwertYachse = this.Hoehe - this.YwertRandbereich;
	  }

	public double getZoomFaktorX() {
		return this.ZoomFaktorX;
	}

	public void setZoomFaktorX(double zoomFaktorX) {
		this.ZoomFaktorX = zoomFaktorX;
	}

	public double getZoomFaktorY() {
		return this.ZoomFaktorY;
	}

	public void setZoomFaktorY(double zoomFaktorY) {
		this.ZoomFaktorY = zoomFaktorY;
	}

	public int getMaxAuspraegung() {
		return this.MaxAuspraegung;
	}

	public void setMaxAuspraegung(int maxAuspraegung) {
		this.MaxAuspraegung = maxAuspraegung;
	}

	public void setBreite(int breite) {
		this.Breite = breite;
	}

	public void setHoehe(int hoehe) {
		this.Hoehe = hoehe;
	}

	public short[] getDaten() {
		return this.Daten;
	}

	public void setZeilenPanel(ZeilenPanel zeilenPanel) {
		this.zeilenPanel = zeilenPanel;
	}

	public ZeilenPanel getZeilenPanel() {
		return this.zeilenPanel;
	}
	
}
 

Wildcard

Top Contributor
Hast du vorher den Profiler bemüht und bestätigt das die paintComponent das Problem verursacht?
Sind die Daten statisch, oder dynamisch?
Hast du eine Möglichkeit festzustellen welche Daten für den Bildschirmausschnitt relevant sind?
 
H

HolGore

Gast
Wildcard hat gesagt.:
Hast du vorher den Profiler bemüht und bestätigt das die paintComponent das Problem verursacht?
Sind die Daten statisch, oder dynamisch?
Hast du eine Möglichkeit festzustellen welche Daten für den Bildschirmausschnitt relevant sind?

Sorry, aber was ist ein Profiler? Naja jedenfalls bin ich mir sicher, daß es an paintComponent liegt, da der Rest flüssig läuft, wenn ich paintComponent und repaint auskommentiere. Und die das Dateneinlesen und -verarbeiten geht immer recht fix, bzw. schnell genug. Außerdem tritt das Problem erst bei größeren Dateien auf. Die Daten sind statisch. Es handelt sich um fertige Dateien, die von einem Messgerät erzeugt wurden, in denen alle Daten für alle Kanäle stehen. Ein DartstellungsPanel stellt genau einen Kanal dar. Welche Daten für den Bildschirmausschnitt relevant sind, lässt sich feststellen.
 

Wildcard

Top Contributor
Bei statischen Daten bietet es sich an in ein Bild zu zeichnen.
Das Bild dann auf den Screen zu rendern geht wesentlich schneller als die Linien einzeln zu zeichnen.
Am besten ein Compatible Image verwenden um die Hardwarebeschleunigung zu verwenden.
Sollte das nicht möglich sein, versuch deinem Graphics Objekt eine passende Clipping Area zuzuweisen und nur die benötigten Teile zu zeichnen. Hier muss getestet werden, ob der relevante Ausschnitt so viel kleiner ist, das sich die zusätzliche Überprüfung überhaupt lohnt.
 
H

HolGore

Gast
Wildcard hat gesagt.:
Bei statischen Daten bietet es sich an in ein Bild zu zeichnen.
Das Bild dann auf den Screen zu rendern geht wesentlich schneller als die Linien einzeln zu zeichnen.
Am besten ein Compatible Image verwenden um die Hardwarebeschleunigung zu verwenden.
Sollte das nicht möglich sein, versuch deinem Graphics Objekt eine passende Clipping Area zuzuweisen und nur die benötigten Teile zu zeichnen. Hier muss getestet werden, ob der relevante Ausschnitt so viel kleiner ist, das sich die zusätzliche Überprüfung überhaupt lohnt.

Danke für die schnelle Hilfe. Ich habe zwar keine Ahnung, wie das funktioniert, aber ich werde mich mal schlau machen und durchkämpfen.
 

Marco13

Top Contributor
Wenn du nicht im voraus bestimmen kannst oder willst, welche Linien gezeichnet werden müssen, könntest du die Linien in einen GeneralPath legen, und DEN dann zeichnen. Da wird das clipping automatisch gemacht.
Code:
       GeneralPath generalPath = new GeneralPath(GeneralPath.WIND_NON_ZERO, anzahlLinien*2);
        for (alle linien [x0,y0]-[x1,y1])
        {
            generalPath.moveTo(x0, y0);
            generalPath.lineTo(x1, y1);
        }
        g.draw(generalPath);
Das ist von der Umsetzung her ziemlich trivial, kann aber schon einen deutlichen Vorteil bringen!
 
H

HolGore

Gast
Hey Jungs Danke nochmal für die Hilfe. Hab aber inzwischen eine viel einfachere Lösung gefunden. Ich habe einfach drawPolyline anstatt drawLine verwendet. Hier mal meine neue paintComponent-Methode:

Code:
public void paintComponent (Graphics gra)
	{
		gra.clearRect(0, 0, this.getWidth(), this.getHeight());
		
		int sxx = this.StartXwertXachse;
		int exx = this.EndeXwertXachse;
		int yx = this.YwertXachse;
		int xy = this.XwertYachse;
		int syy = this.StartYwertYachse;
		int eyy = this.EndeYwertYachse;
		double zx = this.ZoomFaktorX;
		double zy = this.ZoomFaktorY;
		
		gra.setColor(java.awt.Color.BLACK);
		gra.drawLine(sxx, yx, exx, yx);
		gra.drawLine(xy, syy, xy, eyy);
		
		gra.setColor(java.awt.Color.RED);
		
		int[] xpoints = new int[this.Daten.length];
		int[] ypoints = new int[this.Daten.length];
		
		for(int i = 0; i < this.Daten.length - 1; i++)
		{
			xpoints[i] = (int)(sxx+i*zx);
			ypoints[i] = (int)(yx-this.Daten[i]*zy);
		}
		gra.drawPolyline(xpoints, ypoints, this.Daten.length-1);
	}
 
G

Guest

Gast
Wildcard hat gesagt.:
Können wir ja schlecht wissen das es eine Polyline ist :wink:

Ich dachte das wäre daraus ersichtlich gewesen, daß ich in der Schleife immer 2 Punkte durch eine Linie verbunden habe. Hätte ich wohl besser kommentieren sollen... :oops:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Swing bzgl. Tableskalierung/Darstellung einer Matrix AWT, Swing, JavaFX & SWT 8
E Swing Darstellung einer Zeilenbar AWT, Swing, JavaFX & SWT 6
U Swing Problem bei der Darstellung "komplexer Objecte" in einer JList mit AbstractListModel: AWT, Swing, JavaFX & SWT 3
S LayoutManager Fehlerhafte Darstellung einer Statusleiste/Statusbar AWT, Swing, JavaFX & SWT 6
T Swing Java Darstellung einer Tabelle AWT, Swing, JavaFX & SWT 3
C Fragen zur Darstellung einer JTable mittels Renderer AWT, Swing, JavaFX & SWT 2
C Timer, Darstellung einer Uhr AWT, Swing, JavaFX & SWT 4
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
D Button und Textfeld Darstellung AWT, Swing, JavaFX & SWT 3
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
Y Darstellung und MouseHover bei bestimmten Wörtern in einem String AWT, Swing, JavaFX & SWT 2
J Problem mit Button darstellung AWT, Swing, JavaFX & SWT 23
M Swing JTable, wie erreiche ich folgende Darstellung? AWT, Swing, JavaFX & SWT 10
M AWT LabelArray verschobene Darstellung AWT, Swing, JavaFX & SWT 2
B Transformation und Darstellung von Koordinaten AWT, Swing, JavaFX & SWT 5
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
A Swing Darstellung von JComponents in Swing AWT, Swing, JavaFX & SWT 14
M Swing JTable drucken/Darstellung AWT, Swing, JavaFX & SWT 2
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
Y LayoutManager Keine vollständige Darstellung der Tabelle mit GridBagLayout AWT, Swing, JavaFX & SWT 3
A Darstellung dauert zu lange. Wie rest verzögern? AWT, Swing, JavaFX & SWT 7
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
S Grafische Darstellung von signalen AWT, Swing, JavaFX & SWT 2
S jTable size und Text darstellung AWT, Swing, JavaFX & SWT 2
L SWT Darstellung des Datums in Textfeld? AWT, Swing, JavaFX & SWT 2
M SWT Probleme bei der Darstellung des "&"-Zeichens... AWT, Swing, JavaFX & SWT 3
E Darstellung komplexer Formen, z.B. gebogener Pfeil AWT, Swing, JavaFX & SWT 2
P Problem mit Darstellung von JButton(s) AWT, Swing, JavaFX & SWT 2
D Darstellung in Swing wie HTML? AWT, Swing, JavaFX & SWT 2
R Darstellung von JButton AWT, Swing, JavaFX & SWT 6
G Swing Darstellung JTable AWT, Swing, JavaFX & SWT 2
S Unterschiedliche Darstellung Java 5 und 6 AWT, Swing, JavaFX & SWT 7
B Probleme bei JPanel Darstellung AWT, Swing, JavaFX & SWT 6
M GBL - Darstellung gestreckt? AWT, Swing, JavaFX & SWT 3
P Applet darstellung von Textfeldern Problem AWT, Swing, JavaFX & SWT 3
O JComboBox andere Darstellung des Inhaltes + größe der Auswah AWT, Swing, JavaFX & SWT 11
M Swing mit Gtk - Fehlerhafte Darstellung AWT, Swing, JavaFX & SWT 3
S JTree - Darstellung von Ordnern rückwärts AWT, Swing, JavaFX & SWT 4
T [gelöst] JFrame Grundlagen (Größe und Darstellung) AWT, Swing, JavaFX & SWT 6
G JTable dynamische Darstellung der ankommenden Daten AWT, Swing, JavaFX & SWT 19
G Darstellung von JComboBox AWT, Swing, JavaFX & SWT 14
S Gui Darstellung AWT, Swing, JavaFX & SWT 2
M Komische Sache bei der Darstellung auf einem JPanel AWT, Swing, JavaFX & SWT 5
S Swing Element für Explorer-Fenster darstellung AWT, Swing, JavaFX & SWT 13
P Darstellung eines Graphen AWT, Swing, JavaFX & SWT 2
G keine darstellung in JTable AWT, Swing, JavaFX & SWT 2
A JLabel: Unterschiede zw. JRE 1.3 und 1.5 in der Darstellung AWT, Swing, JavaFX & SWT 3
B Komische Darstellung unter Windows 2000 AWT, Swing, JavaFX & SWT 2
Z Seltsame Darstellung verschachtelter GridBagLayouts AWT, Swing, JavaFX & SWT 2
M SWT Darstellung Linux / Win verschieden? AWT, Swing, JavaFX & SWT 4
P Fehlerhafte Darstellung bei JLabel.setText AWT, Swing, JavaFX & SWT 2
D Wie Darstellung / Layout als Liste AWT, Swing, JavaFX & SWT 2
T darstellung eines polynom 5.grades AWT, Swing, JavaFX & SWT 2
S JTable + Sortieren => Problem bei Darstellung AWT, Swing, JavaFX & SWT 13
U JSlider - Probleme bei der Darstellung AWT, Swing, JavaFX & SWT 3
V jTalbe: Probs bei Icon Darstellung AWT, Swing, JavaFX & SWT 4
Z Empfehlung für solche Darstellung! AWT, Swing, JavaFX & SWT 4
F Darstellung von Tastaturkürzel in JMenuItem AWT, Swing, JavaFX & SWT 13
R Mehrzeilige Darstellung von Spalten in SWING-Tabellen AWT, Swing, JavaFX & SWT 5
M Problem mit JTree-Darstellung AWT, Swing, JavaFX & SWT 5
T Problem mit Darstellung AWT, Swing, JavaFX & SWT 6
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben