Entwickler-Ecke

Freeware Projekte - Mathematische Plots machen - TyMathPlotter


delfiphan - Mi 09.03.05 03:37
Titel: Mathematische Plots machen - TyMathPlotter
TyMathPlotter
Was dieses Programm tut, steht eigentlich schon im Titel: Es plottet mathematische Ausdrücke wie "x^2" oder "sin(x+1)".
Es war eigentlich als Demo für meinen Parser [http://www.delphi-forum.de/topic_Parser+fuer+mathematische+Ausdruecke+inkl+Var+und+Fkt_36946.html] gedacht, jedoch hab ich das Programm etwas erweitert und benutzerfreundlicher gemacht, sodass es ganz nützlich sein kann!
Die Graphik kann als Vektorgraphik in die Zwischenablage kopiert werden oder als Datei gespeichert werden, um diese beispielsweise ins Word kopieren zu können.

Die Seite ist zur Zeit down, deswegen habe ich die Datei als Anhang angehängt. Die Bilder, etc. kommen wieder.

Download Link:
TyMathPlotter.exe [http://www.tyberis.com/download/TyMathPlotter.exe] (217kb)

Screenshots
user defined image
Beispiel Output
user defined image


Karlson - So 13.03.05 18:35

Gefällt mir sehr gut das Programm.

Bugs habe ich keine gefunden.
Aber ich hätte ein paar Anregungen:

1.) Die Beschriftungen der Achsen sollten standartmäßig kleiner sein, man kann es zwar von Hand umstellen, aber wiegesagt gleich zu beginn fände ich besser.

2.) Du solltest neben der Schriftart des F(X) noch anders darauf aufmerksam machen, dass die Funktion nicht geparst werden kann. Mach doch einfach ein kleines rotes panel neben das Feld oder so, ich hab etwas gebraucht bis ich gemerkt habe warum das Schaubild nicht geplottet wird.

3.) Ich habe keinen Einstellungsmöglichkeit für den <Plot Title> gefunden. Es wäre angenehm durch einfaches draufklicken einen Dialog zum ändern des labelbs zu bekommen.

4.) Du hast auf der Linken seite doch noch Platz. Mach dort doch ein Feld für den aktuellen Graph rein. Also einfach Graph1, seine Funktion und ein feld zum farben ändern. Dann muss man nicht immer erst den Graph auswählen und dann nochmal auf Edit klicken. Das ganze könntest du dann noch mit einem Tabbrowser realisieren.

5.) Es sollten auch die Funktionen gespeichert werden können. Das dürfte auch ziemlich einfach zu realisieren sein, und man kann so später mit den Funktionen weiterarbeiten.

6.) Die Linien der Achsen sollten standartmäßig dünner sein. Wird so imho einfach übersichtlicher.

7.) Es sollte ein ganz feines Grid zu sehen sein. Also so wie z.B. beim Karopapier.

8.) Du lässt unten in der Statusbar zwar die akt. Cursorpos anzeigen, das bringt aber nichts, weil der Cursor viel zu unkenntlich ist und der Fixpunkt nicht erkenntlich ist. Deswegen würde ich entweder den Cursor gleich in ein Kreuz ändern, oder die Einstellungsmöglichkeit oben in die Toolbar aufnehmen.
Alternativ: Durch gedrückthalten der Rechten Maustaste wird der Cursor zur Hand und man kann verschieben.
Der normale Cursor sollte das Kreuz bleiben.

Ansonsten wirklich sehr gut.

ps.: Das speichern als Vektorgraphik ist spitze.


delfiphan - So 13.03.05 18:55

