# Suche Javabibliothek zum Zeichnen mathematischer Funktionen



## Mostly_Harmless (31. Jul 2012)

Hallo zusammen,

ich bin auf der Suche nach einer Javabibliothek, mit der sich bequem mathematische Funktionen (2- und 3-dimensionale) zeichnen lassen. Die Bibliothek sollte unter freier Lizenz angeboten werden.

Am liebsten wäre mir, wenn schon eine vordefinierte Schnittstelle für Funktionen existiert, von der sich dann z.B. ein JPanel erstellen lässt, welches ich dann in einem JFrame oder Applet weiterverwenden kann.
Also z.B.:

```
public interface Function {

	double evaluate(double x, double y);
}

public class IrgendeineLib {

	public JPanel drawFunction(Function f) {
		// ...
	}
}
```

Zur Zeit nutze ich dafür JFreeChart, aber da muss man halt die Funktionen selbst an einigen Stellen auswerten und plotten.
Vielleicht kennt hier ja jemand eine gute Alternative, die einfacher zu nutzen ist?


----------



## Marco13 (31. Jul 2012)

Ein http://www.java-forum.org/codeschnipsel-u-projekte/122994-einfacher-funktionsplotter.html reicht dafür wohl nicht. Wie soll das in 3D aussehen? Schon bei 2D gibt es "unendlich viele" Mögliche Anforderungen: Soll man mehrere Funktionen gleichzeitig malen können? Soll man die Linienfarbe- und Dicke auswählen können? Soll man Stützstellen anzeigen können? Zusätzliche Infos und MouseOver-Texte? 
Vermutlich ist die Antwort: "Ja, wenn das alles gehen würde, wäre das gut"  Aber auswendig wüßte ich da nichts


----------



## Fant (31. Jul 2012)

Schau mal hier
Java Surface Plot | Free software downloads at SourceForge.net


----------



## wkt (31. Jul 2012)

Hibsch ! Danke vielmals für den link...


----------



## Mostly_Harmless (1. Aug 2012)

Marco13 hat gesagt.:


> Ein http://www.java-forum.org/codeschnipsel-u-projekte/122994-einfacher-funktionsplotter.html reicht dafür wohl nicht. Wie soll das in 3D aussehen? Schon bei 2D gibt es "unendlich viele" Mögliche Anforderungen: Soll man mehrere Funktionen gleichzeitig malen können? Soll man die Linienfarbe- und Dicke auswählen können? Soll man Stützstellen anzeigen können? Zusätzliche Infos und MouseOver-Texte?
> Vermutlich ist die Antwort: "Ja, wenn das alles gehen würde, wäre das gut"  Aber auswendig wüßte ich da nichts



Sorry, der Funktionsplotter ist schon nicht schlecht, der Funktionsumfang genügt mir aber noch nicht.
Die Darstellung in 3D stell ich mir ungefähr so vor wie bei wolframalpha oder halt der oben genannte Java Surface Plot.
Die Anforderungen werden eigentlich fast alle von JFreeChart erfüllt. Nur muss man da halt die Funktion selbst auswerten und die Stützstellen eintragen; wenn man dann weit genug reinzoomt, sieht man leider die ganzen Ecken und Kanten. Aber vielleicht finde finde ich ja noch eine Möglichkeit über das Rein- und Rauszoomen informiert zu werden. Dann muss ich mir halt selbst ne Funktion basteln, welche die Stützstellen entsprechend genau auswählt.



Fant hat gesagt.:


> Schau mal hier
> Java Surface Plot | Free software downloads at SourceForge.net



Danke, das sieht auf den ersten Blick schon brauchbar aus. Werde ich mir mal genauer anschauen


----------



## Marco13 (1. Aug 2012)

Die Bibliothek wird anscheinend schon eine ganze Weile nicht weiterentwickelt (und wurde sie anscheinend auch nie: Es ist praktisch noch der "initial commit"). 

Eigentlich wäre es mal sinnvoll, sowas für 3D zu entwickeln. Danach wird immer wieder mal gefragt. Tatsächlich hatte ich 2003 sowas mal geschrieben, aber damals noch in C, mit einem eigenen Parser auf Basis einer Stack-Machine und Kommandozeilenbedienung...  (damit konnte man etlichen kranken S***** machen :reflect: ) ... 

Eine Schwierigkeit ganz am Anfang wäre schonmal, dass 2D und 3D schon unterschiedliche Welten sind, und die beiden eigentlich nichts miteinander zu tun hätten. Für 3D würde man wohl schon OpenGL verwenden wollen, weil alles andere immer so nach 1980 aussieht...


----------



## Mostly_Harmless (2. Aug 2012)

Marco13 hat gesagt.:


