Wie kann ich in Java eine Kurve aus Punkten zeichnen?

Willibergi

Mitglied
Moin,
ich programmiere grade einen Funktionsplotter und möchte damit Kurven zeichnen.
Bis jetzt mach' ich das so, dass ich die Punkte des Graphen berechne und ganz kurze Linien zeichne.
Funktioniert so ganz gut und ergibt auch eine schöne Kurve.
Aber ich kann mir vorstellen, dass das extrem ineffizient ist, so viele Linien zu zeichnen.
Gibt es nicht irgendeine Möglichkeit ab Werk, eine Kurve zu zeichnen, wenn ich die Punkte habe?
 
Hi,
ich Matlab kenne ich die Funktion polyfit, die aus Punkten im R2 eine Funktion zu bestimmen vermag. Das Verfahren heißt Curve-Fitting.
Vielleicht hilft dir das weiter um ein Pendant in Java zu finden.
 
Du solltest vielleicht nach dem Begriff Interpolation googeln. Denn du hast irgendwelche diskreten Punkte auf einer Kurve und möchtest zwischen diesen Stützpunkten interpolieren. Du kannst nun linear interpolieren (ergibt deine Linien), du kannst mit Polynomen n.ten Grades interpolieren, du kannst Spline-Interpolation verwenden und wahrscheinlich noch ein paar andere nette Sachen das ist ein weites Gebiet der numerischen Mathematik und du findest sicher viel Stoff dazu im Netz.
 
Danke, das hat mich auf jeden Fall schon mal um einiges weitergebracht.
Ich habe mir eine Funktion geschrieben, die mir die Funktionswerte in einem bestimmten Intervall im Abstand n berechnet.
Wenn ich mir die Punkte im Abstand 0.5 berechnen lasse und dazwischen linear interpoliere, sieht das (bei der Funktion e^x) so aus:
fp2.PNG
Das ist natürlich vor allem beim steilen Anstieg noch etwas gehackt.
Wenn ich linear interpolieren wollte, müsste ich den Abstand sehr klein setzen, bei einem Abstand von 0.001 sieht das dann so aus:
fp3.PNG
Das ist annehmbar, allerdings braucht das Programm am Anfang zum Berechnen und Zeichnen einige Sekunden. Das möchte ich verhindern.
Also kommt für mich nur Spline-Interpolation infrage, weil ich dann zwischen zwei Punkten mit bspw. einem Abstand von 1 interpolieren kann.
Der Wikipedia-Artikel verwirrt mich ehrlich gesagt ziemlich.
Soweit ich das verstehe, kann ich durch Interpolation die Punkte zwischen zwei anderen Punkten berechnen, oder? Aber was mache ich dann damit? Wie zeichne ich dann die interpolierte Kurve?
 
Also wenn du schon eine analytische Funktion wie y=e^x hast brauchst du ja nichts zu interpolieren. Du kannst dir ja mit der Funktion jeden beliebeigen Punkt berechnen. Interpolation benötigst du ja nur dann wenn du nur eine bestimmte Anzahl von Werten auf der Kurve hast und du möchtest nun Punkte zwischen zweien solcher Stützwerten berechnen. Falls du Interpolation in der Praxis erleben möchtest schau dir mal das an: http://www.ee.ucl.ac.uk/~mflanaga/java/Interpolation.html
 
Naja, mein Problem ist ja eher, dass ich nicht unendlich viele Punkte berechnen kann.
Ich will aber trotzdem, dass mein Plotter die Funktion schön glatt darstellt.
Wenn ich die Funktionswerte im Abstand von 0,1 berechne und dazwischen eine Linie ziehe, also quasi linear interpoliere, lädt mein Programm am Anfang einige Sekunden.
Das will ich aber verhindern.
Darum hätte ich zwischen zwei Funktionswerten im Abstand von 1 interpoliert.
Oder sollte ich das anders machen?
 
Wieviel DPI hat dein Ausgabegerät denn? 1000000? Ich frage mich eh was du da machst, dass er ein paar Sekunden braucht um eine einfache exponentialfunktion auszurechnen. Da sollte er einige Millionen werte pro Sekunde rechnen können...
 
Wenn du 72 DPI hast und deinen Graf z.B. Auf ein DIN A4 Blatt im Querformat drucken willst, dann Must du 30/2.54*72 werte berechnen. Das ist weiß Gott nicht viel...

Ich gehe aber mal eher davon aus, dass dein Plotter 300 oder gar 600-1200 DPI hat. Wahrscheinlich weist du aber gar nicht was DPI überhaupt bedeutet oder?
 
Beim Bildschirm sind die DPI doch uninteressant. Du weist doch wieviele Pixel das Fenster hat. Wenn du dann für jedes Pixel 2 werte rechnest sollte die Kurve ok ausseheen
 
Ok, das wäre ein Abstand von 0,01 und die Kurve sieht schön rund aus.
Noch eine Frage, ich will jetzt keinen neuen Thread dafür aufmachen:
Wie krieg ich das denn hin, dass, wenn ich das Fenster maximiere, sich das Koordinatensystem auf das ganze Fenster wieder ausbreitet, also repaintet, wenn ich auf Vollbild schalte oder die Größe des Fensters verändere?
 
Ich benutze das AbsoluteLayout, aber ich berechne die Position von den Koordinatenachsen abhängig von der Breite und der Höhe des Fensters und alles andere auch, insofern müsste das doch auch so möglich sein, dass einfach neu gezeichnet wird, nur halt mit der neuen Breite und Höhe, oder?
 
Warum?
Ich würde das gerne so lassen, weil es am einfachsten ist und so auch funktioniert.
Das einzige Problem, das ich noch habe, ist eben, dass das Koordinatensystem sich nicht mit vergrößert.
Da wird es doch irgendein Workaround geben, oder?
Ich will ja nur repainten, wenn die Fenstergröße geändert wird oder das Fenster maximiert wird.
 
Wie kann es funktionieren wenn es nicht funktioniert???

Sorry aber zwei Leute sagen Dir nutze einen Layout Manager (und AbsolteLayout ist kein Layout Manager) und du sagst "Nein, funktniert so ja alles besser" obwohl es nicht funktioniert. Glaubst du nicht da kommen wir uns vielleicht etwas verarscht vor ?
 
Nein, das wollte ich damit gar nicht sagen.
Sorry, wenn das falsch rübergekommen ist.
Was ich sagen wollte:
Es funktioniert alles wunderbar, also die Position, die Zeichnung, usw., das einzige Problem ist eben nur das mit dem Fenster vergrößern.
Ich will halt keine größeren Änderungen mehr vornehmen.
Was müsste ich denn machen für einen LayoutManager?
 
Was für ein LayoutManager wäre denn dafür geeignet?
Prinzipiell habe ich ein JPanel, in dem ich eben zeichne und möchte, dass dieses JPanel immer genauso groß wie das Fenster ist.
Gibt es da vielleicht einen speziellen für?
 
Wenn keine weiteren Komponenten platziert werden sollen, kommen mehrere LayoutManager in Betracht, z.B. FlowLayout oder BorderLayout. Das sind dann aber nicht die LayoutManager für dein Panel, sondern für den Container, in dem du das Panel ablegst.
 

Zurück
Oben