Vielen Dank für deine Kommentare! :D Hatte schon gedacht, dass sich niemand mehr meldet... Den Plot title kannst du mit Edit/Change title ändern (aber nur den Inhalt, nicht die Schriftgrösse usw.).
Das Programm war zuerst noch viel weniger benutzerfreundlich. Da ich es aber unter Freeware Projekte posten wollte, hab ich es noch ein wenig ausgebaut - einige Toolbarknöpfe reingemacht und so. Ich dachte mir, wenn einige Leute das Projekt nützlich finden, mach ich daran weiter, ansonsten lass ich es sein. Ideen wären genug da: Plot aus Werten einer Tabelle erstellen, Reihenfolge der Graphen wählen, Legende der Graphen, Tangenten zeichnen, setzen und beschriften von Punkten, etc..
Mal schauen...


AXMD - So 13.03.05 19:52

Hab Karlsons Beitrag nicht gelesen, kann also sein, dass sich Kommentare überschneiden:

1.) Wenn man den Titel zeichnen lässt sollte der Platz wo der Titel stehen würde als Zeichenfläche genutzt werden

2.) Kann man irgendwo Kantenglättung einstellen?

3.) Die Achsen sind relativ weit von den Rändern entfernt. Kann man das umstellen?

4.) Dass die Funktion sofort gezeichnet wird sobald sie gültig ist finde ich spitze :)

5.) Dass ich bei der Änderung von z.B. MinX Enter drücken muss müsste entweder irgendwo stehen oder auch ohne Enter gehen ;)

6.) Was noch super wäre, wäre die Tatsache, dass dein Parser Dinge wie "2x" als "2*x" lesen kann, aber das ist nicht so schlimm ;)

7.) Wenn man die Funktionen auf einer Listbox o.ä. auswählen könnte wär das u.U. praktikabler als über's Menü

8.) Wie kann ich denn so eine schöne Schwebung erzeugen wie in deinem Bild oben (also die Graphen addieren)?

Super Prog, thumbs up ;)
AXMD


en!gma - So 13.03.05 19:58

sehr schönes programm!
danke kommt wie gerufen :D
bin nämlich grad am facharbeit über integrale schreiben ^^


delfiphan - So 13.03.05 20:14

- Nee, Kantenglättung gibt's leider nur in deinen Programmen ;(
- Die Achsen sind so weit weg, weil dort eben evtl. ne Achsenbeschriftung hin muss. Ich hab da für den Fall, dass dort "10'000" sein kann, vorgesorgt. Ginge halt auch dynamisch.
- Stimmt.. "2x" wird nicht unterstützt, könnte man noch machen. Dann müsst ich "x x" auch als "x^2" durchgehn lassen...
- Dass man bei MinX Enter drücken muss hat seine Gründe: Im Modus "Fixed aspect ratio" muss das Programm wissen, wieviele Felder gesetzt sind, und welche angepasst werden sollen. Es macht eben einen Unterschied, ob 1, 2 oder 3 Felder vorgegeben sind. Stören tut es mich halt auch... :cry:

Ein ausgereiftes Programm braucht eben seine Entwicklungszeit. Ich werd bei Gelegenheit/Lust wieder daran arbeiten.
Vielen Dank für deine Kommentare! :)


AXMD - So 13.03.05 20:17

Darf man fragen wie du das Ding als EMF-File speicherst ;)

AXMD


Karlson - So 13.03.05 20:25

Zitat:

Hab Karlsons Beitrag nicht gelesen, kann also sein, dass sich Kommentare überschneiden:


Na vielen Dank auch. Die Mühe kann man sich doch machen, oder? :?


delfiphan - So 13.03.05 20:29


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Var
 MF : TMetaFile;
 MFC : TMetaFileCanvas;
 W, H : Integer;
begin
 W := PaintBox1.Width;
 H := PaintBox1.Height;

 MF := TMetaFile.Create;
 MF.Inch := Round(W/10/2.54); // 10 cm breit
 MF.Width := W;
 MF.Height := H;
 MFC := TMetaFileCanvas.Create(MF,0);
 PlotGraph(MFC, W, H); // MFC ist ein TCanvas
 MFC.Free;
 if ToClipboard then
  Clipboard.Assign(MF) else // In Zwischenablage
  MF.SaveToFile(FileName); // In Datei
 MF.Free;
