MathPlus - Library mit häufig benötigten Mathefunktionen

    • Offizieller Beitrag

    Mika hat eine neue Datei hinzugefügt:

    Student in Vollzeit, Straßenbahnfahrer in Teilzeit. Skripte für Trainz wenn Motivation da ist...


    "It's always more fun to share with everyone" -Jack Johnson

  • Wenn man die Funktionen aus der Library-Klasse nimmt und statt dessen in eine eigene Static-Class packt, dann braucht es den Member nicht. Dann lassen sich die Methoden mittels "MathPlus.XXX" ansprechen. Auch ist es niemals klug, eine Variable genauso zu schreiben, wie ihren Typ.


    Gut wäre es:

    Code: Member
    MathPlus m_MathPlus;
    int m_iInt;
    string m_sString;
    float m_fFloat;
    bool m_bBool;
    Code: Lokal
    MathPlus mathPlus; (wobei ich bei Referenzen mit einem Unterstrich arbeite: MathPlus _MathPlus)
    int iInt;
    string sString;
    float fFloat;
    bool bBool;

    Das hat mehrere Vorteile. Zum einen erkennt man direkt überall im Script anhand der Schreibweise bereits, welchen Typs eine Variable ist und zum Anderen umgeht man damit etwaige Probleme durch bereits besetzte/zukünftig kommende Schlüsselworte.


    Auch wäre es interessant dazu zuschreiben, welche Genauigkeit die Trigonometrischen Funktionen haben. Welche Methode wurde da verwendet? Ich tippe auf die Taylor-Reihe (liegt nahe, weil auch eine Funktion für Fakultäten mitgeliefert wird). Dabei wäre es cool zu wissen, bis zu welchem Grad man die Polynome angewandt hat.


    Um nochmal auf die Static-Class einzugehen:
    Static classes in Trainz Script werden wenn Sie in einer Library liegen für alle Verweise auf diese Library nur ein mal genutzt. Das bedeutet, es liegt das Objekt einmal im Spiel und wird von allen anderen wieder verwendet. Das erstellen einer neuen Instanz in jedem Script ist sehr uneffizient. Man spart sich dann auch die Referenz auf die gesamte Bibliothek mittels GetLibrary. Einach das Include auf die Datei mit der static-Class verweisen. Die Standard-Math-Klasse von Trainz in "gs.gs" ist da durchaus ein gutes Beispiel.


    Kleiner Fun-Fact:
    Static classes in Trainz können auch als Singleton fungieren. (https://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster))


    PHP ist eine sehr gute Sprache, die an vielen Stellen sehr vereinfacht funktioniert. Sie kann aber auch OOP und bietet zusammen mit ihrer Vereinfachung eine gute Übungssprache, um sich die Begrifflichkeiten wie statische Klassen-/Methoden usw. ohne den ganzen anderen Rest, wie Typen, einmal genauer anzuschauen

    3 Mal editiert, zuletzt von callavsg ()

    • Offizieller Beitrag

    Danke für die Anregung, da hab ich doch glatt die Existenz der Statischen Klassen verdrängt. Die passen hierfür in der Tat viel besser. :)


    Es handelt sich bei den trigonometrischen Funktionen in der Tat um Taylor-Reihen. Über deren Genauigkeit kann ich leider wenig aussagen, da dies komplett nicht mein Fachgebiet ist und ich diese Formeln aus Anleitungen und anderen Informationsstücken Online zusammengearbeitet habe. Die Ergebnisse sollten aber für Trainz ausreichend sein, zumal meines Wissens nach Floats nur 3 oder 4 Nachkommastellen unterstützen.


    Die Fakultäten laufen aber ganz langweilig durch einen for-Loop. Da zieht Trainz bestimmt den Stecker, wenn das Ergebnis größer als 7FFF FFFF wird (oder ist TrainzScript ab T:ANE auch 64 bit?), aber das würde das würde es auch mit Annäherungen. Ich denke, dies reicht für alle in der Spielumgebung sinnvollen Rechnungen auch völlig aus, bevor ich hier einem Computer die Wissenschaftliche Notation aufzwinge und zwei Werte zurückgebe oder gar anfange, was mit Strings zu basteln.



    Greets, Mika

  • Moin Mika,


    danke für die Infos!
    Soweit ich das weiß handelt es sich in TrainzScript um 32 Bit Datentypen. Bedeutet wie gehabt: 1 Bit = Vorzeichen, 8 Bits = Exponent und 23Bits = Mantisse. Also wie gehabt größte Darstellbare Zahl = 10^38 oder eben die kleinste = 10^-45 (circa).


    Die Annahme, es gäbe eine begrenzung von der Anzahl der Nachkommastellen ist dabei etwas unglücklich. Floats werden so betrachtet, wie sie der klassische Taschenrechner darstellt, wenn das Komma zu weit weg wäre, um die Zahl darstellen zu können. Sprich: 1,11111e-5 (für: 1 / 90000). Dabei steht "e-5" für die Position des Kommas bei der Zahl 1,11111 (e-5 => 5 Stellen nach links), also 0,0000111111.

    Das sagt aus, dass die Nachkommastellen jetzt nicht so stark begrenzt sind. Man kann da schon theoretisch sehr genau werden. Schlimmer schlägt dabei die Fließkommagenauigkeit ins Gewicht.


    Bei Loops (while + for) ist in TrainzScript Vorsicht geboten! Trainz kappt alles, was über zwei verschachtelte Loops hinausgeht.

    Dabei ist es egal, ob sich die Loops in mehreren Methoden befinden. Man kann mit etwas Geschick einige Loops so verpacken, dass diese hintereinander ablaufen. Das verursacht aber eine große Mehrrechnerei, weshalb ich dazu hier auch kein Beispiel geben werde.



    Ein weiterer Vorschlag wäre:
    Wozu könnte man in Trainz die trigonometrischen Funktionen denn gebrauchen? Mir fällt bis auf die Positionierung von Objekten keine brauchbare Anwendung ein. Schick wäre es, wenn die Library mit der Zeit um Vektoren erweitert würde. Dann könnte man sehr schön ausrechnen, in welchem Winkel gewisse Objekte zueinander stehen, etc.

    Einmal editiert, zuletzt von callavsg ()

    • Offizieller Beitrag

    Trainz kappt alles, was über zwei verschachtelte Loops hinausgeht.

    Na, da fragt man sich mal wieder, wer sich das ausgedacht hat. Nach Rechenzeit zu killen wäre ja sinnvoll, aber so... Zumal für böse Programmierer ja auch noch ein goto zur Verfügung steht, welches zwar aus vielerlei Hinsicht nicht gut ist, aber zur Not als Loop-Ersatz herhalten kann. Aber in einer Sequenz einen Loop nach dem anderen aufzurufen ist dann wieder erlaubt?



    Wozu könnte man in Trainz die trigonometrischen Funktionen denn gebrauchen? Mir fällt bis auf die Positionierung von Objekten keine brauchbare Anwendung ein. Schick wäre es, wenn die Library mit der Zeit um Vektoren erweitert würde. Dann könnte man sehr schön ausrechnen, in welchem Winkel gewisse Objekte zueinander stehen, etc.

    Ich selber brauche sie im Moment überhaupt nicht. Ich selbst nutze davon hauptsächlich die Rundungsfunktionen und Pow(), welche ich vorher schon häufiger jedes Mal aufgeschrieben hatte, was mich letztendlich dazu brachte, diese Library zu machen, um mir das zu ersparen. Andere Sachen wie die Fakultät nach dem Prinzip "Was könnt ich denn noch einbauen?" entstanden oder die trigonometrischen Funktionen, weil ich auf dem Trainz Entwickler Chat schon von ein paar Leuten gelesen habe, dass sie für irgendwelche Positionen mal nen Sinus haben wollten.


    Was weitere Funktionen für die Library anbelangt, so sind Ergänzungen von anderen Nutzern gerne gesehen, wenn sie sonst dem Schema entsprechen, besonders wenn du als Ersteller selbst eine Verwendung für solche Formeln hättest. Die Stärke einer Library oder Statischen Klasse liegt darin, nur einmal geladen und runtergeladen zu werden, wenn viele Objekte sie nutzen. Wenn das nur wegen einem Führerstand von mir installiert sein muss, gibts keinen echten Vorteil außer einen etwas schöneren Code im Führerstand. :winking_face:

    • Offizieller Beitrag

    Mika hat eine neue Version hinzugefügt:

    Zitat

    V2 is now using a static class which heavily simplifies loading the library. You might need to make a slight change to existing scripts if you get errors.

    • Offizieller Beitrag

    Mika hat eine neue Version hinzugefügt:

    Zitat

    V2 is now using a static class which heavily simplifies loading the library. You might need to make a slight change to existing scripts if you get errors.

    • Offizieller Beitrag

    Wenn existierende Skripte Fehlermeldungen erzeugen, entfernt bitte die Zeile mit "World.GetLibrary(...)" aus der Init und die mit "MathPlus MathPlus;" aus den Variabeldeklerationen.


    Dieses Update wird ab morgen über die DLS verteilt.

    Es wurden keine neuen Funktionen hinzugefügt. Wenn neue Funktionen in Zukunft hinzugefügt werden, wird sich der Lademechanismus nicht ändern und eine Kompatibilität wird bestehen bleiben.


    Wer den Interaktiven Traxxführerstand von mir (Baureihen 186 und 187) von mir nutzt, bitte noch nicht auf die neue MathPlus Version updaten, bis ich die Führerstände mit den entsprechenden Anpassungen versorgt habe :)



    Greets, Mika

    Student in Vollzeit, Straßenbahnfahrer in Teilzeit. Skripte für Trainz wenn Motivation da ist...


    "It's always more fun to share with everyone" -Jack Johnson