> Eigentlich wäre es mal sinnvoll, sowas für 3D zu entwickeln. Danach wird immer wieder mal gefragt. Tatsächlich hatte ich 2003 sowas mal geschrieben, aber damals noch in C, mit einem eigenen Parser auf Basis einer Stack-Machine und Kommandozeilenbedienung...  (damit konnte man etlichen kranken S***** machen :reflect: ) ...



Das klingt doch nach einem guten Projekt für das Java-Forum 
In den anderen Projekten tut sich ja nicht (mehr) viel.


----------



## Marco13 (2. Aug 2012)

Ja, in dem Zusammenhang habe ich mir das wieder gedacht: Eigentlich schade, wenn sowas, wo man relativ viel Zeit investiert hat, dann so "untergeht". Aber das jetzt zu portieren wäre wiederum ziemlich aufwändig. Ich habe nochmal über den Quellcode geschaut, und er sieht eigentlich aufgeräumter aus, als ich es auf Basis verschwommener Erinnerungen gedacht hätte, (gut ein paar "magische" Stellen sind auch drin...

```
// possibly print coordinates somewhere at current axis...
                    // (it took a while to figure this out...)

                    if (major%(10*coordFactor[k])==0) {

                        bool shift=((k==(1-(vaZs&1)))||(k==2 && (vaZ&1)==1));
                        if (haveToPrint[k][i][vaX&1] & (0x80>>vaZ)) {

                            switch (k) {
                                case 0: glColor3d(0.9, 0.6, 0.6); break;
                                case 1: glColor3d(0.6, 0.9, 0.6); break;
                                case 2: glColor3d(0.6, 0.6, 0.9); break;
                            }

                            double axisPos[3] = { mat[12], mat[13], mat[14] };
                            for (int m=0; m<3; m++) {
                                for (int n=0; n<3; n++) {
                                    axisPos[m]+=mat[m+(n<<2)]*v[2][n];
                                }
                            }

                            printCoord(axisPos, offset, shift);
                        }
                    }

                    // ...and now it looks sooo easy...
```
... aber insgesamt recht überschaubar), aber die Hauptarbeit damals steckte eigentlich in der StackMachine: Da wollte ich auch noch eigene Funktionen (inklusive Rekursion) definieren können und so... (siehe Anhang) ... 
Das wäre ja ein Teil, der in bezug auf die ursprüngliche Frage unwichtig wäre. Stattdessen ginge es erstmal ums Zeichnen, und da würde von dem alten C-Code nicht mehr viel übrig bleiben...


----------



## Mostly_Harmless (3. Aug 2012)

Naja, was das Zeichnen angeht, werd ich jetzt erstmal bei JFreeChart bleiben.
Hab mir grad nochmal ein paar Beispielbilder auf deren Seite angeschaut und festgestellt, dass man wohl nicht so schnell an diese Qualität rankommt: http://www.jfree.org/jfreechart/images/demo_ring_surface.jpg

Aber wie Du schon sagtest wäre es wirklich schade, wenn die Zeit, welche Du damals in das Projekt investiert hast, jetzt verloren wäre (bis auf den Lerneffekt und den Spaß, den Du hoffentlich dabei hattest  ). Ich glaube, ich fände es auch mal ganz interessant in dieser Richtung selber was zu basteln.


----------



## Marco13 (3. Aug 2012)

Hmja, das sieht schon cool aus. Werd' mir wohl bei Gelgenheit mal ansehen, wie die das gemacht haben - OpenGL ist das ja anscheinend nicht? Ich kannte von JFreeChart bisher in erster Linie die 2D-Charts, hatte aber bei einem Blick in die API auch schon die ganzen "...3D"s gesehen. Warum packen die sowas nicht auf die Samples-Seite? ???:L Stattdessen irgendwelche Balkendiagramme, die man auch mit 20 Zeilen plain Swing hinhacken könnte :bahnhof: WENN man schon so eine mächtige Bibliothek entwickelt, will man doch auch ein bißchen damit angeben ...


----------



## Mostly_Harmless (3. Aug 2012)

Laut diesem Beitrag vom Projektleiter wird wohl nur Graphics2D verwendet.

Warum die ihre Samples nicht etwas überzeugender auswählen, ist mir auch ein Rätsel.
Dafür ist das Geschäftsmodell recht interessant: Die Bibliothek an sich wird unter freier Lizenz angeboten, für ein Developer Guide zahlt man allerdings knapp 60 €


----------



## Marco13 (3. Aug 2012)

Aha, darüber findet man auch einen Link zu Computer Graphics for Java Programmers - Nach sowas (3D mit Java2D) wird immer wieder mal gefragt. (Beim ersten Überfliegen ist der Code zwar nicht "schön", aber die Applets sehen nett aus).


----------