end;

Das Schwebungsbild entstand so:
Folgende Funktionen eingeben und einfärben.

Quelltext
1:
2:
3:
4:
5:
f(1)=sin(6*x)
f(2)=sin(7*x)
f(3)=sin(6*x)+sin(7*x)+3
f(4)=+2*cos((6*x-7*x)/2)+3
f(5)=-2*cos((6*x-7*x)/2)+3

Als EMF speichern, zu PDF konvertieren (-> Kantenglättung), Screenshot vom Acrobat Reader.


AXMD - So 13.03.05 20:30

user profile iconKarlson hat folgendes geschrieben:
Zitat:

Hab Karlsons Beitrag nicht gelesen, kann also sein, dass sich Kommentare überschneiden:


Na vielen Dank auch. Die Mühe kann man sich doch machen, oder? :?


Sorry, nimms bitte nicht persönlich, aber ich hatte grade die Zeit nicht. Hab ihn vorhin nur überflogen um zu sehen ob was änhliches drin ist. Tut mir leid ;)

AXMD


en!gma - Mo 14.03.05 11:53

ich seh mal grad, dass wenn ich MinX und MinY auf 0 stelle...
zeigt er unten 2 nullen an...
zwar nicht wirklich ein bug oder sowas...
aber eine würde doch reichen : )
fänd ich zumindest schöner ^^


Dominique - Mo 14.03.05 12:07

KEWL

mein Mathelehrer selig hätte vor Freude Purzelbäume geschlagen :D


delfiphan - Mo 14.03.05 12:44

He danke für eure Kommentare. :):) Werde das Programm weiter ausbauen. Leider hab ich diese Woche Semesterprüfungen, weshalb ich wahrscheinlich nicht mehr dazu komme, daran weiterzuarbeiten. Oder zu mindest nicht sehr lange.
Gruss,
Simon


delfiphan - Fr 18.03.05 17:21

Update
Hab das Programm ein wenig erweitert und einige eurer Vorschläge umgesetzt. So wirklich zu frieden bin ich nicht - aber man könnte jetzt noch ewig dran rumbasteln aber das bringt's nicht wirklich.

Also, hier sind die Neuerungen. Ich zitiere jetzt einfach die umgesetzten Verbesserungsvorschläge.
AXMD.1.) Wenn man den Titel zeichnen lässt sollte der Platz wo der Titel stehen würde als Zeichenfläche genutzt werden
AXMD.5.) Dass ich bei der Änderung von z.B. MinX Enter drücken muss müsste entweder irgendwo stehen oder auch ohne Enter gehen
AXMD.6.) Was noch super wäre, wäre die Tatsache, dass dein Parser Dinge wie "2x" als "2*x" lesen kann, aber das ist nicht so schlimm
AXMD.7.) Wenn man die Funktionen auf einer Listbox o.ä. auswählen könnte wär das u.U. praktikabler als über's Menü
Karlson.1.) Die Beschriftungen der Achsen sollten standartmäßig kleiner sein, man kann es zwar von Hand umstellen, aber wiegesagt gleich zu beginn fände ich besser.
Karlson.2.) Du solltest neben der Schriftart des F(X) noch anders darauf aufmerksam machen, dass die Funktion nicht geparst werden kann.
Karlson.3.) Ich habe keinen Einstellungsmöglichkeit für den <Plot Title> gefunden. Es wäre angenehm durch einfaches draufklicken einen Dialog zum ändern des labelbs zu bekommen.
Karlson.4.) Du hast auf der Linken seite doch noch Platz. Mach dort doch ein Feld für den aktuellen Graph rein.
Karlson.5.) Es sollten auch die Funktionen gespeichert werden können.
Karlson.6.) Die Linien der Achsen sollten standartmäßig dünner sein. Wird so imho einfach übersichtlicher.
Karlson.8.) Du lässt unten in der Statusbar zwar die akt. Cursorpos anzeigen, das bringt aber nichts, weil der Cursor viel zu unkenntlich ist und der Fixpunkt nicht erkenntlich ist.

