Hi,
ich möchte gerne selbst einen Funktionsplotter schreiben. Dabei möchte ich nicht auf eine vorgegebene Lösung zurückgreifen, sondern den Plotter selbst schreiben. Die GUI habe ich schon so gut wie fertig.
Für den Anfang soll der Plotter nur ganzrationale Funktionen und sin cos tan können. Später evtl. gebrochen Rationale Funktionen.
Die Idee ist folgende: der User gibt eine Funktion ein und stellt die Grenzen des zu zeichnenden Bereiches ein (xmin, xman, ymin, ymax).
Nach einigen Eingabeprüfungen wird der eingegebene Funktionsstring dann an eine Methode weitergeleitet die ihn "zerlegt" und so ca. 50 Punkte errechnet die im Intervall ymin bis ymax liegen berechnet.Dann werden mithilfe einem Dreisatz die Werte auf die echte Pixelzahl skaliert. Anschließend wird mit drawPolyline() gezeichnet.
Mein Problem betrifft jetzt die Hauptfunktion, die den Eingabestring so zerlegt, das ich die X-Werte einsetzen kann.Wie wandele ich den Eingabestring am besten so um, das die X-Werte eingesetzt werden können? Das Problem: es müssen natürlich alle mathematischen Rechenregeln beachtet werden. inkl. Klammern.
Also den Inhalt der Methode:
Meine bisherigen Ideen (nach Recherche):
1. Im Eingabestring zB. ^ durch Math.pow() ersetzen und irgendwie die Reihenfolge so vertauschen, dass die Potenz berechnet werden kann.^ steht ja hinter dem Term und Math.pow() muss davor. Danach mit so etwas wie eval() ausrechenen (ich habe gelesen das soll mittels einer Java Script Engine in Java gehen)
Vorteil: evtl. einfach umzusetzen
Nachteil: Vertauschen der Reihenfolge? (Wobei ich nichtmal weiß ob das überhaupt möglich ist), falsche
Ausdrücke/ Anfällig für Fehler denke ich mal
2. Einen Parser für die normale (Infix) Notation schreiben. zB. mittels einer Baumstruktur. Da ich so etwas noch nicht geschrieben habe, weiß ich nicht wie kompliziert das ist.
Vorteile:keine Umwandlungen nötig (wie 3. und 4.)
Nachteile: aufwendig zu schreiben nehme ich an
3. Umwandeln des Terms in umgekehrte Polnische Notation und anschließendes Berechnen. Nach einer Suche bei Wikipedia bin ich auf den: Shunting Yard Algorithmus gestoßen, der genau dafür da ist.
Vorteile: das anschließende Parsen des Strings der in UPN vorliegt ist relativ einfach.
Nachteile: sicherlich noch aufwendiger als 2.
4. Umwandeln des Termes in normale Polnische Notation. Hintergrund: die normalen Java Operatoren verwenden diese Notation soweit ich gelesen habe.
Vorteil: Ein Vertauschen der Reihenfolge wie bei 3. und 1. nötig entfällt.
Nachteile: Ich habe noch keinen Algorithmus gefunden zum direkten Umwandeln in normale Polnische Notation.
Nun die Frage : Was würdet ihr machen
? Ich tendiere zu 2. Was ist am aufwendigsten? Gibt es noch andere einfachere Möglichkeiten?
Viele Grüße
qwert10
ich möchte gerne selbst einen Funktionsplotter schreiben. Dabei möchte ich nicht auf eine vorgegebene Lösung zurückgreifen, sondern den Plotter selbst schreiben. Die GUI habe ich schon so gut wie fertig.
Für den Anfang soll der Plotter nur ganzrationale Funktionen und sin cos tan können. Später evtl. gebrochen Rationale Funktionen.
Die Idee ist folgende: der User gibt eine Funktion ein und stellt die Grenzen des zu zeichnenden Bereiches ein (xmin, xman, ymin, ymax).
Nach einigen Eingabeprüfungen wird der eingegebene Funktionsstring dann an eine Methode weitergeleitet die ihn "zerlegt" und so ca. 50 Punkte errechnet die im Intervall ymin bis ymax liegen berechnet.Dann werden mithilfe einem Dreisatz die Werte auf die echte Pixelzahl skaliert. Anschließend wird mit drawPolyline() gezeichnet.
Mein Problem betrifft jetzt die Hauptfunktion, die den Eingabestring so zerlegt, das ich die X-Werte einsetzen kann.Wie wandele ich den Eingabestring am besten so um, das die X-Werte eingesetzt werden können? Das Problem: es müssen natürlich alle mathematischen Rechenregeln beachtet werden. inkl. Klammern.
Also den Inhalt der Methode:
Java:
public void funktionBerechnen(String funktion) {}
Meine bisherigen Ideen (nach Recherche):
1. Im Eingabestring zB. ^ durch Math.pow() ersetzen und irgendwie die Reihenfolge so vertauschen, dass die Potenz berechnet werden kann.^ steht ja hinter dem Term und Math.pow() muss davor. Danach mit so etwas wie eval() ausrechenen (ich habe gelesen das soll mittels einer Java Script Engine in Java gehen)
Vorteil: evtl. einfach umzusetzen
Nachteil: Vertauschen der Reihenfolge? (Wobei ich nichtmal weiß ob das überhaupt möglich ist), falsche
Ausdrücke/ Anfällig für Fehler denke ich mal
2. Einen Parser für die normale (Infix) Notation schreiben. zB. mittels einer Baumstruktur. Da ich so etwas noch nicht geschrieben habe, weiß ich nicht wie kompliziert das ist.
Vorteile:keine Umwandlungen nötig (wie 3. und 4.)
Nachteile: aufwendig zu schreiben nehme ich an
3. Umwandeln des Terms in umgekehrte Polnische Notation und anschließendes Berechnen. Nach einer Suche bei Wikipedia bin ich auf den: Shunting Yard Algorithmus gestoßen, der genau dafür da ist.
Vorteile: das anschließende Parsen des Strings der in UPN vorliegt ist relativ einfach.
Nachteile: sicherlich noch aufwendiger als 2.
4. Umwandeln des Termes in normale Polnische Notation. Hintergrund: die normalen Java Operatoren verwenden diese Notation soweit ich gelesen habe.
Vorteil: Ein Vertauschen der Reihenfolge wie bei 3. und 1. nötig entfällt.
Nachteile: Ich habe noch keinen Algorithmus gefunden zum direkten Umwandeln in normale Polnische Notation.
Nun die Frage : Was würdet ihr machen
Viele Grüße
qwert10