Download
TyMathPlotter v1.2 [http://www.tyberis.com/download/TyMathPlotter.exe]

Screenshot
user defined image


AXMD - Sa 19.03.05 20:46

Gut. Neue Version, neues Glück ;)

1.) Bei Tick X und Tick Y habe ich Darstellungsfehler (vgl. fehler1.gif Anhang)

2.) Die Ln-Funktion wird leicht fehlerhaft dargestellt (im negativen Bereich ist sie gänzlich undefiniert) - vgl. (zwecks Platzersparnis ;)) auch fehler1.gif

3.) Nett wäre ein Export in einem anderen Grafikformat (zusätzlich, EMF is ja eigentlich nicht schlecht); viell. BMP, da nur die wenigsten Bildbearbeitungsprogramme mit Enhanced Metafiles richtig umgehen können

4.) Dein Parser kennt pi, aber nicht e; außerdem sollte er Pi auch kennen, oder ;)

5.) Die Einstellungen eines Punkts... die Controls in dem Fenster solltest du vielleicht noch etwas besser anordnen - schön untereinander vielleicht ;)

6.) Wenn eine Funktion ins Unendliche geht gibt's strichlierte Linien an den Polstellen. Genial 8)

7.) Haufenweise Einstellungsmöglichkeiten bei den Funktionen - sogar das Intervall, in dem sie angezeigt werden sollen kann man einzeln festlegen - klasse. Fehlt nur noch, dass dein Parser auch mit komplexen Zahlen umgehen kann und entsprechend nette Kurven oder Flächen dann in der komplexen Ebene zeichnet ;)

8.) Unknown variable or constant... wo? ln(x)/(1/(x-ln(1/x)))^e^x. Zudem wird die kurve hier inkorrekt dargestellt (vgl. fehler2.gif)

9.) Vielleicht solltest du die Koordinatenachsen erst nach den Funktionen zeichnen; ich bin es gewohnt, dass man eine Gerade wie x = 0 auch sieht...

10.) Nett wäre vielleicht noch, wenn man Kurven kopieren könnte, wenn man zB zwei vorzeichenverkehrte Funktionen hat, die beide gleich aussehen sollen (Farbe etc.)

11.) Das mit 2x und so weiter geht - super :)

12.) Folgende Funktionen fehlen mir:

- Sinus Hyperbolicus (sinh)
- Cosinus Hyperbolicus (cosh)
- Tangens Hyperbolicus (tanh)
- Integerfunktion (int)
- Modulofunktion (mod)
- Betragsfunktion (abs)
- Signumfunktion (sgn)
- Heavysidefunktion (Sigmafkt.)

und evtl. noch der berühmte DIRAC-Impuls und die GAUSS-Funktion

13.) Nett wäre vielleicht noch, wenn man bei den Funktionen auswählen könnte, ob sie gezeichnet werden sollen oder nicht

14.) Die Darstellung des Arcussinus ist falsch (vgl. fehler3.gif)

15.) Kreise und Ellipsen wären noch cool 8), also Funktionen wie z.B. x^2+y^2

16.) Die Angabe von w*t (Omega*t) anstatt von x bei Sinus- und Cosinusfunktionen wär noch recht brauchbar; denn damit könnte man sehr schön eine Änderung der Winkelgeschwindigkeit zeigen.

Ansonsten: Hut ab! Genial!

AXMD


delfiphan - So 20.03.05 00:26

Huch, da hat ja jemand n paar Bugreports :) Vielen Dank!

Hier meine Kommentare:
1.) Da sollte ein Delta sein, ist Unicode. Liegt wohl an der Schriftart, werd ich korrigieren.
2.) ln ist im negativen Bereich nicht definiert, deswegen kommt da Unsinn... Der senkrechte Strich wär aber nicht nötig...
3.) Okay
4.) Verdammt da ist ein Fehler im Parser. :motz: Danke... Ah da ist er schon, der Bug: Zeile 759 "S[1]" statt "St[1]". Ist gefixt.
5.) Okay
7.) Komplexe Zahlen lassen sich nicht so einfach in Maschinencode realisieren.. Weiss nicht, ob ich das programmieren werde.
8.) Liegt am Bug von 4.)
9.) Okay
10.) Hab ich mir auch gedacht, aber aus Faulheit nicht programmiert. Kommt vielleicht in der nächsten Version
12.) sinh, cosh, tanh waren mal drin bein Parser, aber nicht beim Compiler (das Assembler Zeug gibt halt schon recht viel zu tun). Diese Funktionen sind dabei: abs, sin, cos, tan, cot, arcsin, arccos, arctan, arccot, ln, log, lb, exp, sqrt, sqr, round, trunc, frac, heaviside, sign. Diracdelta lässt sich gar nicht darstellen, Gauss könnte ich noch machen.
13.) Okay
14.) Richtig, werd ich korrigieren!
15.) Parametrisierte Funktionen und Funktionen in Polarkoordinaten gibt's vielleicht in der nächsten Version
16.) Weiss nicht genau, was du hier meinst.

So, nochmals vielen Dank für deine sehr detaillierten Tests! :):)

PS. Irgendwo hat's nen sehr komischen Bug: Manchmal steht in der Statusbar "File" und ich hab keine Ahnung wie das dort hin kommt. Ich bin Schritt für Schritt durchs Programm gegangen und sobald Statusbar.Panels[1].Text := ''; ausgeführt wird, wird "File" angezeigt. Das versteh ich nicht. Und das passiert nur, wenn in der Zeile vorher TreeNode.Text := FuncName + ' = ' + FormulaStr; ausgeführt wird. Kommentiert man das aus, kommt der Bug nicht zum Vorschein. Da muss ein ziemlich übler Memory Fehler drin sein o.ä. (wenn es überhaupt mein Fehler ist)...

//Edit: Die groben Fehler sind korrigiert, nämlich 1.), 2.), 4.), 8.), 14.). (3 Fehler im Parser korrigiert: Konstante e, Funktionen arccos und arcsin)


AXMD - So 20.03.05 09:42

Bei den Funktionen: was ist lb? Wird wahrscheinlich ld (Logarithmus dualis) sein

AXMD


wulfskin - So 20.03.05 12:02

Hallo delfiphan,

auch von mir erstmal Lob: Wirklich ein Klasse Programm!
Ich habe allerdings auch noch ein paar Verbesserungsvorschläge:
  1. Das Kopieren scheint nicht zu funktionieren. Sowohl Adobe Photoshop als auch Paint (stürzt ab) können die Zwischenablage nicht importieren.
  2. Sollte man das Schaubild auch in andere Formate exportieren können (siehe AXMD).
  3. Es wäre schön wenn beim Erstellen von Graphen und Punkten standardmäßig die Bezeichnung und die Farbe eins "höher" gehen würde. Also zum Beispiel nach blau kommt rot und nach f(x) kommt dann g(x). Dann muss man das nicht extra ausfüllen.
  4. Es wäre tool, wenn man Punkte die man erstellt, verbinden könnte. Also sowohl mit geradlinigen Verbindungen als auch mit einer Näherungskurve. Das wäre für mich enorm toll für Physik.
  5. Schön wäre auch ein Intervall: ln(x); [2, 4].
  6. Das Einstellungsfenster braucht kein Vollbildmodus ;)!
  7. Habe gerade noch die tolle Sache mit den Asymptoten gemerkt. Funktioniert leider nicht bei ln(x - 1).
  8. Könnte man auch noch Flächen einzeichnen?
Danke für das tolle Programm!

Gruß Hape!


delfiphan - So 20.03.05 13:33

Hallo Hape!
1. Das ist komisch, bei mir geht's eigentlich. Die Bilder werden als Vektorgraphik gespeicher, und nicht als BMP. Das möcht ich so, damit man Bilder ins Word kopieren kann. Wenn man dann diese Ausdruckt, sieht man keine Pixe.
2. Hmmm. Was denn für Formate? Meiner Meinung nach braucht es nur EMF, allenfalls noch Postscript. Pixelgraphiken nützen einem doch nichts..
3./4./8. Hab ich mir eigentlich alles auch überlegt. Mein "Problem" ist eben, dass ich mein Programm überhaupt nicht nötig hab, ich benütz für meine Graphen immer das kommerzielle Programm MatLab, damit kann ich auch 3D Plots machen und u.s.w.. Mein Programm war als Demo für den Parser gedacht, und ich erweitere das Programm nun immer weiter und weiter... Aber so wie's aussieht gibt es einige, die das Programm sinnvoll finden, deswegen werd ich das auch noch fertig programmieren.
5. Versteh nicht ganz, was du meinst
6. :oops: Oops, das ist ja n ziemlich peinlicher Anfängerfehler lol
7. Asymptoten werden nur gezeichnet, wenn es einen ungeraden Pol ist, d.h. wenn die Funktion von Minus unendlich bis unendlich springt, oder umgekehrt. Bei geraden Polen gibt es keine gestrichelte Linie; bei ln(x+1) existiert nur "die Hälfte" des Pols und deswegen weiss das Programm nicht was tun.

Vielen, vielen Dank für deine Kommentare!!


wulfskin - So 20.03.05 14:11

Hallo,

nett das du so auf unsere Vorschläge eingehst ;)!

1) In Word geht es tatsächlich. Und in MSPaint jetzt auch. War wohl nur zufall!
2) Ich dachte noch an BMP. Aber wenn du sagst, dass es dann pixelig wird, dann ist das natürlich schwachsinnig.
5) Naja ich würde gerne eine Funktion nur in einem Intervall von zb 2 bis 4 Zeichnen. Aber ist jetzt nicht unbedingt notwendig.
6) Kann jedem passieren ;).
7) Alles klar!

Gruß Hape!


delfiphan - So 20.03.05 14:44

Das Intervall kannst du bei den Einstellungen eingeben: Doppelklick auf die Funktion (Links in der Liste).
Format BMP sollte vielleicht doch unterstützt werden, damit man Bilder auch ins Internet stellen kann.
Ich habe das mit den Farben und den Funktionsnamen noch kurz gemacht - die Fenster bei den Einstellungen sind jetzt auch bsDialog.
(Downloadlink im ersten Post)


CK_CK - Fr 03.03.06 18:59

Was ist mit deiner Homepage los?
Ich würde gerne mal den Plotter testen... :P

CK_CK


delfiphan - Fr 03.03.06 19:31

Leider ist meiner Seite zur Zeit down. Sie sollte aber bald wieder online sein.


Dragonclaw - Fr 12.01.07 20:32

Wirklich ein tolles Programm.

Was mich allerdings interessieren würde ist, wie du es schafst, daas man das, was man im Image sieht verschieben kann.


JayK - Sa 13.01.07 00:09

Klasse Plotter :) aber eine kleine Sache stört ein wenig: das Programm startet in der Desktopmitte und bei zwei Monitoren... ist das Fenster genau über die Grenze zwischen dem einen und dem anderen geteilt ;) und wenn dann der Hauptmonitor noch rechts ist, ist nur die Hälfte des Fensters rechts zu sehen und die andere Hälfte ist im Nirvana. Natürlich kann man das Fenster auch immer wieder in die Monitormitte ziehen, aber es nevt etwas ;)